修改后的代碼[1]為,少了一個}
package com.example.administrator.myapplication;import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;public class MyWallActivity extends Activity
{private SurfaceView mSurfaceView = null;private SurfaceHolder mSurfaceHolder = null;private Button cleanButton = null;private Button colorButton = null;private float oldX = 0f;private float oldY = 0f;private boolean canDraw = false;private Paint mPaint = null;//用來記錄當前是哪一種顏色private int whichColor = 0;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceview);mSurfaceHolder = mSurfaceView.getHolder();mPaint = new Paint();
//畫筆的顏色mPaint.setColor(Color.RED);
//畫筆的粗細mPaint.setStrokeWidth(2.0f);cleanButton = (Button) this.findViewById(R.id.flushbutton);
//按鈕監聽cleanButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
// TODO Auto-generated method stub
//鎖定整個SurfaceViewCanvas mCanvas = mSurfaceHolder.lockCanvas();mCanvas.drawColor(Color.BLACK);
//繪制完成,提交修改mSurfaceHolder.unlockCanvasAndPost(mCanvas);
//重新鎖一次mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));mSurfaceHolder.unlockCanvasAndPost(mCanvas);}});colorButton = (Button) this.findViewById(R.id.colorbutton);
//按鈕監聽colorButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubDialog mDialog = new AlertDialog.Builder(MyWallActivity.this).setTitle("corlor setting").setSingleChoiceItems(new String[]{"red", "green", "blue"}, whichColor, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubswitch (which) {case 0: {
//畫筆的顏色mPaint.setColor(Color.RED);whichColor = 0;break;}case 1: {
//畫筆的顏色mPaint.setColor(Color.GREEN);whichColor = 1;break;}case 2: {
//畫筆的顏色106mPaint.setColor(Color.BLUE);whichColor = 2;break;}}}}).setPositiveButton("confirm", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stubdialog.dismiss();}}).create();mDialog.show();}});}@Overridepublic boolean onTouchEvent(MotionEvent event){
//獲取x坐標float x = event.getX();
//獲取y坐標(不知道為什么要減去一個偏移值才對得準屏幕)float y = event.getY();
//第一次進來先不管if(canDraw){
//獲取觸屏事件switch(event.getAction()){
//如果是拖動事件case MotionEvent.ACTION_MOVE:{
//鎖定整個SurfaceViewCanvas mCanvas = mSurfaceHolder.lockCanvas();mCanvas.drawLine(x, y, oldX, oldY, mPaint);mSurfaceHolder.unlockCanvasAndPost(mCanvas);
//重新鎖一次mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));mSurfaceHolder.unlockCanvasAndPost(mCanvas);break;}}}
//保存目前的x坐標值oldX = x;
//保存目前的y坐標值oldY = y;canDraw = true;return true;}}
[2]里面有個demo可以直接使用,應該是eclipse上的,我轉換為了as的,不過有鋸齒
[3]使用貝塞爾曲線的方法去除了鋸齒
在[4]中可以使用橡皮擦,貌似需要更改一些東西,否則會閃退,可能和用的是as相關
package com.example.administrator.myapplication;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;public class MainActivity extends Activity {private int SCREEN_W;private int SCREEN_H;private int Pen = 1;private int Eraser = 2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);Button paint = new Button(this);paint.setText("畫筆");layout.addView(paint, params);Button eraser = new Button(this);eraser.setText("橡皮");layout.addView(eraser, params);final MyView myView = new MyView(this);layout.addView(myView);setContentView(layout);paint.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {myView.setMode(Pen);}});eraser.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {myView.setMode(Eraser);}});}//MyView就是自定義的畫板class MyView extends View {private int mMode = 1;private Bitmap mBitmap;private Canvas mCanvas;private Paint mEraserPaint;private Paint mPaint;private Path mPath;private float mX, mY;private static final float TOUCH_TOLERANCE = 4;public MyView(Context context) {super(context);setFocusable(true);setScreenWH();initPaint();}private void setScreenWH() {DisplayMetrics dm = new DisplayMetrics();dm = this.getResources().getDisplayMetrics();int screenWidth = dm.widthPixels;int screenHeight = dm.heightPixels;SCREEN_W = screenWidth;SCREEN_H = screenHeight;}//設置繪制模式是“畫筆”還是“橡皮擦”public void setMode(int mode){this.mMode = mode;}private void initPaint() {//畫筆mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setStrokeJoin(Paint.Join.ROUND);mPaint.setColor(Color.BLACK);mPaint.setStrokeWidth(10);//橡皮擦mEraserPaint = new Paint();mEraserPaint.setAlpha(0);//這個屬性是設置paint為橡皮擦重中之重//這是重點//下面這句代碼是橡皮擦設置的重點mEraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//上面這句代碼是橡皮擦設置的重點(重要的事是不是一定要說三遍)mEraserPaint.setAntiAlias(true);mEraserPaint.setDither(true);mEraserPaint.setStyle(Paint.Style.STROKE);mEraserPaint.setStrokeJoin(Paint.Join.ROUND);mEraserPaint.setStrokeWidth(30);mPath = new Path();mBitmap = Bitmap.createBitmap(SCREEN_W, SCREEN_H, Config.ARGB_8888);mCanvas = new Canvas(mBitmap);}@Overrideprotected void onDraw(Canvas canvas) {if (mBitmap != null) {canvas.drawBitmap(mBitmap, 0, 0, mPaint);}super.onDraw(canvas);}private void touch_start(float x, float y) {mPath.reset();mPath.moveTo(x, y);mX = x;mY = y;//如果是“畫筆”模式就用mPaint畫筆進行繪制if (mMode == Pen) {mCanvas.drawPath(mPath, mPaint);}//如果是“橡皮擦”模式就用mEraserPaint畫筆進行繪制if (mMode == Eraser) {mCanvas.drawPath(mPath, mEraserPaint);}}private void touch_move(float x, float y) {float dx = Math.abs(x - mX);float dy = Math.abs(y - mY);if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);mX = x;mY = y;if (mMode == Pen) {mCanvas.drawPath(mPath, mPaint);}if (mMode == Eraser) {mCanvas.drawPath(mPath, mEraserPaint);}}}private void touch_up() {mPath.lineTo(mX, mY);if (mMode == Pen) {mCanvas.drawPath(mPath, mPaint);}if (mMode == Eraser) {mCanvas.drawPath(mPath, mEraserPaint);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:touch_start(x, y);invalidate();break;case MotionEvent.ACTION_MOVE:touch_move(x, y);invalidate();break;case MotionEvent.ACTION_UP:touch_up();invalidate();break;}return true;}}
}
[1] 一個簡單涂鴉http://www.jizhuomi.com/android/example/19.html
[2] 安卓實現代碼的多種方式?
[3] 安卓path類的lineTo和quadTo方法的區別?
[4] 帶畫板http://www.mamicode.com/info-detail-1480421.html