自定义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
- 自定义View笔记之绘制画笔
- 笔记—自定义View之绘制基础
- 笔记—自定义View之绘制顺序
- Android自定义View之画笔与画布
- Android自定义View之画笔与画布
- 自定义View (三) :onDraw 之 paint 画笔
- Android自定义View之画笔与画布
- Android自定义View之画笔与画布
- 继承android.view.View自定义view,使用画笔绘制view示例
- 笔记—自定义View之DrawText文字绘制
- 笔记—自定义View之Canvas对绘制的辅助
- 自定义View之绘制圆环
- 自定义View之绘制钟表
- Android自定义View之画笔与画布(2)
- 安卓自定义view系列之paint画笔类详解
- Android 自定义View之View的绘制
- Android学习笔记之-自定义View实例及View的绘制过程(一)
- android--笔记--自定义View绘制圆环
- -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable
- 专治Xcode升级后插件失效的问题
- Registry(注册表)
- BZOJ_P1096 [ZJOI2007]仓库建设(斜率优化DP)
- 打狗棒法之:Cknife(C刀)自定义模式秒过安全狗
- 自定义View笔记之绘制画笔
- ArrayList源码剖析
- 安装gr_ieee802.11
- C++ map的基本操作和使用
- idea+maven+jetty+jfinal环境搭建
- Spring Security(18)——Jsp标签 博客分类:
- 7080生化分析仪使用说明书—— 操作篇
- 没有可用于当前位置的源代码
- 关于理想团队模式构建的设想以及对软件流程的理解