本文共 8990 字,大约阅读时间需要 29 分钟。
Paint是什么
Paint是一个画笔,它保存了如何绘制几何图形,文本,和位图的样式和颜色等信息。如何获得一个Paint对象
调用Paint的构造方法可以创建一个画笔对象.//创建一个拥有抗锯齿功能的画笔val paint = Paint(Paint.ANTI_ALIAS_FLAG)
Paint的常用方法
Paint类拥有大量的setXXX()方法,这些方法可用于在绘图操作中对画笔的各种属性进行设置。常用的一些方法有: void setColor(int color) 设置画笔颜色,(从资源文件) void setARGB(int a, int r, int g, int b) 设置画笔颜色(带透明度) void setAlpha(int a) 设置画笔的透明度void setAntiAlias(boolean aa) 设置画笔是否具有抗锯齿功能。抗锯齿功能能为绘制一些图形(比如圆形,椭圆)时,对边缘进行模糊处理.
void setDither(boolean dither) 设置画笔是否具有抗抖动功能。抗抖动功能能为绘制一些渐变色时,提供对边缘颜色的柔和处理对绘制文本时有用的一些设置
void setTextSize(float textSize) 设置文本大小,单位为px void setUnderlineText(boolean underlineText) 设置文本是否具有下划线 void setStrikeThruText(boolean strikeThruText) 设置文本是否具有删除线 void setTextSkewX(float skewX) 设置文本X轴的倾斜 void setTextScaleX(float scaleX) 设置文本X轴的缩放 void setTextAlign(Paint.Align align) 设置文本的对齐方式 Typeface setTypeface(Typeface typeface) 设置文本字体对绘制图形时有用的一些设置
void setStrokeWidth(float width) 设置描边的宽度,默认0的时候有一个像素单位的宽度 void setStyle(Paint.Style style) 设置绘制几何图形时的样式,包括Paint.Style.Fill(填充),Paint.Style.STROKE(描边),Paint.Style.FILL_AND_STROKE(填充加描边)void setStrokeCap(Paint.Cap cap) 设置线帽,包括Paint.Cap.BUTT(无线帽),Paint.Cap.ROUND(圆形线帽),Paint.Cap.SQUARE(矩形线帽)。 一般在绘制样式在STROKE 或FILL_AND_STROKE使用
void setStrokeJoin(Paint.Join join) 设置线段的连接处,包括Paint.Join.MITER(以锐角形式相交),Paint.Join.ROUND(以圆弧形式相交),Paint.Join.BEVEL(以直线形式相交).。一般在绘制样式在STROKE或FILL_AND_STROKE使用
Shader setShader(Shader shader) 设置渲染器,包括LinearGradient,RadialGradient,SweepGradient,BitmapShader,ComposeShader
LinearGradient线性渐变渲染器,常用的构造方法 LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile) 参数(x0,y0)表示起点坐标,参数(x1,y1)表示终点坐标。color0表示起点颜色,color1表示终点颜色。tile表示当绘制图形的坐标点在渐变色的起始点以外时的处理方式。 Shader.TileMode.CLAMP 表示将最后一个像素点平铺 Shader.TileMode.REPEAT 表示重复渐变色 Shader.TileMode.MIRROR 表示镜像重复渐变色 LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile) 参数(x0,y0 x1,y1)都是表示起始点坐标,colors表示渐变颜色,可以有多个渐变颜色。positions表示渐变色数组中每个颜色的相对位置,可以为null。 null表示渐变颜色均匀分布val mShader = LinearGradient( 0f, 0f, 300f, 0f, Color.RED, Color.GREEN, Shader.TileMode.CLAMP)override fun onDraw(canvas: Canvas) { mPaint.shader = mShader canvas.drawRect(0f, 0f, measuredWidth.toFloat(), 300f, mPaint) mPaint.shader = null}
Shader.TileMode.CLAMP Shader.TileMode.REPEAT Shader.TileMode.MIRROR
val mShader = RadialGradient( 180f, 150f, 150f, Color.RED, Color.GREEN, Shader.TileMode.CLAMP)override fun onDraw(canvas: Canvas) { mPaint.shader = mShader canvas.drawRect(0f, 0f, measuredWidth.toFloat(), 300f, mPaint) mPaint.shader = null}
Shader.TileMode.CLAMP Shader.TileMode.REPEAT Shader.TileMode.MIRROR
val mShader = SweepGradient( 150f, 150f, Color.RED, Color.GREEN)override fun onDraw(canvas: Canvas) { mPaint.shader = mShader canvas.drawRect(0f, 0f, measuredWidth.toFloat(), 300f, mPaint) mPaint.shader = null}
val bitmap = BitmapFactory.decodeResourse(resources, R.drawable.bitmap)val mShader = BitmapShader( bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)override fun onDraw(canvas: Canvas) { mPaint.shader = mShader canvas.drawRect(0f, 0f, measuredWidth.toFloat(), 300f, mPaint) mPaint.shader = null}
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.bitmap)val shader1 = BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)val shader2 = LinearGradient( 0f, 0f, 300f, 0f, Color.YELLOW, Color.GREEN, Shader.TileMode.MIRROR)val mShader = ComposeShader(shader1, shader2, PorterDuff.Mode.MULTIPLY)override fun onDraw(canvas: Canvas) { mPaint.shader = mShader canvas.drawRect(0f, 0f, measuredWidth.toFloat(), 300f, mPaint) mPaint.shader = null}
Xfermode setXfermode(Xfermode xfermode) 设置图片的混合模式,混合模式包括下面多种混合模式,(这里可能需要关闭硬件加速,setLayerType(View.LAYER_TYPE_SOFTWARE, null)。不然有些效果不会出来)
val dst = BitmapFactory.decodeResource(resources, R.drawable.dst)val src = BitmapFactory.decodeResource(resources, R.drawable.src)//设置图片的混合模式val xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT)override fun onDraw(canvas: Canvas) { val sc = canvas.saveLayer(0f, 0f, dst.width.toFloat(), dst.hei.toFloat(), null) canvas.drawBitmap(dst, 0f, 0f, null) mPaint.xfermode = xfermode canvas.drawBitmap(src, 0f, 0f, mPaint) mPaint.xfermode = null canvas.restoreToCount(sc)}
ColorFilter setColorFilter(ColorFilter filter) 设置颜色过滤器,包括LightingColorFilter,ColorMatrixColorFilter,PorterDuffColorFilter
LightingColorFilter 模拟简单灯光效果的过滤器,该类只有一个构造方法 LightingColorFilter(int mul, int add) 这两个参数都是十六进制的色彩值。mul为倍数,add为加数。比如原像素点的色彩为0xFFFF0000红色,现在添加一个LightingColorFilter(0xFF00FFFF, 0xFF000000)色彩过滤器,过滤后的像素点的色彩为0xFF000000(黑色)。 计算的方式为 R = R * mul.R / FF + add.R G = G * mul.G / FF + add.G B = B * mul.B / FF + add.B ColorMatrixColorFilter 使用颜色矩阵来变换颜色的过滤器,该类有两个构造方法 ColorMatrixColorFilter(ColorMatrix matrix) ColorMAtrixColorFilter(float[] array) 颜色矩阵是一个5*4的矩阵,用于变化位图的颜色和透明度。矩阵可以作为单个数组传递,传递的方式是val bitmap = BitmapFactory.decodeResource(resources, R.drawable.bitmap)val matrix = ColorMatrix()//设置色彩的饱和度,饱和度越高,色彩越鲜艳,饱和度越低,色彩越暗淡//饱和度为0时失去所有色彩变成黑白,取值为0到100%matrix.setSaturation(0f)val filter = ColorMatrixColorFilter(matrix)override fun onDraw(canvas: Canvas) { mPaint.colorFilter = filter canvas.drawBitmap(bitmap, 0f, 0f, mPaint) mPaint.colorFilter = null}
PathEffect setPathEffect(PathEffect effect) 设置对绘制路径时的影响,包括DashPathEffect,CornerPathEffect,DiscretePathEffect,PathDashPathEffect
DashPathEffect 用虚线替换实线,该类只有一个构造方法 DashPathEffect(float[] intervals, float phase) intervals是一个数组,定义了虚线的开闭大小。个数必须>=2。奇数定义了闭区间的大小,偶数定义了开区间的大小。单位为px。参数phase定义了绘制开始时的偏移。比如定义的第一个闭区间是15,phase为5,那绘制出来的第一个闭区间就为10。注意,该PathEffect只会对绘制样式为STROKE或FILL_AND_STROKE图形产生影响。val effect = DashPathEffect(floatArrayOf(15f, 5f), 0f)override fun onDraw(canvas: Canvas) { mPaint.color = Color.RED mPaint.style = Paint.Style.STROKE mPaint.strokeWidth = 8f mPath.moveTo(100f, 100f) mPath.lineTo(300f, 300f) mPath.lineTo(100f, 500f) mPath.lineTo(300f, 700f) //添加一条偏移过后的Path路径 mPath.offset(100f, 0f, mPathSrc) canvas.drawPath(mPath, mPaint) mPaint.pathEffect = effect canvas.drawPath(mPathSrc, mPaint) mPaint.pathEffect = null mPath.reset() mPathSrc.reset()}
val effect = CornerPathEffect(32f)override fun onDraw(canvas: Canvas) { mPaint.color = Color.RED mPaint.style = Paint.Style.STROKE mPaint.strokeWidth = 8f mPath.moveTo(100f, 100f) mPath.lineTo(300f, 300f) mPath.lineTo(100f, 500f) mPath.lineTo(300f, 700f) //添加一条偏移过后的Path路径 mPath.offset(100f, 0f, mPathSrc) canvas.drawPath(mPath, mPaint) mPaint.pathEffect = effect canvas.drawPath(mPathSrc, mPaint) mPaint.pathEffect = null mPath.reset() mPathSrc.reset()}
val effect = DiscretePathEffect(10f, 5f)override fun onDraw(canvas: Canvas) { mPaint.color = Color.RED mPaint.style = Paint.Style.STROKE mPaint.strokeWidth = 8f mPath.moveTo(100f, 100f) mPath.lineTo(300f, 300f) mPath.lineTo(100f, 500f) mPath.lineTo(300f, 700f) //添加一条偏移过后的Path路径 mPath.offset(100f, 0f, mPathSrc) canvas.drawPath(mPath, mPaint) mPaint.pathEffect = effect canvas.drawPath(mPathSrc, mPaint) mPaint.pathEffect = null mPath.reset() mPathSrc.reset()}
转载地址:http://heoaz.baihongyu.com/