SurfaceView高性能绘制(二)代码实践篇-图片绘制

一、前言

上两篇文章讲到了 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.csdn.net/download/yudbl/10966946

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值