android-API之FingerPaint手指绘图详解

转载 2012年03月27日 21:06:06

效果图

 

 

不多废话,马上弄源码。

 

 

 

主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

Android手指绘图Demo

/** * Android写字板Demo(包括颜色选择,图形外观处理及Xfermode示例) * @description: * @author ldm * @date 2016-4-26 上...
  • true100
  • true100
  • 2016年04月26日 10:40
  • 1112

Android手指绘图(一)

package cn.c; import java.io.OutputStream; import android.app.Activity; import android.content.In...
  • lfdfhl
  • lfdfhl
  • 2013年01月03日 14:06
  • 1301

深入了解java绘图机制

Java绘图机制
  • nlznlz
  • nlznlz
  • 2015年09月21日 01:51
  • 2350

[Qt教程] 第18篇 2D绘图(八)双缓冲绘图

[Qt教程] 第18篇 2D绘图(八)双缓冲绘图 楼主  发表于 2013-5-2 22:07:23 | 查看: 789| 回复: 1 ...
  • dengjin20104042056
  • dengjin20104042056
  • 2013年11月11日 10:55
  • 1256

Skia往SkBitmap上绘图时画不出来的问题

使用SkBitmap作为SkCanvas后端绘图时画不出来的问题的解决过程……
  • foruok
  • foruok
  • 2016年02月23日 09:26
  • 3837

简单的手指绘图并保存所绘图片【源码】

public class SimpleFingerDraw extends Activity implements OnTouchListener, OnClickListener { Imag...
  • panda1234lee
  • panda1234lee
  • 2013年03月27日 16:41
  • 1131

在AChartEngine上绘图,手指标记当前位置

最近要做一个绘图项目,需要在ACE折线图上再绘出一条红标记当前坐标,经过这几天研究,可以给大家分享一下了。先上效果图吧!     代码里的注释还是比较清楚,就不作说明了。 packag...
  • u014702332
  • u014702332
  • 2016年03月15日 11:41
  • 266

一个随手指移动的自定义View和一个随手指移动的ImageView(附源码)

效果以及区别 这是两个项目,一个是myView继承自View,一个是myImageView继承自ImageView,myView中的圆形会根据手指移动,即使手指并未点到圆形上。myImageView是...
  • fuckluy
  • fuckluy
  • 2016年12月15日 17:40
  • 1391

对Qt中双缓冲绘图的理解

对Qt中双缓冲绘图的理解 原教程 :http://bbs.qter.org/forum.php?mod=viewthread&tid=120&extra=page%3D1%26filter%3D...
  • qq_23853503
  • qq_23853503
  • 2017年01月22日 15:54
  • 325

MFC画图方法汇总

1. 画线 方法I:使用HDC HDC hdc; hdc=::GetDC(m_hWnd); MoveToEx(hdc,point1.x,point1.y,NULL); //移动到起点 L...
  • jiangqin115
  • jiangqin115
  • 2014年12月04日 17:45
  • 1122
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android-API之FingerPaint手指绘图详解
举报原因:
原因补充:

(最多只允许输入30个字)