当前位置: 主页 > 安卓开发 > android开发 >

Android 画图板程序实例(SketchPad)

泡在网上的日子 发表于 2013-05-27 19:57 次阅读

最近没什么事情,写过一个画图板的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需要指定项如下:

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));


注意红色这句话,相当重要,不要忘记了,具体的几种模式可以去查一下。也可以参看android的APIDemo的com.example.android.apis.graphics/Xfermodes.java

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

对于画图板而言,画线,画橡皮都没有什么本质的区别,都是画。所以画图板应该依赖于一个抽象的东西,所以我提出了一个ISketchPadTool接口,它定义了
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);


画笔与橡皮去实现这些接口方法。
每画一笔,都认为是一步,每一步都是一个ISketchPadTool的接口对象,把它放到一个栈里面,undo时就把undo栈顶的元素去掉,放到redo的栈里面,再把余下的再重新画出来。redo的过程就相反。

本文转载自:http://blog.csdn.net/leehong2005/article/details/7334959

上一篇:Android 程序框架设计
1、一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 什么是设计模式? 设计模式是在某种特别的情况下,针对某种
下一篇:Android应用设计:从糟糕到成熟
Nielsen最近的研究数据表明,Android系统的设备已经在数量上超过iOS系统了,所以并不难看出Android市场的繁荣正如日中天:有4.8亿的用户正在使用Android设备,每天有100万个新的设备被激活。这意味着,每三个星期,新激活的Android设备数几乎等于整个澳大利