先上图:

关键是在检測到手指移动的时候用mPath.quadTo的方法,android sdk解释是:

Add a quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for this contour, the first point is automatically set to (0,0).

中文是用贝塞尔曲线链接了(x1,y1),(x2,y2)这两个点,假设没有moveTo()这种方法调用的话,第一个点默觉得(0,0)

android绘图是用Canvas的API,如画一个实心的矩形,能够用在重写一个View的onDraw():

<span style="white-space:pre">		</span>Rect rect = new Rect(100,100,500,500);
mPaint.setStrokeWidth(5); //设置画笔的粗细
mPaint.setColor(Color.RED); //设置画笔的颜色
mPaint.setStyle(Style.FILL); //填充整个图形
mPaint.setAntiAlias(true); //抗锯齿效果
canvas.drawRect(rect, mPaint);

对于检測手指的移动,我们能够用onTouchEvent来实现:

	private float mX, mY;
private float mOppositeX, mOppositeY;
private static final float TOUCH_TOLERANCE = 4; //当手指移动超过4时我们才去set Path @Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY(); switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
if(isMirrorDraw) {
touch_opposite_start(x, y);
}
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
if(isMirrorDraw) {
touch_opposite_move(x, y);
}
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
if(isMirrorDraw) {
touch_opposite_up();
}
invalidate();
break;
}
return true;
} private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
} private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
} private void touch_up() {
mPath.lineTo(mX, mY);
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
} private void touch_opposite_up() {
mOppositePath.lineTo(mOppositeX, mY);
mCanvas.drawPath(mOppositePath, mOppoPaint);
mOppositePath.reset();
} private void touch_opposite_move(float x, float y) {
float oppositeX = OppositeDrawActivity.screenWidth - x; //<span style="font-family: Arial, Helvetica, sans-serif;">OppositeDrawActivity.screenWidth是屏幕宽度</span>
float dx = Math.abs(oppositeX - mOppositeX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mOppositePath.quadTo(mOppositeX, mY, (mOppositeX + oppositeX) / 2, (y + mY) / 2);
mOppositeX = oppositeX;
mY = y;
}
} private void touch_opposite_start(float x, float y) {
mOppositePath.reset();
float oppositeX = OppositeDrawActivity.screenWidth - x;
mOppositePath.moveTo(oppositeX, y);
mOppositeX = oppositeX; }

然后重写onDraw():

@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xFFAAAAAA);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
if(isMirrorDraw) {
canvas.drawPath(mOppositePath, mOppoPaint);
}
}

代码能够在http://download.csdn.net/detail/baidu_nod/7572549下载

最新文章

  1. 背水一战 Windows 10 (37) - 控件(弹出类): MessageDialog, ContentDialog
  2. IO复用三种方式
  3. jboss jms 实例
  4. DSP using MATLAB 示例Example3.17
  5. Scrum Meeting (Oct. 27 2014)
  6. 关于 Android项目“error: Apostrophe not preceded by \ (”的解决方法
  7. linux服务器下发送邮件
  8. solr4.0.0学习(二) 数据库导入clob与blob为索引
  9. HDU-5532(LIS-nlogn)
  10. Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
  11. LeetCode 58 Spiral Matrix II
  12. servlet核心API的UML图
  13. apache如何在虚拟主机中实现用户验证
  14. 83. 从视图索引说Notes数据库(上)
  15. Spark RDD算子介绍
  16. 使用JavaScript生成二维码教程-附qrcodejs中文文档
  17. qml demo分析(abstractitemmodel-数据分离)
  18. JAVA的入门代码
  19. css图片根据div宽高比例自适应
  20. ORACLE分页查询SQL语法——高效的分页

热门文章

  1. POJ 2031 prim
  2. android软键盘的管理和属性的设置
  3. opengl学习笔记(二)
  4. 基于visual Studio2013解决面试题之1405归并排序
  5. &lt;转载&gt;div+css布局教程之div+css常见布局结构定义
  6. Git flow 的流程
  7. maven生成war包的两种方式
  8. Linux 静态库&amp;动态库调用
  9. 1.1.5-学习Opencv与MFC混合编程之---画图工具 输入文字和填充图像 修改光标
  10. hdu 4691 Front compression (后缀数组)