Canvas实现简单画画板

原理:看似是随手指动的点,其实还是利用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;
		}
	};
}

贴截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值