SurfaceView之SurfaceHolder

SurfaceView之SurfaceHolderpackagecom.example.clipdrawabledemo;importandroid.app.Activity;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.graphics.Canvas;importandroid.graphics.Color

SurfaceView之SurfaceHolder"

package com.example.clipdrawabledemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
/*
 * 使用SurfaceView实现动画
 * 自定义view来进行绘图存在如下缺陷:
 * 1、View缺乏双缓冲机制
 * 2、当程序需要更新View上的图像是,程序必须重绘View上显示的整张图片
 * 3、新线程无法直接更新View组件
 * 由于View存在上述缺陷,所以通过自定义View来实现绘图,尤其是游戏中的绘图是性能并不好。
 * Android提供了一个SurfaceView来代替View,在实现游戏绘图方面,SurfaceView比View更加
 * 出色,因此一般推荐使用SurfaceView。
 * SurfaceView一般会与SurfaceHolder结合使用,SurfaceHolder用于向与之关联的SurfaceView
 * 上绘图,调用SurfaceView的getHolder()即可获取SurfaceView关联的SurfaceHolder
 * SurfaceHolder提供了如下方法来获取Canvas对象:
 * Canvas LockCanvas():锁定整个SurfaceView对象,获取改Surface上的Canvas
 * Canvas lockCanvas(Rect dirty):锁定SurfaceView上的Rect划分的区域,获取改Surface上的Canvas
 * 当对同一个SurfaceView调用上面两个方法是,两个所返回的是同一个Canvas对象。
 * 当当程序调用第二个方法获取指定区域的Canvas是,SurfaceView只能对Rect所“圈”出来的区域
 * 进行更新,通过这种方式可以提高画面的更新速度
 * 当通过lockCanvas()获取制定了SurfaceView上的Canvas之后,接下来程序就可以调用Canvas进行绘图了
 * Canvas绘图完成后通过如下方法释放绘图、提交所绘制的图形:
 * unlockCanvasAndPost(canvas);
 * 需要指出的是当调用SurfaceHolder的unlockCanvasAndPost方法之后,该方法之前所绘制的图形还处于
 * 缓冲之中,下一次lockCanvas()方法锁定的区域可能会“遮挡”它。
 * 
 * 
 */
public class SurfaceViewTest extends Activity {

	private SurfaceHolder holder;
	private Paint paint;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);//没标题
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
		setContentView(R.layout.surfaceview_layout);
		paint=new Paint();
		//获取SurfaceView对象
		SurfaceView surface=(SurfaceView) findViewById(R.id.surfaceView1);
		//获取SurfaceView对象的SurfaceHolder对象
		holder=surface.getHolder();
		//SurfaceHolder的回调方法
		holder.addCallback(new Callback(){

			//当SurfaceHolder的格式或大小发生改变的时候调用
			@Override
			public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
					int arg3) {
				// TODO Auto-generated method stub
				
			}
			//当SurfaceHolder创建的时候调用
			@Override
			public void surfaceCreated(SurfaceHolder holder) {
				// TODO Auto-generated method stub
				//绘制整个SurfaceView
				Canvas canvas=holder.lockCanvas();
				Bitmap back=BitmapFactory.decodeResource(SurfaceViewTest.this.getResources()
						,R.drawable.fat_03);
				canvas.drawBitmap(back,30,30,null);
				//绘制完成,释放画布提交修改
				holder.unlockCanvasAndPost(canvas);
				
				/*重新锁一次,“持久化”上次所绘制的内容,因为unlockCanvasAndPost之后上一次
				 * 绘制的图形还在缓冲之中,以免被下次绘制图形遮挡
				 */
				holder.lockCanvas(new Rect(0,0,0,0));
				holder.unlockCanvasAndPost(canvas);
				
			}

			//当该Surface将要被销毁时回调
			@Override
			public void surfaceDestroyed(SurfaceHolder arg0) {
				// TODO Auto-generated method stub
				
			}
			
		});
		
		surface.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View view, MotionEvent event) {
				// TODO Auto-generated method stub
				if(event.getAction()==MotionEvent.ACTION_DOWN){
					int cx=(int) event.getX();
					int cy=(int) event.getY();
					//获取SurfaceView指定区域的Canvas,只更新局部内容
					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.rgb(255,0,0));
					paint.setStyle(Paint.Style.FILL);
					//绘制红色方块
					canvas.drawRect(cx-40,cy-40,cx+40,cy+40, paint);
					//恢复Canvas之前的保存状态
					canvas.restore();
					
					//绘制绿色方框
					paint.setColor(Color.rgb(0,255,0));
					paint.setStyle(Paint.Style.STROKE);
					paint.setStrokeWidth(2);
					canvas.drawRect(cx,cy,cx+30,cy+30, paint);
					//完成绘制提交修改
					holder.unlockCanvasAndPost(canvas);
				}
				return false;
			}
		});
	}
	
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

今天的文章SurfaceView之SurfaceHolder分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33667.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注