乐读文学

Android从入门到精通

乐读文学 > 科普学习 > Android从入门到精通

第101页

书籍名:《Android从入门到精通》    作者:明日科技




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的菜单资源文件,在该文件中编写实例中所应用的功能菜单,关键代码如下: