第101页
paint.setStrokeCap(Paint.Cap.ROUND); //设置画笔转弯处的连接风格
paint.setStrokeWidth(1); //设置默认笔触的宽度为1像素
paint.setAntiAlias(true); //使用抗锯齿功能
paint.setDither(true); //使用抖动效果
(4)在DrawView类的onDraw()方法中,添加以下代码,用于设置背景颜色、绘制cacheBitmap、绘制路径以及保存当前绘图状态到栈中,并调用restore()方法恢复所保存的状态。
canvas.drawColor(0xFFFFFFFF); //设置背景颜色
Paint bmpPaint = new Paint(); //采用默认设置创建一个画笔
canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint); //绘制cacheBitmap
canvas.drawPath(path, paint); //绘制路径
canvas.save(Canvas.ALL_SAVE_FLAG); //保存canvas的状态
canvas.restore(); //恢复canvas之前保存的状态,防止保存后对canvas执行的操作对后续的绘制有影响
(5)在DrawView类中,重写onTouchEvent()方法,为该视图添加触摸事件监听器,在该方法中,首先获取触摸事件发生的位置,然后应用switch语句对事件的不同状态添加响应代码,最后调用invalidate()方法更新视图。具体代码如下:
@Override
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()方法,在该方法中,调用saveBitmap()方法将当前绘图保存为PNG图片。save()方法的具体代码如下:
public void save() {
try {
saveBitmap("myPicture");
} catch (IOException e) {
e.printStackTrace();
}
}
(8)编写保存绘制好的位图的方法saveBitmap(),在该方法中,首先在SD卡上创建一个文件,然后创建一个文件输出流对象,并调用Bitmap类的compress()方法将绘图内容压缩为PNG格式输出到刚刚创建的文件输出流对象中,最后将缓冲区的数据全部写出到输出流中,并关闭文件输出流对象。saveBitmap()方法的具体代码如下:
//保存绘制好的位图
public void saveBitmap(String fileName) throws IOException {
File file = new File("/sdcard/pictures/" + fileName + ".png");//创建文件对象
file.createNewFile(); //创建一个新文件
FileOutputStream fileOS = new FileOutputStream(file); //创建一个文件输出流对象
//将绘图内容压缩为PNG格式输出到输出流对象中
cacheBitmappress(Bitmap.CompressFormat.PNG, 100, fileOS);
fileOS.flush(); //将缓冲区中的数据全部写出到输出流中
fileOS.close(); //关闭文件输出流对象
}
注意: 如果在程序中,需要向SD卡上保存文件,那么需要在AndroidManifest.xml文件中赋予相应的权限,具体代码如下:
(9)在res目录中,创建一个menu目录,并在该目录中创建一个名称为toolsmenu.xml的菜单资源文件,在该文件中编写实例中所应用的功能菜单,关键代码如下: