网上的画板代码收集和整理

修改后的代码[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. */
    @Override
    public 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() {

            @Override
            public void onClick(View v) {
// TODO Auto-generated method stub
//锁定整个SurfaceView
                Canvas 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() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Dialog mDialog = new AlertDialog.Builder(MyWallActivity.this)
                        .setTitle("corlor setting")
                        .setSingleChoiceItems(new String[]{"red", "green", "blue"}, whichColor, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                                switch (which) {
                                    case 0: {
//画笔的颜色
                                        mPaint.setColor(Color.RED);
                                        whichColor = 0;
                                        break;
                                    }
                                    case 1: {
//画笔的颜色
                                        mPaint.setColor(Color.GREEN);
                                        whichColor = 1;
                                        break;
                                    }
                                    case 2: {
//画笔的颜色106
                                        mPaint.setColor(Color.BLUE);
                                        whichColor = 2;
                                        break;
                                    }
                                }
                            }
                        })
                        .setPositiveButton("confirm", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
                                dialog.dismiss();
                            }
                        })
                        .create();
                mDialog.show();
            }
        });
    }

        @Override
        public boolean onTouchEvent(MotionEvent event)
        {
//获取x坐标
            float x = event.getX();
//获取y坐标(不知道为什么要减去一个偏移值才对得准屏幕)
            float y = event.getY();
//第一次进来先不管
            if(canDraw)
            {
//获取触屏事件
                switch(event.getAction())
                {
//如果是拖动事件
                    case MotionEvent.ACTION_MOVE:
                    {
//锁定整个SurfaceView
                        Canvas 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;

    @Override
    protected 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() {
			@Override
			public void onClick(View v) {
				myView.setMode(Pen);
			}
		});

		eraser.setOnClickListener(new OnClickListener() {
			@Override
			public 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);
		}

		@Override
		protected 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);
			}
		}

		@Override
		public 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

posted @ 2017-06-24 09:05  开往春天的拖拉机  阅读(140)  评论(0编辑  收藏  举报