自定义View笔记之绘制画笔

来源:互联网 发布:淘宝客移动建站app 编辑:程序博客网 时间:2024/05/17 03:58
package com.example.huanghaiyan.mjtestactivity;import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * Created by huanghaiyan on 16/3/23. */public class DrawView extends View {    public DrawView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public DrawView(Context context) {        super(context);        init();    }    public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    public DrawView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);        init();    }    private Resources mResources;    //画笔定义绘制属性    private Paint mPaint;    private Paint mBitmapPaint;    //绘制路径    private Path mPath;    //画布及其底层位图    private Bitmap mBitmap;    private Canvas mCanvas;    private float mX, mY;    private static final float TOUCH_TOLERANCE = 4;    //记录宽度和高度    private int mWidth;    private int mHeight;    private void init() {        mResources = getResources();        //绘制自由曲线用的画笔        mPaint = new Paint();        mPaint.setAntiAlias(true);  //去锯齿        mPaint.setDither(true);  //平铺        mPaint.setColor(mResources.getColor(R.color.blue));        mPaint.setStyle(Paint.Style.STROKE);  //画出的图形是空心的        mPaint.setStrokeJoin(Paint.Join.ROUND); //画出的曲线是光滑的                            // Miter:结合处为锐角, Round:结合处为圆弧:BEVEL:结合处为直线。        mPaint.setStrokeCap(Paint.Cap.ROUND);  //画笔笔刷类型        mPaint.setStrokeWidth(12);  //画出的线条的粗细程度        mPath = new Path();        mBitmapPaint = new Paint(Paint.DITHER_FLAG);  //抗抖动,效果较明显    }    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        mWidth = w;        mHeight = h;        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);        mCanvas = new Canvas(mBitmap);    }    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;    }    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //背景颜色        canvas.drawColor(getResources().getColor(R.color.black));        //如果不调用此方法,绘制结束后画布将被清空        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);        //绘制路径        canvas.drawPath(mPath, mPaint);    }    private void touch_up() {        mPath.lineTo(mX, mY);  //画直线        //如果不调用此方法,笔触抬起时mPath将被重置,绘制的线条将消失        mCanvas.drawPath(mPath, mPaint);        mPath.reset();    }    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;        }    }    private void touch_start(float x, float y) {        mPath.reset();        mPath.moveTo(x, y);        mX = x;        mY = y;    }    /**     * 清除整个图像     */    public void clear() {        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));  //所绘制不会提交到画布上        mCanvas.drawPaint(mPaint);        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); //显示上层绘制图片        invalidate();    }}

0 0
原创粉丝点击