本例实现 当用户在屏幕上移动时,即可在屏幕上绘制任何图形。
所谓双缓存计时很简单,当程序需要在指定的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);
}
}