SurfaceView之SurfaceHolder

来源:互联网 发布:数据还原 编辑:程序博客网 时间:2024/06/03 01:53
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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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的格式或大小发生改变的时候调用@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,int arg3) {// TODO Auto-generated method stub}//当SurfaceHolder创建的时候调用@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stub//绘制整个SurfaceViewCanvas 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将要被销毁时回调@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {// TODO Auto-generated method stub}});surface.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {// TODO Auto-generated method stubif(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>


0 0
原创粉丝点击