最近android课老师布置了一个课后作业,是实现android涂鸦板的功能,
然后自己写了一个简单的涂鸦板,可以实现选择颜色、尺寸、清屏的功能。
首先是效果图:
主要是使用Canvas和Paint来实现画图,并使用触屏事件处理来获取用户滑动的坐标。
首先,新建一个类HandWrite并继承View
实现画图的主要方法是onDraw()方法。
onDraw():绘图主函数,但是onDraw方法是个触发事件产生的调用,只能通过特定的方法触发事件以来调用onDraw。
触发onDraw函数的方法是:invalidate或者postInvalidate
直接上代码:
package com.example.icarus.ch6_2; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.util.Stack; /** * Created by icarus on 3/31/2016. * 自定义组件实现view * 在view上绘制Canvas对象,在onDrow函数中实现 */ public class HandWrite extends View{ //定义画笔 private Paint paint; //存放原始图像 private Bitmap originalBitmap=null; //存放从原始图形复制的图像 private Bitmap new1_Bitmap=null; //存放处理后的图像 private Bitmap new2_Bitmap=null; //画线的起始坐标 private float startX=0,startY=0; //第二次画线起始坐标 private float secondX=0,secondY=0; //画线的终点坐标 private float clickX=0,clickY=0; //清屏按钮是否按下 private boolean isClear=false; //设置是否画线的标志 private boolean isMove=true; //是否按下 private boolean isDown=false; //记录绘画历史的栈 private Stack<Bitmap> bitmap_stack=new Stack<Bitmap>(); //控制是否出栈的标志 private boolean isPOP=false; /** * 实现默认构造函数 * @param context * @param attrs */ public HandWrite(Context context, AttributeSet attrs) { super(context, attrs); //从资源中获取原始图形,android不允许在代码里修改res文件,下面的代码会出错 //originalBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.capture); //需使用这种格式代替 originalBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.capture).copy(Bitmap.Config.ARGB_8888,true); new1_Bitmap=Bitmap.createBitmap(originalBitmap); paint=new Paint(); } /** * 清除涂鸦 */ public void clear(){ isClear=true; new2_Bitmap=Bitmap.createBitmap(originalBitmap); invalidate(); } /** * 撤销功能实现 */ public void doPOP(){ isPOP=true; new2_Bitmap=bitmap_stack.pop(); invalidate(); } /** * 设置颜色 * @param