原理:看似是随手指动的点,其实还是利用Canvas.drawLine(...),就是无限多的小直线可以看成连续的曲线。
摘自博客:http://www.cnblogs.com/plokmju/p/android_canvas.html#commentform
『
需要指出的是,如果程序每次都只是从上次移动事件的发生点绘制一条直线到本次拖动事件的发生点,那么当用户手指一旦离开触摸屏,再次引发触摸移动事件的时候,会导致前面绘制的内容被丢失。为了保留用户之前绘制的内容,程序需要借助于一个"双缓冲"的机制。
之前讲解SurfaceView的时候,有讲到SurfaceView会自己维护一个双缓冲的缓冲区,但是在这里使用ImageView来展示绘图效果,它需要我们去维护双缓冲的机制。当用户在ImageView上进行"绘制"的时候,程序并不直接"绘制"到该ImageView组件上,而是先绘制到一个内存中的Bitmap对象(缓冲)上,等到内存中的Bitmap绘制好之后,再一次性的将Bitmap对象"绘制"到ImageView上。
』
贴代码一: layout_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn_resume"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重新画图" />
<ImageView
android:id="@+id/imgView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
贴代码二: mainActivity.java
public class MainActivity extends Activity {
private Button btn_resume;
private ImageView imgView;
private Bitmap baseBitmap;
private Canvas canvas;
private Paint paint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
paint =new Paint();
paint.setStrokeWidth(10);
paint.setColor(Color.CYAN);
imgView=(ImageView)findViewById(R.id.imgView);
imgView.setOnTouchListener(touch);
btn_resume=(Button)findViewById(R.id.btn_resume);
btn_resume.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(baseBitmap!=null){
baseBitmap=Bitmap.createBitmap(imgView.getWidth(),
imgView.getHeight(),Bitmap.Config.ARGB_8888);
canvas=new Canvas(baseBitmap);
canvas.drawColor(Color.WHITE);
imgView.setImageBitmap(baseBitmap);
}
}
});
}
View.OnTouchListener touch= new OnTouchListener(){
float startX;
float startY;
@Override
public boolean onTouch(android.view.View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
if(baseBitmap==null){
baseBitmap =Bitmap.createBitmap(imgView.getWidth(),
imgView.getHeight(), Bitmap.Config.ARGB_8888);
//生成一个空白的位图Bitmap
canvas=new Canvas(baseBitmap);
//创建一个以baseBitmap为背景的Canvas
canvas.drawColor(Color.WHITE);
}
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
float stopX=event.getX();
float stopY=event.getY();
canvas.drawLine(startX, startY, stopX, stopY, paint);
startX=event.getX();
startY=event.getY();
imgView.setImageBitmap(baseBitmap);
break;
case MotionEvent.ACTION_UP:
break;
default :break;
}
return true;
}
};
}
贴截图: