黑马程序员技术交流社区

标题: Android手绘图、形 [打印本页]

作者: 老衲玩IT    时间: 2013-8-26 10:39
标题: Android手绘图、形
  1. /**
  2. * 手指绘图
  3. * @author Administrator
  4. *
  5. */
  6. public class FingerPaint extends GraphicsActivity
  7.         implements ColorPickerDialog.OnColorChangedListener {   
  8.        
  9.     private Paint       mPaint;
  10.     private MaskFilter  mEmboss;
  11.     private MaskFilter  mBlur;
  12.     @Override
  13.     protected void onCreate(Bundle savedInstanceState) {
  14.         super.onCreate(savedInstanceState);
  15.         setContentView(new MyView(this));
  16.         //创建画笔实例,反锯齿...
  17.         mPaint = new Paint();
  18.         mPaint.setAntiAlias(true);
  19.         mPaint.setDither(true);
  20.         mPaint.setColor(0xFFFF0000);
  21.         mPaint.setStyle(Paint.Style.STROKE);
  22.         mPaint.setStrokeJoin(Paint.Join.ROUND);
  23.         mPaint.setStrokeCap(Paint.Cap.ROUND);
  24.         mPaint.setStrokeWidth(12);
  25.         
  26.         mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },
  27.                                        0.4f, 6, 3.5f);
  28.         mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
  29.     }
  30.     public void colorChanged(int color) {
  31.         mPaint.setColor(color);
  32.     }
  33.     private static final int COLOR_MENU_ID = Menu.FIRST;
  34.     private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;
  35.     private static final int BLUR_MENU_ID = Menu.FIRST + 2;
  36.     private static final int ERASE_MENU_ID = Menu.FIRST + 3;
  37.     private static final int SRCATOP_MENU_ID = Menu.FIRST + 4;

  38.     //选项菜单
  39.     @Override
  40.     public boolean onCreateOptionsMenu(Menu menu) {
  41.         super.onCreateOptionsMenu(menu);      
  42.         menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c');
  43.         menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's');
  44.         menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z');
  45.         menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z');
  46.         menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z');

  47.         return true;
  48.     }
  49.    
  50.     @Override
  51.     public boolean onPrepareOptionsMenu(Menu menu) {
  52.         super.onPrepareOptionsMenu(menu);
  53.         return true;
  54.     }
  55.     //菜单选择事件处理
  56.     @Override
  57.     public boolean onOptionsItemSelected(MenuItem item) {
  58.         mPaint.setXfermode(null);
  59.         mPaint.setAlpha(0xFF);

  60.         switch (item.getItemId()) {
  61.             case COLOR_MENU_ID:
  62.                 new ColorPickerDialog(this, this, mPaint.getColor()).show();
  63.                 return true;
  64.             case EMBOSS_MENU_ID:
  65.                 if (mPaint.getMaskFilter() != mEmboss) {
  66.                     mPaint.setMaskFilter(mEmboss);
  67.                 } else {
  68.                     mPaint.setMaskFilter(null);
  69.                 }
  70.                 return true;
  71.             case BLUR_MENU_ID:
  72.                 if (mPaint.getMaskFilter() != mBlur) {
  73.                     mPaint.setMaskFilter(mBlur);
  74.                 } else {
  75.                     mPaint.setMaskFilter(null);
  76.                 }
  77.                 return true;
  78.             case ERASE_MENU_ID:
  79.                 mPaint.setXfermode(new PorterDuffXfermode(
  80.                                                         PorterDuff.Mode.CLEAR));
  81.                 return true;
  82.             case SRCATOP_MENU_ID:
  83.                 mPaint.setXfermode(new PorterDuffXfermode(
  84.                                                     PorterDuff.Mode.SRC_ATOP));
  85.                 mPaint.setAlpha(0x80);
  86.                 return true;
  87.         }
  88.         return super.onOptionsItemSelected(item);
  89.     }
  90.     /**
  91.      * 内部view的子类
  92.      * canvas作为画布,paint作为画笔
  93.      * 根据手指的触屏事件更改mpath路径
  94.      * onDraw实时带出mpath路径
  95.      * @author Administrator
  96.      *
  97.      */
  98.     public class MyView extends View {
  99.         
  100.         private static final float MINP = 0.25f;
  101.         private static final float MAXP = 0.75f;
  102.         
  103.         private Bitmap  mBitmap;
  104.         private Canvas  mCanvas;
  105.         private Path    mPath;
  106.         private Paint   mBitmapPaint;
  107.         
  108.         public MyView(Context c) {
  109.             super(c);
  110.             //产生前景图
  111.             mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
  112.             mCanvas = new Canvas(mBitmap);
  113.             mPath = new Path();
  114.             mBitmapPaint = new Paint(Paint.DITHER_FLAG);
  115.         }

  116.         @Override
  117.         protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  118.             super.onSizeChanged(w, h, oldw, oldh);
  119.         }
  120.         //自动重绘
  121.         @Override
  122.         protected void onDraw(Canvas canvas) {
  123.             canvas.drawColor(0xFFAAAAAA);
  124.             //绘前景
  125.             canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
  126.             //给手指轨迹
  127.             canvas.drawPath(mPath, mPaint);
  128.         }
  129.         
  130.         private float mX, mY;
  131.         private static final float TOUCH_TOLERANCE = 4;
  132.         
  133.         private void touch_start(float x, float y) {
  134.             mPath.reset();
  135.             mPath.moveTo(x, y);
  136.             mX = x;
  137.             mY = y;
  138.         }
  139.         private void touch_move(float x, float y) {
  140.             float dx = Math.abs(x - mX);
  141.             float dy = Math.abs(y - mY);
  142.             if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
  143.                 mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
  144.                 mX = x;
  145.                 mY = y;
  146.             }
  147.         }
  148.         private void touch_up() {
  149.             mPath.lineTo(mX, mY);
  150.             // commit the path to our offscreen
  151.             mCanvas.drawPath(mPath, mPaint);
  152.             // kill this so we don't double draw
  153.             mPath.reset();
  154.         }
  155.         //角屏事件
  156.         @Override
  157.         public boolean onTouchEvent(MotionEvent event) {
  158.             float x = event.getX();
  159.             float y = event.getY();
  160.             
  161.             switch (event.getAction()) {
  162.                     //按下
  163.                 case MotionEvent.ACTION_DOWN:
  164.                     touch_start(x, y);
  165.                     invalidate();
  166.                     break;
  167.                 //滑动
  168.                 case MotionEvent.ACTION_MOVE:
  169.                     touch_move(x, y);
  170.                     invalidate();
  171.                     break;
  172.                 //抬起
  173.                 case MotionEvent.ACTION_UP:
  174.                     touch_up();
  175.                     invalidate();
  176.                     break;
  177.             }
  178.             return true;
  179.         }
  180.     }
  181.    
  182. }
复制代码

作者: 许庭洲    时间: 2013-8-27 19:14
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2