关闭

android-API之FingerPaint手指绘图详解

730人阅读 评论(0) 收藏 举报

效果图

 

 

不多废话,马上弄源码。

 

 

 

主Activity类DemoViewPath.java

  1. package com.geolo.android.demoViewPath;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. public class DemoViewPath extends Activity {  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         DemoPath dp = new DemoPath(this);  
  8.         setContentView(dp);  
  9.         super.onCreate(savedInstanceState);  
  10.     }  
  11. }  
 

 

绘图类:DemoPath.java

  1. package com.geolo.android.demoViewPath;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Paint;  
  6. import android.graphics.Path;  
  7. import android.view.MotionEvent;  
  8. import android.view.View;  
  9. public class DemoPath extends View {  
  10.     private float mX , mY;  
  11.     private Path mPath;  
  12.     private Paint mPaint;  
  13.     private static final float TOUCH_TOLERANCE = 4;  
  14.     private Bitmap  mBitmap;  
  15.     private Canvas  mCanvas;  
  16.     private Paint   mBitmapPaint;  
  17.       
  18.     public DemoPath(Context c) {  
  19.         super(c);  
  20.           
  21.         mPaint = new Paint();//创建画笔渲染对象  
  22.         mPaint.setAntiAlias(true);//设置抗锯齿,让绘画比较平滑  
  23.         mPaint.setDither(true);//设置递色  
  24.         mPaint.setColor(0xFFFF0000);//设置画笔的颜色  
  25.         mPaint.setStyle(Paint.Style.STROKE);//画笔的类型有三种(1.FILL 2.FILL_AND_STROKE 3.STROKE )  
  26.         mPaint.setStrokeJoin(Paint.Join.ROUND);//默认类型是MITER(1.BEVEL 2.MITER 3.ROUND )  
  27.         mPaint.setStrokeCap(Paint.Cap.ROUND);//默认类型是BUTT(1.BUTT 2.ROUND 3.SQUARE )  
  28.         mPaint.setStrokeWidth(12);//设置描边的宽度,如果设置的值为0那么边是一条极细的线  
  29.           
  30.         mBitmap = Bitmap.createBitmap(320480, Bitmap.Config.ARGB_8888);//绘制固定大小的bitmap对象  
  31.         mCanvas = new Canvas(mBitmap);//将固定的bitmap对象嵌入到canvas对象中  
  32.         mPath = new Path();//创建画笔路径  
  33.         mBitmapPaint = new Paint(Paint.DITHER_FLAG);  
  34.     }  
  35.     @Override  
  36.     protected void onDraw(Canvas canvas) {  
  37.         canvas.drawColor(0xFFAAAAAA);  
  38.         canvas.drawBitmap(mBitmap, 00, mBitmapPaint);  
  39.         canvas.drawPath(mPath, mPaint);  
  40.         super.onDraw(canvas);  
  41.     }  
  42.     private void onTouchDown(float x , float y){  
  43.         mPath.reset();//将上次的路径保存起来,并重置新的路径。  
  44.         mPath.moveTo(x, y);//设置新的路径“轮廓”的开始  
  45.         mX = x;  
  46.         mY = y;  
  47.     }  
  48.     private void onTouchMove(float x , float y){  
  49.         float dx = Math.abs(x - mX);  
  50.         float dy = Math.abs(y - mY);  
  51.         if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {  
  52.             mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);  
  53.             mX = x;  
  54.             mY = y;  
  55.         }  
  56.     }  
  57.     private void onTouchUp(float x , float y){  
  58.         mPath.lineTo(mX, mY);//从最后一个指定的xy点绘制一条线,如果没有用moveTo方法,那么起始点表示(0,0)点。  
  59.         // commit the path to our offscreen  
  60.         mCanvas.drawPath(mPath, mPaint);//手指离开屏幕后,绘制创建的“所有”路径。  
  61.         // kill this so we don't double draw  
  62.         mPath.reset();  
  63.     }  
  64.     @Override  
  65.     public boolean onTouchEvent(MotionEvent event) {  
  66.         float x = event.getX();  
  67.         float y = event.getY();  
  68.         switch (event.getAction()) {  
  69.         case MotionEvent.ACTION_DOWN://手指开始按压屏幕,这个动作包含了初始化位置  
  70.             onTouchDown(x , y);  
  71.             invalidate();//刷新画布,重新运行onDraw()方法  
  72.             break;  
  73.         case MotionEvent.ACTION_MOVE://手指按压屏幕时,位置的改变触发,这个方法在ACTION_DOWN和ACTION_UP之间。  
  74.             onTouchMove(x , y);  
  75.             invalidate();  
  76.             break;  
  77.         case MotionEvent.ACTION_UP://手指离开屏幕,不再按压屏幕  
  78.             onTouchUp(x , y);  
  79.             invalidate();  
  80.             break;  
  81.         default:  
  82.             break;  
  83.         }  
  84.         return true;  
  85.     }  
  86. }  
 原文地址:http://blog.csdn.net/geolo/article/details/6039169

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:261175次
    • 积分:4084
    • 等级:
    • 排名:第7888名
    • 原创:121篇
    • 转载:166篇
    • 译文:0篇
    • 评论:19条
    文章分类
    最新评论