package eoc.studio.voicecard.handwriting; import eoc.studio.voicecard.R; import eoc.studio.voicecard.utils.PaintUtility; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.EmbossMaskFilter; import android.graphics.MaskFilter; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Paint.Style; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class HandWritingView extends View { private static String TAG ="HandWritingView"; private Paint paint = null; private Canvas canvas = null; private static Bitmap originalBitmap = null; public static Bitmap new1Bitmap = null; private static Bitmap new2Bitmap = null; private static Bitmap tempBitmap; public static Bitmap saveImage = null; private float clickX = 0, clickY = 0; private float startX = 0, startY = 0; private boolean isClear = false; private static int color = Color.BLACK; // 設置畫筆的顏色 private static float strokeWidth = (float)PaintUtility.PEN_SIZE.SIZE_1; private static boolean isClearMode = false; private Path path; public HandWritingView(Context context) { this(context, null); init(); } public HandWritingView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public HandWritingView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { path = new Path(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; options.outWidth = PaintUtility.SKETTCHPAD.WIDTH; options.outHeight = PaintUtility.SKETTCHPAD.HEIGHT; Bitmap tempBitmap = Bitmap.createBitmap(PaintUtility.SKETTCHPAD.WIDTH, PaintUtility.SKETTCHPAD.HEIGHT, Bitmap.Config.ARGB_8888); // original backgroupd color // tempBitmap.eraseColor(android.graphics.Color.WHITE); // using backgroupd color tempBitmap.eraseColor(Color.TRANSPARENT); tempBitmap.setHasAlpha(true); // tempBitmap = BitmapFactory.decodeResource(getResources(), originalBitmap = tempBitmap.copy(Bitmap.Config.ARGB_8888, true); originalBitmap.setHasAlpha(true); new1Bitmap = Bitmap.createBitmap(originalBitmap); new1Bitmap.setHasAlpha(true); } public void clear() { isClear = true; // recyclingResources.recycleBitmap(new1Bitmap); new2Bitmap = Bitmap.createBitmap(originalBitmap); new2Bitmap.setHasAlpha(true); invalidate(); } public Bitmap saveImage() { if (saveImage == null) { return null; } return saveImage; } public void setImge() { saveImage = null; } public void setstyle(float strokeWidth) { Log.e(TAG, "setstyle() strokeWidth is "+strokeWidth); this.strokeWidth = strokeWidth; } public void setPenColor(int color){ this.color = color; } public void enableEraser(){ isClearMode = true; } public void disableEraser(){ isClearMode = false; } /** * 功能:完成畫板的相關操作 */ @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.clipRect(0, 0, PaintUtility.SKETTCHPAD.WIDTH, PaintUtility.SKETTCHPAD.HEIGHT);// 控制畫板的區域坐標(x,y,x+width,y+high); // canvas.drawColor(Color.argb(150, 120, 120, 0));//控制畫板的背景顏色 // canvas.drawColor(R.color.deeppink); canvas.drawBitmap(HandWriting(new1Bitmap), 0, 0, null); canvas.drawPath(path, paint); if(isClearMode){ } } /** * 功能:完成畫筆的操作,並返回bitmap對像 * * @param originalBitmap * @return */ @SuppressLint("HandlerLeak") public Bitmap HandWriting(Bitmap originalBitmap) { if (isClear) { canvas = new Canvas(new2Bitmap); } else { canvas = new Canvas(originalBitmap); } paint = new Paint(); if(isClearMode){ paint.setColor(Color.TRANSPARENT); paint.setXfermode(new PorterDuffXfermode( Mode.CLEAR)); Log.e(TAG, "HandWriting() paint.setXfermode(CLEAR)"); }else{ paint.setColor(this.color); // 設置畫筆的顏色 // Log.e(TAG, "HandWriting() this.color is"+this.color); // // Log.e(TAG, "HandWriting() paint.getXfermode(); is"+paint.getXfermode()); paint.setXfermode(null); } paint.setStyle(Style.STROKE); // Log.e(TAG, "HandWriting() strokeWidth is"+strokeWidth); paint.setStrokeWidth(this.strokeWidth); //設置畫筆的粗細 // paint.setStrokeWidth(penSize); // 設置畫筆的粗細 getMaskFilter(PaintUtility.PEN_TYPE.PLAIN_PEN); paint.setAntiAlias(true); // 抗鋸齒 paint.setDither(true); paint.setFilterBitmap(true); paint.setSubpixelText(true); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); if (isClear) { return new2Bitmap; } return originalBitmap; } /** * 功能:完成對畫筆路徑的操作,為了保證畫筆效果的光滑性,採用貝爾曲線法 */ @Override public boolean onTouchEvent(MotionEvent event) { startX = event.getX(); startY = event.getY(); Log.e(TAG, "onTouchEvent() startX "+startX+",startY "+startY); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchDown(event); return true; case MotionEvent.ACTION_MOVE: touchMove(event); return true; case MotionEvent.ACTION_UP: touchUp(event); return true; default: break; } return super.onTouchEvent(event); } /** * 功能:手指點下屏幕時調用 * * @param event */ private void touchDown(MotionEvent event) { clickX = startX; clickY = startY; // path繪製的繪製起點 path.moveTo(startX, startY); invalidate(); } /** * 功能:手指在屏幕上滑動時調用 * * @param event */ private void touchMove(MotionEvent event) { // 二次貝塞爾,實現平滑曲線;clickX, clickY為操作點,(clickX+startX)/2, // (clickY+startY)/2為終點 path.quadTo(clickX, clickY, (clickX + startX) / 2, (clickY + startY) / 2); // 第二次執行時,第一次結束調用的坐標值將作為第二次調用的初始坐標值 clickX = startX; clickY = startY; invalidate(); } /** * 功能:手指離開屏幕時調用 * * @param event */ private void touchUp(MotionEvent event) { // 鼠標彈起保存最後狀態 canvas.drawPath(path, paint); // 重置繪製路線,即隱藏之前繪製的軌跡 path.reset(); invalidate(); } /** * 功能:畫板界面離開是調用 */ @Override protected void onDetachedFromWindow() { // TODO Auto-generated method stub super.onDetachedFromWindow(); } /** * 功能:設置畫筆風格 * * @param mPaintType * @return */ private MaskFilter getMaskFilter(int mPaintType) { MaskFilter maskFilter = null; switch (mPaintType) { case PaintUtility.PEN_TYPE.PLAIN_PEN:// 簽字筆風格 maskFilter = null; break; case PaintUtility.PEN_TYPE.BLUR:// 鉛筆模糊風格 maskFilter = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); break; case PaintUtility.PEN_TYPE.EMBOSS:// 毛筆浮雕風格 maskFilter = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f); break; case PaintUtility.PEN_TYPE.TS_PEN:// 透明水彩風格 maskFilter = null; paint.setAlpha(50); break; default: maskFilter = null; break; } paint.setMaskFilter(maskFilter); return maskFilter; } }