Android 画图板程序实例(SketchPad)
生活随笔
收集整理的這篇文章主要介紹了
Android 画图板程序实例(SketchPad)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近沒什么事情,寫過一個畫圖板的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的過程就相反。
這個是我的第一個個人產品《UEFA.com新聞客戶端》,大家關注一下,謝謝 http://apk.hiapk.com/html/2013/06/1511803.html
功能說明:
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的過程就相反。
這個是我的第一個個人產品《UEFA.com新聞客戶端》,大家關注一下,謝謝 http://apk.hiapk.com/html/2013/06/1511803.html
總結
以上是生活随笔為你收集整理的Android 画图板程序实例(SketchPad)的全部內容,希望文章能夠幫你解決所遇到的問題。