美文网首页
Android:自定义view使用双缓冲技术实现高性能画板

Android:自定义view使用双缓冲技术实现高性能画板

作者: yangSmallXing | 来源:发表于2019-02-21 17:21 被阅读0次

    什么是双缓冲?

    参考https://www.jianshu.com/p/efc0bebfd22e

    为什么要双缓冲?

    当在实现自定义view画板时,调用invalidate()重新绘制view时,之前的已经绘制过的内容会清空,再重新绘制。就会导致性能损耗。如果使用双缓冲,之前绘制过的内容缓存在一个canvas中,重新绘制时canvas不会清空,所以之前绘制的内容不需要重新绘制。

    代码实现

    public class PaletteView extends View {
    
        float preX;
        float preY;
        private Path path;
        private Paint paint = null;
        //定义一个内存中图片,将他作为缓冲区
        Bitmap cacheBitmap = null;
        //定义缓冲区Cache的Canvas对象
        Canvas cacheCanvas = null;
    
        public PaletteView(Context context) {
            this(context,null);
        }
    
        public PaletteView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
        private void init( ){
            paint = new Paint();
            paint.setColor(Color.RED);
            paint.setFlags(Paint.DITHER_FLAG);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(5);
            paint.setAntiAlias(true);
            paint.setDither(true);
            path = new Path();
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            //创建一个与该VIew相同大小的缓冲区
            cacheBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
            //创建缓冲区Cache的Canvas对象
            cacheCanvas = new Canvas();
            //设置cacheCanvas将会绘制到内存的bitmap上
            cacheCanvas.setBitmap(cacheBitmap);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            //将cacheBitmap绘制到该View
            canvas.drawBitmap(cacheBitmap,0,0,p);
            //canvas.drawPath(path,paint);
        }
    
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            //获取拖动时间的发生位置
            float x = event.getX();
            float y = event.getY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    path.moveTo(x,y);
                    preX = x;
                    preY = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    path.quadTo(preX,preY,x,y);
                    preX = x;
                    preY = y;
                    cacheCanvas.drawPath(path,paint);
                    break;
                case MotionEvent.ACTION_UP:
                    //这是是调用了cacheBitmap的Canvas在绘制
                    cacheCanvas.drawPath(path,paint);
                    path.reset();
                    break;
            }
            invalidate();//在UI线程刷新VIew
            return true;
        }
    }
    

    源码 https://github.com/labixiaoxing/palette

    相关文章

      网友评论

          本文标题:Android:自定义view使用双缓冲技术实现高性能画板

          本文链接:https://www.haomeiwen.com/subject/lcddyqtx.html