Android 开源可缩放平移的绘画板
ScaleSketchPadDemo
此项目包含两个模块
- app1 为普通绘画板
- app2 为可所发的绘画板
方便各位Android 开发者理解和使用
用法:
进入项目根目录:https://github.com/ShaunSheep/ScaleSketchPadDemo
clone or download 项目到本地,
打开Android Studio—>file—>new—>import new moudle—>选中本地的app或aap2
项目简介
| 普通绘画板 | 可缩放平移绘画板 | |
|---|---|---|
| 效果图 | ![]() |
![]() |
| 事件图 | ![]() |
![]() |
| uml图 | ![]() |
![]() |
普通绘画板
有五大功能:
- 普通绘画
- 在图片上绘画
- 改变画笔颜色
- 改变画笔粗细
- 撤销操作
- 添加图片
绘画功能

在图片上绘画

改变画笔颜色

改变画笔粗细

添加图片

绘画板原理:
注意: Pathview 没有绘制的能力,具备绘制能力的是PointPath
这张图说明了:事件传递的过程、处理事件的方式

基本知识:
View具有onTouchEvent(Motionevent event)函数,可以接收触摸事件
图,描述用户一次触摸滑动的过程,系统产生event的情况;打印log,画图无穷小的点

一次 touch event log:
action test: finger down
action test: finger move
action test: finger move
action test: finger move
action test: finger move
action test: finger move
action test: finger move
action test: finger move
action test: finger up
实现思路

PointPath 是实际具有绘画能力的类:
- 存储点的状态(橡皮、普通点、粗细、颜色)
- 接收Canvas进行绘制
PathView 是PointPath的控制类,继承自View:
- 接收Touch事件,并处理响应的event
- 存储每一条Path
- onDraw()中调用PointPath类进行绘制
难点
- View 的 onTouchEvent()
- 每接收到一个Event,都需要break结束判断
- 存储Point的时机——>Action_Move——>记得break结束判断流程
- 存储Path的时机——>Action_Up——>记得break结束判断流程
- move和up结束前,都要invalidte
- 橡皮擦功能
- Paint.setXformode()属性,本质就是同一个位置,两个点进行集合运算
- onDraw()中需要新建临时canvas,临时Bitmap
可缩放的绘画板
app2 增加了缩放功能
双手缩放平移VS普通状态


缩放、平移原理
缩放功能设计
双手触摸屏幕缩放、平移操作,打印出的log(也就是系统反馈给开发者的触摸事件):
action test: finger down
action test: action_pointer_down
action test: action_move
action test: action_move
action test: action_move
action test: action_move
action test: action_move
action test: action_move
action test: action_up
插入图片:缩放图原理

基本知识
- view 的缩放属性,平移属性
view.setscaleX()
view.setscaleY()
view.setX()
view.setY() - viewgroup和子view的事件传递
return true 即为消耗event

难点
- 计算缩放比例、控制缩放的大小,保证图片不越界
- 画板缩放之后,手势画出的线条发生偏移,计算平移值,对坐标点进行加减运算即可
- 子view和viewgroup的事件拦截
Android 开源可缩放平移的绘画板的更多相关文章
- Android实现支持缩放平移图片
本文主要用到了以下知识点 Matrix GestureDetector 能够捕捉到长按.双击 ScaleGestureDetector 用于检测缩放的手势 自由的缩放 需求:当图片加载时,将图片在屏幕 ...
- Android绘画板(普通绘画模式和缩放平移绘画模式)
ScaleSketchPadDemo 项目地址: demo apk体验下载 demo2 apk体验下载 用法: 进入项目根目录:https://github.com/ShaunSheep/ScaleS ...
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...
- 2015-2016最火的Android开源项目--github开源项目集锦(不看你就out了)
标签: Android开发开源项目最火Android项目github 2015-2016最火的Android开源项目 本文整理与集结了近期github上使用最广泛最火热与最流行的开源项目,想要充电与提 ...
- Android开源项目分类汇总
目前包括: Android开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
- 59.Android开源项目及库 (转)
转载 : https://github.com/Tim9Liu9/TimLiu-Android?hmsr=toutiao.io&utm_medium=toutiao.io&utm_so ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- GitHub上史上最全的Android开源项目分类汇总
今天在看博客的时候,无意中发现了 @Trinea 在GitHub上的一个项目 Android开源项目分类汇总 ,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫 ...
- Android 开源项目分类汇总(转)
Android 开源项目分类汇总(转) ## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Galler ...
随机推荐
- 【.net 深呼吸】监听剪贴板更新(针对Vista之后系统)
针对 XP 及以前的监视剪贴板更改的方法就不讲了,因为 XP 已严重过时.本篇老周介绍的方法面向 Vista 以上的系统. 在托管应用程序中监听剪贴板更新行为必须用到 Win 32 API ,具体做法 ...
- Android性能优化:ViewStub
在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局.那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在 ...
- mooc上学习acllib后写的包含背景音乐的小涂鸦板(初入江湖,大佬勿喷)
#include "acllib.h"ACL_Sound sound1;ACL_Image img;//开始图ACL_Image img1;//涂鸦图ACL_Color c=RED ...
- Oozie时出现Exception in thread "main" java.lang.UnsupportedClassVersionError: com/mysql/jdbc/Driver : Unsupported major.minor version 52.0?
不多说,直接上干货! 问题详情 [hadoop@bigdatamaster oozie--cdh5.5.4]$ bin/ooziedb.sh create -sqlfile oozie.sql -ru ...
- 百度地图JavaScript API使用
最近在完成优达学城前端开发(入门)课程的P4项目中,要求调用google地图进行交互,项目已提供部分js代码和html代码.但在申请google地图API密钥时由于网络等原因,打不开或者连接超时,所以 ...
- 给ubuntu的swap分区增加容量
1.创建一个 Swap 文件. mkdir swap cd swap sudo dd if=/dev/zero of=swapfile bs=1024 count=100000 出现下列提示,上面命令 ...
- Python初识(PyMysql实例)
为什么学习python呢,好吧,其实我也不知道,反正就是想学习了. 资料什么的全都low了,传值博客免费的就够.不要问我为什么,我基本上都是找的免费的视频.然后传值博客的最多,我真的不是打广告. py ...
- 说一说Jquery中的empty()与remove()的区别和用法
今天在改一个新人写的代码,好吧,我承认改代码比自己写代码要来的痛苦. 主要是在测试一个table.table中有一列是删除操作.我的删除功能是 这样的,当点击删除的时候,判断这个table中的tr行是 ...
- Android学习笔记- Fragment实例 底部导航栏的实现
1.要实现的效果图以及工程目录结构: 先看看效果图吧: 接着看看我们的工程的目录结构: 2.实现流程: Step 1:写下底部选项的一些资源文件 我们从图上可以看到,我们底部的每一项点击的时候都有不同 ...
- httpd页面用户访问认证控制
[root@liubin-pc ~]# yum install -y httpd 客户机地址限制 通过配置Order.Deny from.Allow from 来限制客户机 allow.deny :先 ...