一、前言
上两篇文章讲到了 SurfaceView简单绘制图片和SurfaceView高性能绘制(一)理论篇,接下来这篇我们开始自定义SurfaceView、添加线程进行实战代码操作。
二、主要代码
1、自定义一个SurfaceView
//1、自定义一个SurfaceView
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private DrawingThread drawingThread;
public MySurfaceView(Context context) {
super(context);
initParams();
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initParams();
}
// public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
// super(context, attrs, defStyleAttr);
// }
// public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
// super(context, attrs, defStyleAttr, defStyleRes);
// }
//2、监听SurfaceView的生命周期
private void initParams(){
getHolder().addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//创建
//6、通过SurfaceView的生命周期来执行我们的线程,绘制我们的图片
drawingThread = new DrawingThread(getHolder(),
BitmapFactory.decodeResource(getResources(),R.mipmap.share));//此图片
为资源文件里面的
drawingThread.start();
}
@Override
// public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {//AS没有导入源码,所以
参数杂乱
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//改变---例如:SurfaceView宽度、高度发生了改变
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//销毁
this.drawingThread.quit();//退出线程
this.drawingThread = null;
}
}
2、自定义线程,继承HandlerThread
//3、自定义线程,继承HandlerThread
public class DrawingThread extends HandlerThread implements Handler.Callback {
//4、定义线程处理,相关的参数
private static final int MSG_ADD = 101;//创建消息
private SurfaceHolder drawingHolder;//缓存视图(我们所有的图片都是绘制在我们的Hodler上面的)
private Paint paint;//画笔
private Bitmap iconBitmap;//我们需要绘制的图片
private Handler revelver;//定义Handler,更新UI线程
private boolean isRunning;//线程是否在运行
public DrawingThread(SurfaceHolder drawingHolder,Bitmap bitmap){
super("DrawingThread");
this.drawingHolder = drawingHolder;
this.iconBitmap = bitmap;
this.paint = new Paint(Paint.ANTI_ALIAS_FLAG);
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what){
case MSG_ADD:
//绘图
if(!isRunning){
return true;//线程没有运行,直接返回
}
//获取画布
Canvas lockCanvas = this.drawingHolder.lockCanvas();//获取加锁的画布(避免线程问题)
if(lockCanvas == null){
break;//如果画布为空,中断
}
lockCanvas.drawColor(Color.BLACK);//清空画布。这里设置画布为黑色
lockCanvas.drawBitmap(iconBitmap, 0, 0, paint);
this.drawingHolder.unlockCanvasAndPost(lockCanvas);//解锁画布
break;
}
return false;
}
//5、监听线程的生命周期(如:当线程退出,就不需要绘制图片了)
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
//提供给我们初始化基本参数
this.revelver = new Handler(getLooper(),this);
this.isRunning = true;
this.revelver.sendEmptyMessage(MSG_ADD);//发一个默认消息
}
@Override
public boolean quit() {
this.isRunning = false;//当线程退出,就不需要绘制图片了
this.revelver.removeCallbacksAndMessages(null);//当线程退出,将所有的消息给清理掉
return super.quit();
}
}
三、效果图、源码
1、效果图
2、源码
https://download.youkuaiyun.com/download/yudbl/10966946