標籤:
我前一段時間在製作塗鴉板的過程中在處理橡皮擦功能上碰上了一些小問題,網上部分資源提到的實現方法和我下面說到的橡皮擦基本方法實現思路大仿類似,以下是基本思路:
橡皮擦就是用和畫布顏色一致顏色的畫筆在螢幕觸摸,實現橡皮擦的功能。
1)初始化畫筆,並且設定畫筆的顏色為白色(這裡其實要設定為畫布的顏色)。
2)設定畫筆的大小為合適的大小。
3)用一個變數記住橡皮擦的顏色,用於在其他動作後重新使用橡皮擦。
以上為簡易的橡皮擦主要是使用和畫布相同的的顏色來覆蓋,但當背景圖為一張照片(背景圖)時是不可行的,因為顏色會很明顯的展示在背景圖上,而且需要注意的是:即使是將畫筆顏色變為透明色也是不可行的,綜上我們選擇用渲染模式來處理橡皮擦
這裡選擇渲染模式Xfermode的DIS_IN,這樣我們處理後會發現出現黑色陰影邊框,效果實現了,但是bug非常明顯
之後選擇渲染模式的CLEAR這個模式會擦除所有像素點,但是發現是以黑色線條的形式去擦除的
通過STACK OVER FLOW網站超找到兩者解決辦法:
1.改變touch_move方法的path畫圖的相關方法,效果實現了但是對撤銷和重做造成了一定影響(並且所畫線不再圓滑),最終沒有選用
privatevoid touch_move(float x,float y){
float dx =Math.abs(x- mX);
float dy =Math.abs(mY- y);
if(dx>= TOUCH_TOLERANCE|| dy>= TOUCH_TOLERANCE){
// 從x1,y1到x2,y2畫一條貝茲路徑,更平滑(直接用mPath.lineTo也可以)
// mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mPath.lineTo(mX, mY);
mCanvas.drawPath(mPath, mPaint);
//將一條完整的路徑儲存下來(相當於入棧操作)
savePath.add(dp);
mPath.reset();
mPath.moveTo(mX, mY);
mX= x;
mY= y;
}
}
privatevoid touch_up(){
mPath=null;// 重新置空
//mPath.reset();
}
2.最終發現只需要設定預設type就能解決該問題
setLayerType(LAYER_TYPE_SOFTWARE,null);//設定預設樣式,去除dis-in的黑色方框以及clear模式的黑線效果
橡皮擦相關代碼
if (currentStyle == 1) {//正常畫筆 mPaint.setStrokeWidth(currentSize); mPaint.setColor(currentColor); } else {//橡皮擦 mPaint.setAlpha(0); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mPaint.setColor(Color.TRANSPARENT); mPaint.setStrokeWidth(50); }
Android關於建立塗鴉板過程中出現的小問題