博客
关于我
Android 绘图之Paint
阅读量:625 次
发布时间:2019-03-13

本文共 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

    
    RdialGradient放射渐变渲染器,常用的构造方法
    RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tile)  参数(centerX,centerY)表示中心点坐标,参数radius表示放射半径。centerColor表示中心点的颜色,edgeColor表示放射边缘的颜色。tile表示当绘制图形的坐标点在渐变色的起始点以外时的处理方式
    RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tile)  参数(centerX,centerY)表示中心点坐标,参数radius表示放射半径,colors表示渐变颜色,可以有多个渐变颜色。stops表示渐变色数组中每个颜色的相对位置,可以为null。 null表示渐变颜色均匀分布

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

    
    SweepGradient扫描渐变渲染器,常用的构造方法
    SweepGradient(float cx, float cy, int color0, int color1)  参数(cX,cY)表示中心点坐标,color0表示扫描起点的颜色。color1表示扫描终点的颜色
    SweepGradient(float cx, float cy, int[]colors, float[] positions)  参数(cX,cY)表示中心点坐标,colors表示渐变颜色,可以有多个渐变颜色。positions表示渐变色数组中每个颜色的相对位置,可以为null。 null表示渐变颜色均匀分布

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}

    BitmapShader位图渲染器,常用的构造方法
    BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)  

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}

   

    ComposeShader组合渲染器,将两种不同的渲染器组合在一起使用,常用的构造方法
    ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
    ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)

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的矩阵,用于变化位图的颜色和透明度。矩阵可以作为单个数组传递,传递的方式是
 
当应用于颜色[R,G,B,a]时,得到的颜色的计算方式为
借助于颜色矩阵我们可以很方便的将一张彩色图片转换成一张黑白图片,下图中左边的为原图片,右边的为处理过的黑白图片

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}

  

    PorterDuffColorFilter  使用单一颜色和特定的混合模式的颜色过滤器,它也只有一个构造方法
    PorterDuffColorFilter(int color, PorterDuff.Mode mode)  参数color是一个十六进制的色彩值。mode是混合模式,这里实际上是创建一个新的图层,图层的颜色就是我们传递进去的color。过滤的时候。将我们的原Bitmap当成是DST,我们创建的新的图层是SRC。在按照我们传递进去的模式进行合成

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()}

    CornerPathEffect  用圆角替换线段之间的任何锐角,该类只有一个构造方法
    CornerPathEffect(float radius)  参数radius是圆角度数

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()}

    DiscretePathEffect  用切碎长的线段,并随机偏移原始路径的Path替换实线,该类只有一个构造方法
    DiscretePathEffect(float segmentLength, float deviation)  参数segmentLenght为切碎的长度,deviation为偏移的最大值

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()}

    PathDashPathEffect  用指定的形状替换实线

转载地址:http://heoaz.baihongyu.com/

你可能感兴趣的文章
mYSQL 外键约束
查看>>
mysql 多个表关联查询查询时间长的问题
查看>>
mySQL 多个表求多个count
查看>>
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>