Android之SurfaceView使用总结

来源:互联网 发布:武汉人脾气差 知乎 编辑:程序博客网 时间:2024/05/01 22:36

Android之SurfaceView使用总结

1.概念

      SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

2.实现方法

1)实现步骤

    a.继承SurfaceView

    b.实现SurfaceHolder.Callback接口

2)需要重写的方法

(1)public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}  //在surface的大小发生改变时激发(2)public void surfaceCreated(SurfaceHolder holder){}  //在创建时激发,一般在这里调用画图的线程。(3)public void surfaceDestroyed(SurfaceHolder holder) {}  //销毁时激发,一般在这里将画图的线程停止、释放。

3)SurfaceHolder

  SurfaceHolder,surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:

复制代码
(1)、abstract void addCallback(SurfaceHolder.Callback callback);// 给SurfaceView当前的持有者一个回调对象。(2)、abstract Canvas lockCanvas();// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。(3)、abstract Canvas lockCanvas(Rect dirty);// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。(4)、abstract void unlockCanvasAndPost(Canvas canvas);// 结束锁定画图,并提交改变。
复制代码

4)总结整个过程

  继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。

下面是一个完整的案例:

复制代码
public class ViewTest extends Activity {
    @Override      public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(new MyView(this));      }
     //视图内部类      class MyView extends SurfaceView implements SurfaceHolder.Callback      {         private SurfaceHolder holder;         private MyThread myThread;          public MyView(Context context) {             super(context);             // TODO Auto-generated constructor stub             holder = this.getHolder();             holder.addCallback(this);             myThread = new MyThread(holder);//创建一个绘图线程         }           @Override         public void surfaceChanged(SurfaceHolder holder, int format, int width,                  int height) {             // TODO Auto-generated method stub                        }           @Override         public void surfaceCreated(SurfaceHolder holder) {              // TODO Auto-generated method stub             myThread.isRun = true;             myThread.start();        }          @Override         public void surfaceDestroyed(SurfaceHolder holder) {            // TODO Auto-generated method stub            myThread.isRun = false;        }      }      //线程内部类      class MyThread extends Thread      {          private SurfaceHolder holder;          public boolean isRun ;          public  MyThread(SurfaceHolder holder)          {              this.holder =holder;               isRun = true;          }          @Override          public void run()          {              int count = 0;              while(isRun)              {                  Canvas c = null;                  try                  {                      synchronized (holder){                        c = holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。                    c.drawColor(Color.BLACK);//设置画布背景颜色                    Paint p = new Paint(); //创建画笔                    p.setColor(Color.WHITE);                    Rect r = new Rect(100, 50, 300, 250);                    c.drawRect(r, p);                    c.drawText("这是第"+(count++)+"秒", 100, 310, p);                    Thread.sleep(1000);//睡眠时间为1秒                  }              }              catch (Exception e) {                  e.printStackTrace();              }              finally              {                   if(c!= null)                 {                   holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。                }           }         }       }     }  }
复制代码
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三个月宝宝可以竖抱吗 新生儿几个月可以竖着抱 婴儿几个月可以竖着抱 婴儿什么时候可以竖着抱 婴儿什么时候可以竖抱 新生儿几个月可以竖抱 宝宝三个月可以竖着抱吗 小孩几个月可以竖着抱 宝宝什么时候可以竖着抱 宝宝什么时候可以竖抱 孩子几个月可以竖着抱 小孩几个月可以竖抱 孩子几个月可以竖抱 宝宝几个月才能竖着抱 三个月的宝宝可以竖着抱吗 两个多月的宝宝可以竖着抱吗 宝宝什么时候能竖着抱 两个月的宝宝可以竖着抱吗 几个月的宝宝可以竖着抱 几个月婴儿可以竖着抱 婴儿三个月可以竖抱吗 2个月的宝宝可以竖着抱吗 小宝宝几个月可以竖着抱 婴儿两个月可以竖抱吗 婴幼儿几个月可以竖着抱 一个月的宝宝可以竖着抱吗 多大的婴儿可以竖着抱 二个月的宝宝可以竖着抱吗 几个月的宝宝可以竖抱 多大的宝宝可以竖着抱 3个月的宝宝可以竖着抱吗 新生儿多大可以竖着抱 宝宝两个月可以竖着抱吗 两个月宝宝喜欢竖着抱 三个月的婴儿可以竖着抱吗 2个多月的宝宝可以竖着抱吗 新生儿多久可以竖着抱 竖撇的字 一撇一竖是什么字 竖撇的写法图片 竖撇的写法