1、创建一个名称为DrawView的类,继承android.view.View类
public class DrawView extends View{private int view_width = 0; //屏幕的宽度private int view_height = 0;//屏幕的高度private float preX;//起始点的X坐标值private float preY;//起始点的Y坐标值private Path path;//路径private Paint paint = null;//画笔Bitmap cacheBitmap = null;//定义一个内存中的图片,该图片强作为缓冲区Canvas cacheCanvas = null;//定义cacheBitmap上的Canvas对象/*** 构造方法* @param context*/public DrawView(Context context) {super(context);}/*** 重写onDraw()方法*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}}
2、布局文件
<FrameLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><com.example.android9_8.DrawView android:id="@+id/drawView1"android:layout_width="match_parent"android:layout_height="match_parent"/></FrameLayout>
3、在DrawView类的构造方法中
view_width = context.getResources().getDisplayMetrics().widthPixels;//获取屏幕的宽度view_height = context.getResources().getDisplayMetrics().heightPixels;//获取屏幕的高度//创建一个与该View相同大小的缓存区cacheBitmap = Bitmap.createBitmap(view_width, view_height, Config.ARGB_8888);cacheCanvas = new Canvas();//创建一个新的画布path = new Path();cacheCanvas.setBitmap(cacheBitmap);//在cacheCanvas上绘制cacheBitmappaint = new Paint(Paint.DITHER_FLAG);paint.setColor(Color.RED);//设置默认的画笔颜色//设置画笔风格paint.setStyle(Paint.Style.STROKE);//设置填充方式为描边paint.setStrokeCap(Paint.Cap.ROUND);//设置笔刷的图形样式paint.setStrokeCap(Paint.Cap.ROUND);//设置画笔转弯处的链接风格paint.setStrokeWidth(1);//设置默认笔触的宽度为1像素paint.setAntiAlias(true);//使用抗锯齿功能paint.setDither(true);//使用抖动效果
4、在DrawView类的onDraw()方法中
canvas.drawColor(0xFFFFFFFF);//设置背景颜色Paint bmpPaint = new Paint();//采用默认设置创建一个画笔canvas.drawBitmap(cacheBitmap, 0, 0,bmpPaint);//绘制cacheBitmapcanvas.drawPath(path, paint);//绘制路径canvas.save(Canvas.ALL_SAVE_FLAG);//保存canvas的状态canvas.restore();//恢复canvas之前保存的状态,防止保存后对canvas执行的操作对后续的绘制有影响
5、在DrawView类中,重写onTouchEvent()方法
public boolean onTouchEvent(MotionEvent event) {//获取触摸事件发生的位置float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:path.moveTo(x, y);//将绘图的起始点移到(x,y)坐标点的位置preX = x;preY = y;break;case MotionEvent.ACTION_MOVE:float dx = Math.abs(x-preX);float dy = Math.abs(y-preY);if(dx>=5||dy>=5){//判断是否在允许的范围内path.quadTo(preX, preY, (x+preX)/2, (y+preY)/2);preX = x;preY = y;}break;case MotionEvent.ACTION_UP:cacheCanvas.drawPath(path, paint);//绘制路径path.reset();break;}invalidate();return true;//返回true,表明处理方法已经处理该事件}
6、编写clear()方法,用于实现橡皮擦功能
public void clear(){paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));//设置图形重叠时的处理方式paint.setStrokeWidth(50);//设置笔触的宽度}
7、编写保存当前绘图的save()方法
public void save(){try {saveBitmap("myPicture");} catch (IOException e) {e.printStackTrace();}}
8、saveBitmap()方法
//保存绘制好的位图public void saveBitmap(String fileName) throws IOException{File file = new File("/sdcard/pictures/"+fileName+".png");//创建文件对象file.createNewFile();//创建一个新文件FileOutputStream fileOS = new FileOutputStream(file);//创建一个文件输出流对象//将绘图内容压缩为PNG格式输出到输出流对象中press(pressFormat.PNG, 100, fileOS);fileOS.flush();//将缓冲区中的数据全部写出到输出流fileOS.close();//关闭文件输出流对象}
注意:向SD卡上保存文件,需要在AndroidMainifest.xml文件中赋予相应的权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
9、在res目录中,创建一个menu目录,在该目录中创建一个名称为toolsmenu.xml的菜单资源文件
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="/apk/res/android" ><item android:title="@string/color"><menu ><!-- 定义一组单选菜单项 --><group android:checkableBehavior="single" ><!-- 定义子菜单 --><item android:id="@+id/red" android:title="@string/color_red"/><item android:id="@+id/green" android:title="@string/color_green"/><item android:id="@+id/blue" android:title="@string/color_blue"/></group></menu></item><item android:title="@string/width"><menu ><!-- 定义子菜单 --><group><item android:id="@+id/width_1" android:title="@string/width_1"/><item android:id="@+id/width_2" android:title="@string/width_2"/><item android:id="@+id/width_3" android:title="@string/width_3"/></group></menu></item><item android:id="@+id/clear" android:title="@string/clear"/><item android:id="@+id/save" android:title="@string/save"/> </menu>
strings.xml
<?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">简易涂鸭板</string><string name="width_1">1像素</string><string name="width_2">5像素</string><string name="width_3">10像素</string><string name="color_red">红色</string><string name="color_green">绿色</string><string name="color_blue">蓝色</string><string name="color">画笔颜色</string><string name="width">画笔宽度</string><string name="clear">擦除绘画</string><string name="save">保存绘画</string></resources>
10、在MainActivity中重写onCreateOptionsMenu()方法
//创建选项菜单@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflator = new MenuInflater(this);//实例化一个MenuInfinflator.inflate(R.menu.toolsmenu, menu);//解析菜单文件return super.onCreateOptionsMenu(menu);}
11、重写onOptionsItemSelected()方法
// 当菜单项被选择时,作出相应的处理@Overridepublic boolean onOptionsItemSelected(MenuItem item) {DrawView dv = (DrawView) findViewById(R.id.drawView1);//获取自定义的绘图视图dv.paint.setXfermode(null);//取消擦除效果dv.paint.setStrokeWidth(1);//初始化画笔的宽度switch (item.getItemId()) {case R.id.red:dv.paint.setColor(Color.RED);//设置画笔的颜色为红色item.setChecked(true);break;case R.id.green:dv.paint.setColor(Color.GREEN);//设置画笔的颜色为绿色item.setChecked(true);break;case R.id.blue:dv.paint.setColor(Color.BLUE);//设置画笔的颜色为蓝色item.setChecked(true);break;case R.id.width_1:dv.paint.setStrokeWidth(1);//设置笔触的宽度为1像素break;case R.id.width_2:dv.paint.setStrokeWidth(5);//设置笔触的宽度为5像素break;case R.id.width_3:dv.paint.setStrokeWidth(10);//设置笔触的宽度为10像素break;case R.id.clear:dv.clear();//擦除绘画break;case R.id.save:dv.save();//保存绘画break;}return true;}