android 双缓冲分析一些基本的原理

当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。
 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:
  1、在内存中创建与画布一致的缓冲区
  2、在缓冲区画图
  3、将缓冲区位图拷贝到当前画布上
  4、释放内存缓冲区
下面的例子(一个画图板)将实现双缓冲画图
先自定义一个View(Bitmap将会绘制到这个View上)

这里主要理解:一些基本的原理,详细看代码注释

public class DoubleBitmap extends View {

    private Bitmap mCachBitMap;//缓冲画布

    private Canvas mCanvas;//画图

    private Paint mPaint;//画布

    private Path  mPath;

    private int x,y,dx,dy;


    public DoubleBitmap(Context context) {
        this(context, null);
    }

    public DoubleBitmap(Context context, AttributeSet attrs) {
        super(context, attrs);

        mPaint=new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(3);
        mPaint.setColor(Color.RED);
        mPaint.setAntiAlias(true);

        mPath=new Path();



    }
    //监听view的大小变化,间接去调用OnMeasure(),onLayout()
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);//先测量过后才能获取View的宽和高

        mCachBitMap= Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(), Bitmap.Config.ARGB_8888);

        mCanvas=new Canvas(mCachBitMap);//把缓冲画布绑定到新创建的canvas对象上面去

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        x=(int)event.getX();

        y=(int)event.getY();


        switch (event.getAction()){

            case MotionEvent.ACTION_DOWN:

                dx=x;
                dy=y;

                mPath.moveTo(dx,dy);

                break;

            case MotionEvent.ACTION_MOVE:

                mPath.quadTo(dx,dy,x,y);//绘制二阶贝塞尔曲线

                dx=x;
                dy=y;

                break;

            case MotionEvent.ACTION_UP:


                mCanvas.drawPath(mPath, mPaint);//用自定义的cavas对象绘制path

                mPath.reset();//path重置


                break;

        }

        invalidate();//时刻准备重绘

        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {


        canvas.drawBitmap(mCachBitMap,0,0,mPaint);//把缓存画布上的内容绘制到View默认画布上面去 一次性拷贝过来,避免屏幕闪烁

        canvas.drawPath(mPath, mPaint);

        super.onDraw(canvas);
    }


}

你可能感兴趣的:(android,对象,内存,图形,双缓冲)