先上图:

关键是在检測到手指移动的时候用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下载

创建android画笔程序的样例(有镜面效果)的更多相关文章

  1. MapGuide应用程序演示样例——你好,MapGuide!

    图 3‑4显示了基于MapGuide的Web应用程序的开发流程,整个开发流程能够分为五个阶段.图中,矩形代表任务,椭圆形被任务使用的或被任务创建的实体,箭头代表数据流. 1) 载入文件类型的数据,配置 ...

  2. 【UNIX网络编程(三)】TCP客户/server程序演示样例

    上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...

  3. 使用Android编写录制视频小程序演示样例

    主要实现录制功能的类:Camera类和MediaRecorder类.功能描写叙述:首先进入视频录制界面,点击录像button进入录像功能界面,点击录制開始录制视频, 点击停止button,将录制的视频 ...

  4. 基于Android Fragment功能的样例

    通过近期空暇时候对Fragment的学习,尝试着写了一个小Demo,将在开发的时候能经常使用到的Fragment知识放在一起,写过了这个Demo对Android Fragment的了解更加深入了,以后 ...

  5. android一个上传图片的样例,包含怎样终止上传过程,假设在上传的时候更新进度条(一)

    先上效果图: Layout为: <? xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  6. android发送短信样例

    Android应用开发中我们经常须要发送手机短信.这对于android平台来说,是最简单只是的功能了,无需太多代码,也无需自己定义代码,仅仅须要调用android提供的消息管理类SmsManager就 ...

  7. 使用JavaScript定义一个微信小程序插件样例

    var wxTimer = new wxTimer({ beginTime: "00:00:20", complete: function () { wx.redirectTo({ ...

  8. Android之——流量管理程序演示样例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47680811 眼下.市面上有非常多管理手机流量的软件,能够让用户实时获取到自己手机 ...

  9. Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7884628 前面我们已经学习过Android应 ...

随机推荐

  1. ORACLE实例恢复过程详细分析--使用dump、BBED等多种工具结合分析

    ---友情提示,内容较多,可以从博文左上的+目录选择小节方便阅读.  实验思路:  --实验相关TRACE文件:http://download.csdn.net/detail/q947817003/6 ...

  2. debian网易163更新服务器 源

    sudo vi /etc/apt/sources.list 加入如下内容即可: deb http://mirrors.163.com/debian/ jessie main non-free cont ...

  3. 暴力或随机-hdu-4712-Hamming Distance

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4712 题目大意: 求n个20位0.1二进制串中,两两抑或最少的1的个数. 解题思路: 两种解法: 1 ...

  4. 数据库元数据MetaData

    本篇介绍数据库方面的元数据(MetaData)的有关知识.元数据在建立框架和架构方面是特别重要的知识,再下一篇我们仿造开源数据库工具类DbUtils就要使用数据库的元数据来创建自定义JDBC框架. 在 ...

  5. 如何制定AxureRP设计体系

    经常有朋友问我,如何在从来没有用过AxureRP的公司或者团队里面开始使用AxureRP做原型设计?这个问题对个体来说不存在,因为个人学习使用AxureRP时非常快速的,基本试着做几个原型实例就能把整 ...

  6. 安装m2eclipse

    Help->Eclipse Marketplace- 搜索 maven 安装 Maven Integration for Eclipse

  7. Android - 设置adb的usb连接配置

    设置adb的usb连接配置 本文地址: http://blog.csdn.net/caroline_wendy 把须要測试的手机连接入电脑.通过系统查找USB连接配置,找到厂商ID: 把ID加入进ad ...

  8. SQL_查找用户的表属于哪个表空间

    ***********************************************声明*************************************************** ...

  9. hbase memstorelab

    关于MemStore的补充 在通过HStore.add向store中加入�一个kv时,首先把数据写入到memstore中.这一点没有什么说明: publiclongadd(finalKeyValue ...

  10. Vertica数据库操作

    删除主键(Vertica数据库的主键值并非唯一的): SELECT ANALYZE_CONSTRAINTS('fb_s.c_log'); 找到key名,再: ALTER TABLE fb_s.c_lo ...