• 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)结束锁定画图,并提交改变,将图形显示。

    5)绘制一个红色正方形。

     1 import android.content.Context;
     2 import android.graphics.Canvas;
     3 import android.graphics.Color;
     4 import android.graphics.Paint;
     5 import android.view.SurfaceHolder;
     6 import android.view.SurfaceHolder.Callback;
     7 import android.view.SurfaceView;
     8 
     9 //SurfaceHolder.Callback 可以看成是一个控制器
    10 public class MyView extends SurfaceView implements Callback {
    11 
    12     private Paint paint = null;  // 画笔
    13 
    14     public MyView(Context context) {
    15         super(context);
    16         paint = new Paint();
    17         paint.setColor(Color.RED);  // 画笔设置红色
    18         getHolder().addCallback(this);
    19     }
    20 
    21     // 绘制方法(surfaceCreated)创建之后执行,(surfaceDestroyed)销毁之前来结束掉
    22     public void draw() {
    23               //锁定画布
    24         Canvas canvas = getHolder().lockCanvas();
    25 
    26         canvas.drawColor(Color.WHITE);
    27         canvas.drawRect(0, 0, 100, 100, paint);
    28 
    29               // 解锁画布
    30         getHolder().unlockCanvasAndPost(canvas);
    31 
    32     }
    33 
    34     @Override   // 改变时触发
    35     public void surfaceChanged(SurfaceHolder holder, int format, int width,
    36             int height) {
    37 
    38     }
    39 
    40     @Override  // 创建时被激发
    41     public void surfaceCreated(SurfaceHolder holder) {
    42         draw();
    43     }
    44 
    45     @Override   // 销毁的时候被激发
    46     public void surfaceDestroyed(SurfaceHolder holder) {
    47         // TODO Auto-generated method stub
    48 
    49     }
    50 
    51 }
    1 setContentView(new MyView(this));

     6)两条斜线。

     1 public class MyView extends SurfaceView implements Callback {
     2 
     3     private Paint paint = null;
     4 
     5     public MyView(Context context) {
     6         super(context);
     7         paint = new Paint();
     8         paint.setColor(Color.RED);  // 设置画笔颜色
     9         getHolder().addCallback(this);
    10     }
    11 
    12     public void draw() {   // 绘制方法
    13               //创建画布,锁定画布
    14         Canvas canvas = getHolder().lockCanvas();
    15               //初始化画布颜色
    16         canvas.drawColor(0xFFFFFFFF);
    17         canvas.save();  // 保存可编辑状态
    18               //旋转
    19         canvas.rotate(90, getWidth()/2,getHeight()/2);
    20               //绘制一条直线
    21         canvas.drawLine(0, getHeight() / 2, getWidth(), getHeight(), paint);
    22  
    23 //        canvas.restore();  复原(下面不管在画什么都是旋转过的)
    24         canvas.drawLine(0, getHeight() / 2 + 100, getWidth(),
    25                 getHeight() + 100, paint);
    26               //解锁画布
    27         getHolder().unlockCanvasAndPost(canvas);
    28     }
    29 
    30     @Override
    31     public void surfaceChanged(SurfaceHolder holder, int format, int width,
    32             int height) {
    33         draw();
    34     }
    35 
    36     @Override
    37     public void surfaceCreated(SurfaceHolder holder) {
    38         // TODO Auto-generated method stub
    39     }
    40 
    41     @Override
    42     public void surfaceDestroyed(SurfaceHolder holder) {
    43         // TODO Auto-generated method stub
    44     }
    45 
    46 }
  • 相关阅读:
    常用、好用的资源管理器收藏
    单片机延时函数整理——针对裸机
    ad7793的调试记录
    《80c51单片机实用技术》邹久朋学习笔记
    使用串口工具(volt++ vofa)伏特加来实时打印波形
    golang从简单的即时聊天来看架构演变
    无敌简单快速的文件服务器sgfs
    到底是否应该使用“微服务架构”?
    你所学习的设计模式到底有什么用?到底怎么用?
    浅入深出ETCD之【raft原理】
  • 原文地址:https://www.cnblogs.com/androidsj/p/3948925.html
Copyright © 2020-2023  润新知