android自定义控件-paint详解

简介: android自定义控件-paint详解

github代码(所在分支paint)


github.com/ananananzhu…


Paint Api介绍


设置画笔颜色

public void setColor(@ColorInt int color)
复制代码


设置画笔宽度

paint.setStrokeWidth(10)
复制代码

在画笔宽度为0的情况下,仍然能以1像素进行绘制,但是画布缩放的时候绘制线条的宽度不会变 如果画笔的宽度为1那么放大画布一倍的时候,线条的宽度会变为2


抗锯齿

setAntiAlias(true) 
复制代码

true:柔化处理

false:不柔化处理

抗锯齿是指在图像中,物体边缘总会或多或少的呈现三角形的锯齿,而抗锯齿就是指对图像边缘进行柔化处理,使图像边缘看起来更平滑,更接近实物的物体


画笔透明度

public void setAlpha(int a)
复制代码

a:范围0-255

0:透明

255:完全不透明


设置透明度和颜色

public void setARGB(int a, int r, int g, int b)
复制代码

参数范围都是0-255


设置画笔样式

public void setStyle(Style style)
复制代码

Paint.Style.FILL:填充内部(例如这种模式画一个圆圆内部颜色是被填充的)

Paint.Style.STROKE :描边(内部不被填充,可以用来绘制圆环)

Paint.Style.FILL_AND_STROKE :填充内部和描边(展示效果和FILL看起来是一样的)


线条连接处样式

public void setStrokeJoin(Join join)
复制代码
public static enum Join {
  BEVEL,
  MITER,
  ROUND
}
复制代码

BEVEL:连接处是斜线的模式

MITER:直角

ROUND:圆角 样式 效果展示:

image.png


图中第三个写错了,应该是圆角


public void setStrokeMiter

public void setStrokeMiter
复制代码

MITER模式下小角度的情况下会自动把尖角转换为斜线模式 效果展示:

image.png


设置线头的模式

public void setStrokeCap(Cap cap)
复制代码


public static enum Cap {
  BUTT,平头
  ROUND,圆头
  SQUARE  方块
}
复制代码

效果展示:

image.png

拐角变圆角

public PathEffect setPathEffect(PathEffect effect)
复制代码


设置setPathEffect代码示例

paint.pathEffect=CornerPathEffect(40)
复制代码

效果动图展示 如下图中的两个路径,本身两者的路径是相同的,但是我们通过滑动Seekbar后动态改变第二个路径Paint的pathEffect属性,然后第二个路径就逐渐变得圆润了

image.png

设置虚线

paint.pathEffect = DashPathEffect(floatArrayOf(10f, 20f), 50f)
复制代码

DashPathEffect第一个参数数组中数字第0个值表示虚线的长度,第1个值表示两个虚线之间的长度


绘制虚线代码

override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        path.reset()
        path.apply {
            moveTo(100f, 100f)
            lineTo(300f, 200f)
            lineTo(100f, 400f)
            lineTo(300f, 900f)
            lineTo(80f, 1000f)
            close()
        }
        canvas?.drawPath(path, paint)
    }
复制代码


代码实现效果

image.png


PathDashPathEffect

复制别人博客的代码:

Path dashPath = ...; // 使用一个三角形来做 dash  
PathEffect pathEffect = new PathDashPathEffect(dashPath, 40, 0,  
        PathDashPathEffectStyle.TRANSLATE);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path, paint);  
复制代码


参考效果:

image.png


DiscretePathEffect() 设置线条随机偏移

image.png


SumPathEffect () 两种线条模式都执行

image.png


Gradient渐变模式

渐变模式的集中模式:

"LinearGradient" 线性渐变

"RadialGradient"  径向渐变

"SweepGradient"  扫描渐变

"BitmapShader"  位图渐变

"ComposeShader"  混合渐变,可以有多个shader混合在一起

image.png


设置阴影

setShadowLayer(float radius, float dx, float dy, int shadowColor)
复制代码

radius 是阴影的模糊范围; dx dy 是阴影的偏移量; shadowColor 是阴影的颜色。


模糊效果的 MaskFilter

一共四个模式:

NORMAL: 内外都模糊绘制

SOLID: 内部正常绘制,外部模糊

INNER: 内部模糊,外部不绘制

OUTER: 内部不绘制,外部模糊

var maskFilter: BlurMaskFilter = BlurMaskFilter(50f, BlurMaskFilter.Blur.SOLID)
 canvas?.translate(measuredWidth / 2f, measuredHeight / 2f)
 canvas?.drawBitmap(bitmap, -200f, -200f, paint)
复制代码


image.png


getTextPath路径

获取文本的路径

代码展示:

override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        val text = "测试文本 Test"
        val srcPaint = Paint()
        srcPaint.textSize = 100f
        srcPaint.color = Color.BLACK
        srcPaint.style = Paint.Style.STROKE
        canvas?.drawText(text, 50f, 100f, srcPaint)
        //获取文本路径
        canvas?.translate(0f, 150f)
        val desPath = Path()
        val desPaint = Paint()
        desPaint.textSize = 100f
        desPaint.color = Color.RED
        desPaint.strokeWidth = 5f
        desPaint.style = Paint.Style.STROKE
        srcPaint.getTextPath(text, 0, text.length, 50f, 100f, desPath)
        canvas?.drawPath(desPath, desPaint)
    }
复制代码


代码效果展示:

image.png



相关文章
|
14小时前
|
XML 前端开发 Java
Android Studio App自定义控件中自定义视图的绘制讲解及实战(附源码 包括自定义绘制各种图形)
Android Studio App自定义控件中自定义视图的绘制讲解及实战(附源码 包括自定义绘制各种图形)
42 1
|
14小时前
|
XML Java Android开发
Android Studio App自定义控件中视图的构造和测量方法讲解及实战(附源码 实现下拉刷新功能 超详细必看)
Android Studio App自定义控件中视图的构造和测量方法讲解及实战(附源码 实现下拉刷新功能 超详细必看)
45 1
|
12月前
|
缓存 Android开发 Kotlin
Android 弹幕的两种实现及性能对比 | 自定义控件
Android 弹幕的两种实现及性能对比 | 自定义控件
202 0
|
12月前
|
调度 Android开发
Android空间架构与自定义控件详解-更新中
Android空间架构与自定义控件详解-更新中
64 0
|
前端开发 Android开发 Python
|
前端开发 Android开发 图形学
Android自定义View工具:Paint&Canvas(一)
本文主要讲的是自定义View时我们经常用到的Canvas和Paint,像平时画画一样,我们需要画布和画笔,而Canvas就是画布,Paint就是画笔
|
Android开发
Android Paint 抗锯齿画线模糊
Android Paint 抗锯齿画线模糊
200 0
Android Paint 抗锯齿画线模糊
|
编解码 Android开发
Android Paint ANTI_ALIAS_FLAG 引起的一个小问题
Android Paint ANTI_ALIAS_FLAG 引起的一个小问题
131 0
Android Paint ANTI_ALIAS_FLAG 引起的一个小问题
|
XML 开发工具 Android开发
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
268 0
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
|
XML Android开发 数据格式
Android自定义控件(十二)——自定义属性及应用
Android自定义控件(十二)——自定义属性及应用
137 0
Android自定义控件(十二)——自定义属性及应用