初学Android,图形图像之使用SurfaceView(三十九)

news/2024/7/4 1:45:30 标签: android, 图形, layout, callback, encoding, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

SurfaceView支持双缓冲,在实现游戏绘图上面比View更出色

它有几个重要方法

Canvas lockCanvas(): 锁定整个SurfaceView对象,获取该Surface上的Canvas

Canvas lockCanvas(Rect dirty): 锁定SurfaceView上Rect划分的区域,获取该Surface上的Canvas

unlockCanvasAndPost(canvas):  释放绘图,提交所绘制的class="tags" href="/tags/TuXing.html" title=图形>图形


SurfaceView的特性是,class="tags" href="/tags/TuXing.html" title=图形>图形可以覆盖显示,它控制了z轴的显示,后draw的class="tags" href="/tags/TuXing.html" title=图形>图形可以把先draw的class="tags" href="/tags/TuXing.html" title=图形>图形盖住

下面是示例效果


主界面放入一个SurfaceView

class="language-html"><?xml version="1.0" class="tags" href="/tags/ENCODING.html" title=encoding>encoding="utf-8"?>
<LinearLayout xmlns:class="tags" href="/tags/ANDROID.html" title=android>android="http://schemas.class="tags" href="/tags/ANDROID.html" title=android>android.com/apk/res/class="tags" href="/tags/ANDROID.html" title=android>android"
    class="tags" href="/tags/ANDROID.html" title=android>android:class="tags" href="/tags/LAYOUT.html" title=layout>layout_width="fill_parent"
    class="tags" href="/tags/ANDROID.html" title=android>android:class="tags" href="/tags/LAYOUT.html" title=layout>layout_height="fill_parent"
    class="tags" href="/tags/ANDROID.html" title=android>android:orientation="vertical" >

    <SurfaceView
        class="tags" href="/tags/ANDROID.html" title=android>android:id="@+id/show"
        class="tags" href="/tags/ANDROID.html" title=android>android:class="tags" href="/tags/LAYOUT.html" title=layout>layout_width="fill_parent"
        class="tags" href="/tags/ANDROID.html" title=android>android:class="tags" href="/tags/LAYOUT.html" title=layout>layout_height="fill_parent" />
</LinearLayout>


主界面drawclass="tags" href="/tags/TuXing.html" title=图形>图形的代码 

class="language-java">package org.crazyit.image;

import class="tags" href="/tags/ANDROID.html" title=android>android.app.Activity;
import class="tags" href="/tags/ANDROID.html" title=android>android.graphics.Bitmap;
import class="tags" href="/tags/ANDROID.html" title=android>android.graphics.BitmapFactory;
import class="tags" href="/tags/ANDROID.html" title=android>android.graphics.Canvas;
import class="tags" href="/tags/ANDROID.html" title=android>android.graphics.Color;
import class="tags" href="/tags/ANDROID.html" title=android>android.graphics.Paint;
import class="tags" href="/tags/ANDROID.html" title=android>android.graphics.Rect;
import class="tags" href="/tags/ANDROID.html" title=android>android.os.Bundle;
import class="tags" href="/tags/ANDROID.html" title=android>android.view.MotionEvent;
import class="tags" href="/tags/ANDROID.html" title=android>android.view.SurfaceHolder;
import class="tags" href="/tags/ANDROID.html" title=android>android.view.SurfaceHolder.Callback;
import class="tags" href="/tags/ANDROID.html" title=android>android.view.SurfaceView;
import class="tags" href="/tags/ANDROID.html" title=android>android.view.View;
import class="tags" href="/tags/ANDROID.html" title=android>android.view.View.OnTouchListener;

public class SurfaceViewTest extends Activity
{
	// SurfaceHolder负责维护SurfaceView上绘制的内容
	private SurfaceHolder holder;
	private Paint paint;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.class="tags" href="/tags/LAYOUT.html" title=layout>layout.main);
		paint = new Paint();	
		SurfaceView surface = (SurfaceView) findViewById(R.id.show);
		// 初始化SurfaceHolder对象
		holder = surface.getHolder();
		holder.addCallback(new Callback()
		{
			@Override
			public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
				int arg3)
			{
			}

			@Override
			public void surfaceCreated(SurfaceHolder holder)
			{
				// 锁定整个SurfaceView
				Canvas canvas = holder.lockCanvas();
				// 绘制背景
				Bitmap back = BitmapFactory.decodeResource(
					SurfaceViewTest.this.getResources(), R.drawable.sun);
				//绘制背景
				canvas.drawBitmap(back, 0, 0, null);
				// 绘制完成,释放画布,提交修改
				holder.unlockCanvasAndPost(canvas);
				//重新锁一次,"持久化"上次所绘制的内容
				holder.lockCanvas(new Rect(0, 0, 0, 0));
				holder.unlockCanvasAndPost(canvas);
			}

			@Override
			public void surfaceDestroyed(SurfaceHolder holder)
			{
			}
		});
		//为surface的触摸事件绑定监听器
		surface.setOnTouchListener(new OnTouchListener()
		{
			@Override
			public boolean onTouch(View source, MotionEvent event)
			{
				// 只处理按下事件
				if (event.getAction() == MotionEvent.ACTION_DOWN)
				{
					int cx = (int) event.getX();
					int cy = (int) event.getY();
					// 锁定SurfaceView的局部区域,只更新局部内容
					Canvas canvas = holder.lockCanvas(new Rect(cx - 50,
						cy - 50, cx + 50, cy + 50));
					// 保存canvas的当前状态
					canvas.save();
					// 旋转画布
					canvas.rotate(30, cx, cy);
					paint.setColor(Color.RED);
					// 绘制红色方块
					canvas.drawRect(cx - 40, cy - 40, cx, cy, paint);
					// 恢复Canvas之前的保存状态
					canvas.restore();
					paint.setColor(Color.GREEN);
					// 绘制绿色方块
					canvas.drawRect(cx, cy, cx + 40, cy + 40, paint);
					// 绘制完成,释放画布,提交修改
					holder.unlockCanvasAndPost(canvas);
				}
				return false;
			}
		});
	}
}




http://www.niftyadmin.cn/n/1411353.html

相关文章

面向万物互联的时序数据库HiTSDB

现在填写调查问卷&#xff0c;将优先获得公测资格 当前物联网的浪潮席卷全球&#xff0c;甚至于人们还没有真正意识到物联网的存在&#xff0c;但它已经无处不在 。个人智能手环&#xff0c;家庭里使用的智能空调&#xff0c;空气净化器&#xff0c;电饭煲&#xff0c;到社会化…

初学Android,图形图像之使用SurfaceView(四十)

SurfaceView跟View最大的不同就是&#xff0c;它可以局部更新Canvas&#xff0c;而不用像View一样&#xff0c;重绘整个画面 并且View的绘图必须在当前的UI线程中进行,当需要花较长时间更新绘图时&#xff0c;主UI线程就会阻塞&#xff0c;无法响应用户操作&#xff0c;而Surfa…

react-router-dom示例讲解(8)侧边栏

在react-router-dom的官方示例中&#xff0c;侧边栏是非常容易实现的一个示例&#xff0c;奇实现的核心就是展示两组Routes。 本示例的效果图如下&#xff1a; 相关的核心代码&#xff1a; import React, {Component} from react; import {BrowserRouter as Router,Route,…

BootStrap 概念

网格系统中的缩写; xs extra small sm smal md middle/medium lg large

初学Android,数据存储之SharedPreferences(四十一)

有时候&#xff0c;应用程序有少量数据需要保存&#xff0c;比如说是否使用振动&#xff0c;是否打开GPS等设置&#xff0c;对于这些小数据量的需求&#xff0c;没有必要使用数据库 Android提供了SharedPreferences接口&#xff0c;它用来读取程序的Preferences数据&#xff0c…

react-router-dom示例讲解(9)模糊匹配

react-router-dom的官方示例中&#xff0c;模糊匹配是比较简单的一个示例。 效果图如下&#xff1a; 在App.js中&#xff1a; import React, {Component} from react; import {BrowserRouter as Router,Route,Link,Switch,Redirect } from react-router-dom;const routes …

初学Android,数据存储之File存储(四十二)

Android提供了如下两个方法来打开本应用程序的数据文件夹里的文件IO流 openFileInput(String name) openFileOutput(String name) 打开应用程序的数据文件夹下的name文件对应输入/输出流 下面是一个示例界面代码package WangLi.IO.FileTest;import java.io.FileInputStream; im…

初学Android,数据存储之读写SD卡文件(四十三)

读写SD卡上的文件有几个步骤 1.调用Environment的getExternalStorageState() 方法判断手机上是否插入了SD卡&#xff0c;并且应用程序具有读写权限如使用如下代码//如果手机已插入SD卡,且应用程序具有读写SD卡的能力,下面语句返回trueEnvironment.getExternalstorageState().e…