先上图:

创建android画笔程序的样例(有镜面效果)


关键是在检測到手指移动的时候用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@Overridepublic 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():

@Overrideprotected 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. Android手指绘图Demo
  2. Activity中那些需要重写的方法
  3. Android监测手指上下左右滑动屏幕
  4. Android重写返回按钮退回桌面(根据源码查看)
  5. Android重写OnTouchListener实现双击事件的监听
  6. android: 静态XML和动态加载XML混合使用,以及重写Layout控件
  7. android中随手指拖动滑屏
  8. android Kotlin 继承、派生、接口、构造方式,方法、属性重写
  9. android 控件跟随手指移动,类似捕鱼达人效果

随机推荐

  1. 简单翻译android WebView 官网
  2. sensor传感器
  3. Ubuntu+Cmake-gui+OpenCV+Opencv_contrib
  4. 简单创建Android(安卓)MVVM模式代码
  5. [Git使用] git Command line instruction
  6. enable ftrace in android kernel
  7. android之转化inputstream为list
  8. 带标题的RecyclerViewAdapter
  9. android 动态实现点击ImageButton更换图
  10. ADT20安装报错