SurfaceView 阶段总结

根据各位大牛加书总结一下SurfaceView

SurfaceView的作用是用于被动更新的View
① view主要适用于主动更新情况,并且只能在主线程绘制和更新画面。
② surfaceView适用于特别频繁的刷新页面,比如游戏,摄像头,而且通过子线程来进行操作,实现了双缓冲机制

SurfaceView它的绘制原理是绘制前先锁定画布(获取画布),然后等都绘制结束以后在对画布进行解锁 ,最后在把画布内容显示到屏幕上。
Surface有两个接口 :SurfaceHolder.CallBack Runnable
第一个的实现接口方法

//Surface的生命周期
@Override
public void surfaceCreated(SurfaceHolder holder) {

}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

Runnable 直接在run里面写子线程ui操作就行了

初始化

private SurfaceHolder mHolder;  
private Canvas mCanvas;//绘图的画布  
private boolean mIsDrawing;//控制绘画线程的标志位  

SurfaceHolder里面保存了一个对Surface对象的引用,而我们执行绘制方法本质上就是操控Surface。使用 SurfaceHolder来处理生命周期的初始化。
下面为初始化代码

public MySurfaceView(Context context, AttributeSet attrs) {  
       super(context, attrs);  
       initView();  
   }  

   public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {  
       super(context, attrs, defStyleAttr);  
       initView();  
   }  

   public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {  
       super(context, attrs, defStyleAttr);  
   }  

   private void initView() {  
       mHolder = getHolder();//获取SurfaceHolder对象  
       mHolder.addCallback(this);//注册SurfaceHolder的回调方法  
       setFocusable(true);  
       setFocusableInTouchMode(true);  
       this.setKeepScreenOn(true);  
   }  

接下来进行子线程的绘图操作

    @Override  
    public void surfaceCreated(SurfaceHolder holder) {  
        mIsDrawing = true;  
        new Thread(this).start();  
    }  

    @Override  
    public void surfaceChanged(SurfaceHolder holder,  
                               int format, int width, int height) {  
    }  

    @Override  
    public void surfaceDestroyed(SurfaceHolder holder) {  
        mIsDrawing = false;  
    }  

    @Override  
    public void run() {  
        while (mIsDrawing) {  
            draw();  
        }  
    }  
    //绘图操作  
    private void draw() {  
        try {  
            mCanvas = mHolder.lockCanvas();  
            // draw sth绘制过程  
        } catch (Exception e) {  
        } finally {  
            if (mCanvas != null)  
                mHolder.unlockCanvasAndPost(mCanvas);//保证每次都将绘图的内容提交  
        }  
    }  
}  

SurfaceView后面还会用到很多,这里的实例不用多讲
正在搞一个摄像头+surfaceview明天(?)完成

猜你喜欢

转载自blog.csdn.net/rikkatheworld/article/details/79905249