采用双缓存实现画图板

本例实现 当用户在屏幕上移动时,即可在屏幕上绘制任何图形。

所谓双缓存其实很简单,当程序需要在指定的View上绘制时,程序并不直接绘制在View上,而是先绘制在内存中的一个Bitmap(这就是缓存)上,等到内存中的Bitmap绘制好后,再一次性的将Bitmap绘制到View上。

下面开始自定义一个View

 

/**
 * Created by IT小蔡 on 2017-3-29.
 */

public class MyDrawView extends View {
/*   当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,
而Path类的lineTo和quadTo方法实现的绘制线路形式也是不一样的,下面就以代码的实现来直观的探究这两个方法的功能实现区别;
   1. Path--->quadTo(float x1, float y1, float x2, float y2):
     该方法的实现是当我们不仅仅是画一条线甚至是画弧线时会形成平滑的曲线,
     该曲线又称为"贝塞尔曲线"(Bezier curve),其中,x1,y1为控制点的坐标值,x2,y2为终点的坐标值;
    贝塞尔曲线的形成,就比如我们把一条橡皮筋拉直,橡皮筋的头尾部对应起点和终点,
    然后从拉直的橡皮筋中选择任意一点(除头尾对应的点外)扯动橡皮筋形成的弯曲形状,而那个扯动橡皮筋的点就是控制点;

    2. Path--->lineTo(float x, float y) :
     该方法实现的仅仅是两点连成一线的绘制线路,这样,当我们用这个方法绘制曲线时,缺陷就出来了;
    */



    private int mWidth = 320;
    private int mHeight = 480;
    private Paint mPaint;
    private Canvas casheCanvas;
    private Bitmap cacheBitmap;
    private Path mPath;
    private float preX;
    private float preY;

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

    public MyDrawView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyDrawView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        cacheBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
        casheCanvas = new Canvas();
        mPath = new Path();
        casheCanvas.setBitmap(cacheBitmap); //设置casheCanvas 绘制到 cacheBitmap上
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(2);
        mPaint.setColor(Color.RED);
        //设置抗锯齿
        mPaint.setDither(true);
        mPaint.setAntiAlias(true);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPath.moveTo(x,y);
                preX = x;
                preY = y;

                break;
            case MotionEvent.ACTION_MOVE:
              /*  mPath.quadTo(preX,preY,x,y);
                preX = x;
                preY = y;*/
                mPath.lineTo(x,y);
                break;
            case MotionEvent.ACTION_UP:
                casheCanvas.drawPath(mPath,mPaint);
                //重置绘制路线,即隐藏之前绘制的轨迹
                mPath.reset();
                break;
        }

        invalidate();
        return true;//返回true,表示已经处理过该事件
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(cacheBitmap,0,0,null);
        canvas.drawPath(mPath,mPaint);
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值