Android笔记二十九. 一款简易画图板开发

三、源码实现

1.HandDraw.java:继承于View的子类

package com.example.path3;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/*实现:采用双缓冲实现画图板*/public class DrawView extends View { float preX; float preY; private Path path; public Paint paint=null; final int VIEW_WIDTH = 320; final int VIEW_HEIGHT = 480; Bitmap cacheBitmap = null; //定义一个内存中的图片,该图片将作为缓存区 Canvas cacheCanvas = null; //定义cacheCanvas上的Canvas对象 /*———————构造方法—————————-*/ public DrawView(Context context, AttributeSet set) { super(context, set); path = new Path(); //1.创建一个与该View相同大小的缓存区 cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT, Config.ARGB_8888); //2.设置cacheCanvas将会绘制到内存中的cacheBitmap上 cacheCanvas = new Canvas(); cacheCanvas.setBitmap(cacheBitmap); //3.设置画笔(颜色、风格、反锯齿) paint = new Paint(Paint.DITHER_FLAG); //创建画笔 paint.setColor(Color.RED); //画笔颜色为红色 paint.setStyle(Paint.Style.STROKE); //设置画笔风格 paint.setAntiAlias(true); //反锯齿 paint.setDither(true); } /*———————监听触摸事件—————————-*/ @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);preX = x;preY = y;break; case MotionEvent.ACTION_MOVE:path.quadTo(preX, preY, x, y);preX = x;preY = y;break; case MotionEvent.ACTION_UP:cacheCanvas.drawPath(path, paint);//沿着路径绘制图形存放到cacheBitmap中path.reset();break; } invalidate(); return true;//返回true表明处理方法已经处理该事件 }///*——————–绘图————————-*/ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint bmpPaint = new Paint(); //a.将cacheBitmap绘制到该View组件上 canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint); //b.沿着path绘制 canvas.drawPath(path, paint); }}

2.HandDraw.java:程序主界面

package com.example.path3;import android.graphics.BlurMaskFilter;import android.graphics.Color;import android.graphics.EmbossMaskFilter;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.Menu;import android.view.MenuItem;public class HandDraw extends ActionBarActivity { EmbossMaskFilter emboss; BlurMaskFilter blur;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);emboss = new EmbossMaskFilter(new float[] {1.5f,1.5f,1.5f}, 0.6f, 6,4.2f);blur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);} //装载R.menu.hand_draw对应的菜单并添加到menu中@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.hand_draw, menu);return true;}//菜单被单击后的回调方法@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();DrawView dv = (DrawView)findViewById(R.id.draw);//判断单击的是哪个菜单项并有针对性地作出响应switch(id){//颜色设置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);break;case R.id.width_2: //号画笔dv.paint.setStrokeWidth(2);break;case R.id.width_5: //号画笔dv.paint.setStrokeWidth(5);break;//模糊效果case R.id.blur:dv.paint.setMaskFilter(blur);break;//浮雕效果case R.id.emboss:dv.paint.setMaskFilter(emboss);break;}return super.onOptionsItemSelected(item);}}

3.menu.xml:菜单布局文件

<menu xmlns:android="" xmlns:app="" xmlns:tools="" tools:context="com.example.path3.HandDraw" > <!– 定义一组颜色选项菜单项 –> <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 android:checkableBehavior="single"> <item android:id="@+id/width_1" android:title="@string/width1"/> <item android:id="@+id/width_2" android:title="@string/width2"/> <item android:id="@+id/width_5" android:title="@string/width5"/> </group> </menu> </item> <!– –> <item android:id="@+id/blur" android:title="@string/blur"/> <!– 定义一组宽度选项菜单项 –> <item android:id="@+id/emboss" android:title="@string/emboss"/> </menu>

4.main.xml:主界面布局

那段雨骤风狂。人生之旅本就是风雨兼程,是要说曾经拥有,

Android笔记二十九. 一款简易画图板开发

相关文章:

你感兴趣的文章:

标签云: