Android 自定义 View Paint 了解

学习主要来源:扔物线大神

颜色

基本颜色

  • setColor(int color)
  • setARGB(int a, int r, int g, int b)
  • setShader(Shader shader):用于设置绘制颜色,在 Android 的绘制里使用 Shader ,并不直接用 Shader 这个类,而是用它的几个子类。具体来讲有 如下几个:

LinearGradient 线性渐变、RadialGradient 辐射渐变、SweepGradient 扫描渐变、 BitmapShader(用 Bitmap 的像素来作为图形或文字的填充)、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:端点范围之外的着色规则,类型是 TileModeTileMode 一共有 3 个值可选: CLAMP, MIRRORREPEATCLAMP 会在端点之外延续端点处的颜色;MIRROR 是镜像模式;REPEAT 是重复模式
  • RadialGradient 辐射渐变:RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)centerX centerY:辐射中心的坐标 ,radius:辐射半径 ,centerColor:辐射中心的颜色 ,edgeColor:辐射边缘的颜色 ,tileMode:辐射范围之外的着色模式。
  • SweepGradient 扫描渐变:SweepGradient(float cx, float cy, int color0, int color1)cx cy :扫描的中心,color0:扫描的起始颜色 ,color1:扫描的终止颜色
  • BitmapShader:BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)bitmap:用来做模板的 Bitmap 对象 ,tileX:横向的 TileModetileY:纵向的 TileMode
  • ComposeShader : 混合着色器就是把两个 Shader 一起使用。ComposeShader() 在硬件加速下是不支持两个相同类型的 Shader 的,所以这里也需要关闭硬件加速才能看到效果。ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)shaderA, shaderB:两个相继使用的 Shadermode: 两个 Shader 的叠加模式,即 shaderAshaderB 应该怎样共同绘制。它的类型是 PorterDuff.Mode
  • PorterDuff.Mode:是用来指定两个图像共同绘制时的颜色策略的。就是说把源图像绘制到目标图像处时应该怎样确定二者结合后的颜色,而对于 ComposeShader(shaderA, shaderB, mode) 这个具体的方法,就是指应该怎样把 shaderB绘制在 shaderA 上来得到一个结合后的 Shader,具体看官方文档

滤镜

  • setColorFilter(ColorFilter colorFilter):ColorFilter 并不直接使用,而是使用它的子类。它共有三个子类:LightingColorFilter PorterDuffColorFilterColorMatrixColorFilter
  • LightingColorFilter(int mul, int add):模拟光照效果,参数里的 muladd 都是和颜色值格式相同的 int 值,其中 mul 用来和目标像素相乘,add 用来和目标像素相加
  • PorterDuffColorFilter:作用是使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成。它的构造方法是 PorterDuffColorFilter(int color, PorterDuff.Mode mode) 其中的 color 参数是指定的颜色, mode 参数是指定的 Mode。同样也是 PorterDuff.Mode ,不过和 ComposeShader 不同的是,PorterDuffColorFilter 作为一个 ColorFilter,只能指定一种颜色作为源,而不是一个 Bitmap
  • ColorMatrixColorFilter:使用一个 ColorMatrix 来对颜色进行处理。 ColorMatrix 这个类,内部是一个 4x5 的矩阵,第三方库实现炫酷效果:StyleImageView
  • PorterDuffColrFilter((int color, PorterDuff.Mode mode):使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成

效果

  • Paint.setStrokeCap(Paint.Cap cap) 设置线头的形状。线头形状有三种:BUTT 平头、ROUND 圆头、SQUARE 方头。默认为 BUTT
  • Paint.setStrokeJoin(Paint.Join join) :设置拐角的形状。有三个值可以选择:MITER 尖角、 BEVEL 平角和 ROUND 圆角。默认为 MITER
  • Paint.setStrokeMiter(float miter) : 这个方法是对于 setStrokeJoin() 的一个补充,它用于设置 MITER 型拐角的延长线的最大值。这种补偿方案会有一个问题:如果拐角的角度太小,就有可能由于出现连接点过长的情况,所以为了避免意料之外的过长的尖角出现, MITER 型连接点有一个额外的规则:当尖角过长时,自动改用 BEVEL 的方式来渲染连接点。例如上图的这个尖角,在默认情况下是不会出现的,而是会由于延长线过长而被转为 BEVEL 型连接点。 miter limit 的默认值是 4,对应的是一个大约 29° 的锐角,默认情况下,大于这个角的尖角会被保留,而小于这个夹角的就会被「削成平头」
  • Paint. setDither(boolean dither) : 设置图像的抖动。在 Android 里使用起来也很简单,一行代码就搞定paint.setDither(true);只要加这么一行代码,之后的绘制就是加抖动的了。
  • Paint.setFilterBitmap(boolean filter) :设置是否使用双线性过滤来绘制 Bitmap 。图像在放大绘制的时候,默认使用的是最近邻插值过滤,这种算法简单,但会出现马赛克现象;而如果开启了双线性过滤,就可以让结果图像显得更加平滑
  • paint.setPathEffect(PathEffect effect) : 使用 PathEffect 来给图形的轮廓设置效果。对 Canvas 所有的图形绘制有效

    Android 中的 6 种 PathEffectPathEffect 分为两类,单一效果的 CornerPathEffect``DiscretePathEffect DashPathEffect PathDashPathEffect ,和组合效果的 SumPathEffect ComposePathEffect

  • CornerPathEffect : 把所有拐角变成圆角,CornerPathEffect(float radius) 的参数 radius 是圆角的半径

  • DiscretePathEffect : 把线条进行随机的偏离,让轮廓变得乱七八糟。乱七八糟的方式和程度由参数决定。DiscretePathEffect(float segmentLength, float deviation) 的两个参数中, segmentLength 是用来拼接的每个线段的长度, deviation 是偏离量。
  • DashPathEffect : DashPathEffect(float[] intervals, float phase) 中, 第一个参数 intervals 是一个数组,它指定了虚线的格式:数组中元素必须为偶数(最少是 2 个),按照「画线长度、空白长度、画线长度、空白长度」……的顺序排列,例如上面代码中的 20, 5, 10, 5 就表示虚线是按照「画 20 像素、空 5 像素、画 10 像素、空 5 像素」的模式来绘制;第二个参数 phase 是虚线的偏移量
  • PathDashPathEffect:PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style)中, shape 参数是用来绘制的 Pathadvance 是两个相邻的 shape 段之间的间隔,不过注意,这个间隔是两个 shape 段的起点的间隔,而不是前一个的终点和后一个的起点的距离; phaseDashPathEffect 中一样,是虚线的偏移;最后一个参数 style,是用来指定拐弯改变的时候 shape 的转换方式。style 的类型为 PathDashPathEffect.Style ,是一个 enum ,具体有三个值
    • TRANSLATE:位移
    • ROTATE:旋转
    • MORPH:变体
  • SumPathEffect:这是一个组合效果类的 PathEffect 。它的行为特别简单,就是分别按照两种 PathEffect 分别对目标进行绘制
  • ComposePathEffect:这也是一个组合效果类的 PathEffect 。不过它是先对目标 Path 使用一个 PathEffect,然后再对这个改变后的 Path 使用另一个 PathEffectComposePathEffect(PathEffect outerpe, PathEffect innerpe) 中的两个 PathEffect 参数, innerpe 是先应用的, outerpe 是后应用的
  • setShadowLayer(float radius, float dx, float dy, int shadowColor):在之后的绘制内容下面加一层阴影。radius 是阴影的模糊范围; dx dy 是阴影的偏移量; shadowColor 是阴影的颜色。
  • setMaskFilter(MaskFilter maskfilter) : 为之后的绘制设置 MaskFilter。上一个方法 setShadowLayer() 是设置的在绘制层下方的附加效果;而这个 MaskFilter 和它相反,设置的是在绘制层上方的附加效果。MaskFilter 有两种: BlurMaskFilterEmbossMaskFilte
小额支持我写出更好的文章~