Android 画图板程序实例(SketchPad)
来源:互联网 发布:淘宝美工累吗 编辑:程序博客网 时间:2024/05/21 22:40
最近没什么事情,写过一个画图板的DEMO(sketchpad),发出来与大家分享。
功能说明:
1、能画线(Pen),能擦除(Eraser),清除(Clear)。
2、Undo,Redo功能。
3、保存,加载笔迹(Stroke)。
4、画笔颜色。
5、画板背景色。
6、画笔,橡皮大小。
7、选择画景图片。
如何需要source,请与我联系:leehong2005@163.com
先看看效果图片:
画图板主界面
画笔
橡皮
画笔颜色
选择一种颜色后
不同颜色的画笔及不同大小的画笔
选择背景图片界面(从SDCard中查找图片)
找到图片后的界面
选择一张背景图片后
如何实现?
技术点:
1、笔画如何擦除及如何做到平滑
2、如何保存
3、如何绘制
4、如何找到SDCard中的图片
5、undo与redo如何设计
6、整体架构如何设计
这里代码太多,我只说一下我的思路:
1、画线用path画,这是肯定的。如果只是两点之间连线的话,会很不平滑。用这个方法就可以:
Path::quadTo,具体如何用可以去查,这个是画二次曲线的。画Path会指定一个Paint,画线的Paint需要指定项如下:
画橡皮需要指定项为:
注意红色这句话,相当重要,不要忘记了,具体的几种模式可以去查一下。也可以参看android的APIDemo的com.example.android.apis.graphics/Xfermodes.java
2、绘制是直接画在canvas上面的,在canvas里面设置一个Bitmap,最后就可以把这个Bitmap保存起来。
3、绘制应该处理onTouch的ACTION_DOWN、ACTION_UP和ACTION_MOVE事件。
4、找SDCard中的图片,
5、undo与redo
对于画图板而言,画线,画橡皮都没有什么本质的区别,都是画。所以画图板应该依赖于一个抽象的东西,所以我提出了一个ISketchPadTool接口,它定义了
画笔与橡皮去实现这些接口方法。
每画一笔,都认为是一步,每一步都是一个ISketchPadTool的接口对象,把它放到一个栈里面,undo时就把undo栈顶的元素去掉,放到redo的栈里面,再把余下的再重新画出来。redo的过程就相反。
功能说明:
1、能画线(Pen),能擦除(Eraser),清除(Clear)。
2、Undo,Redo功能。
3、保存,加载笔迹(Stroke)。
4、画笔颜色。
5、画板背景色。
6、画笔,橡皮大小。
7、选择画景图片。
如何需要source,请与我联系:leehong2005@163.com
先看看效果图片:
画图板主界面
画笔
橡皮
画笔颜色
选择一种颜色后
不同颜色的画笔及不同大小的画笔
选择背景图片界面(从SDCard中查找图片)
找到图片后的界面
选择一张背景图片后
如何实现?
技术点:
1、笔画如何擦除及如何做到平滑
2、如何保存
3、如何绘制
4、如何找到SDCard中的图片
5、undo与redo如何设计
6、整体架构如何设计
这里代码太多,我只说一下我的思路:
1、画线用path画,这是肯定的。如果只是两点之间连线的话,会很不平滑。用这个方法就可以:
Path::quadTo,具体如何用可以去查,这个是画二次曲线的。画Path会指定一个Paint,画线的Paint需要指定项如下:
m_penPaint.setAntiAlias(true); m_penPaint.setDither(true); m_penPaint.setColor(penColor); m_penPaint.setStrokeWidth(penSize); m_penPaint.setStyle(Paint.Style.STROKE); m_penPaint.setStrokeJoin(Paint.Join.ROUND); m_penPaint.setStrokeCap(Paint.Cap.ROUND);
m_eraserPaint.setAntiAlias(true); m_eraserPaint.setDither(true); m_eraserPaint.setColor(0xFF000000); m_eraserPaint.setStrokeWidth(eraserSize); m_eraserPaint.setStyle(Paint.Style.STROKE); m_eraserPaint.setStrokeJoin(Paint.Join.ROUND); m_eraserPaint.setStrokeCap(Paint.Cap.SQUARE); m_eraserPaint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.DST_OUT));
2、绘制是直接画在canvas上面的,在canvas里面设置一个Bitmap,最后就可以把这个Bitmap保存起来。
3、绘制应该处理onTouch的ACTION_DOWN、ACTION_UP和ACTION_MOVE事件。
4、找SDCard中的图片,
ContentResolver cr = context.getContentResolver(); String[] proj = { MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.ALBUM, MediaStore.Video.Media.ARTIST, MediaStore.Video.Media.CATEGORY, MediaStore.Video.Media.DESCRIPTION, MediaStore.Video.Media.RESOLUTION, MediaStore.Video.Media.DURATION, }; Uri baseUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; Cursor c = cr.query(baseUri, proj, null, null, null);
5、undo与redo
public void draw(Canvascanvas); public boolean hasDraw(); public void cleanAll(); public void touchDown(float x, float y); public void touchMove(float x, float y); public void touchUp(float x, float y);
这个是我的第一个个人产品《UEFA.com新闻客户端》,大家关注一下,谢谢
http://apk.hiapk.com/html/2013/06/1511803.html
- Android 画图板程序实例(SketchPad)
- 画图板程序
- winform 画图板程序
- android画图板原理
- Android画图板 - 功能简介
- Android画图板 - 开发要点
- Android画图板 - 抽象图形
- Android画图板 - 创建图形
- Android画图板 - 设置偏好
- Android画图板 - 菜单功能
- Android画图板 - 保存图像
- Android画图板 相关下载
- HTML5 06 canvas实例 画图板
- 画图板
- 画图板
- 画图板
- 画图板
- 画图板
- 淘宝开放平台
- How to use cuda-gdb
- Ajax应用常见的HTTP ContentType设置
- 动态绑定事件插件—livequery
- 安装软件备忘贴
- Android 画图板程序实例(SketchPad)
- 面试前的平静
- php-fpm不能正常启动的解决办法
- Comparing Two High-Performance I/O Design Patterns
- SSH三大框架的工作原理及流程
- 01
- Shader基础概念
- Android 读取本地(SD卡)图片
- 自动链接JIRA问题至Confluence页面