[Android 知识点] 自定义View(二)

Paint类介绍

Paint类API

  • 下面就一起来学习这些用法:

setARGB(int a,int r,int g,int b);设置画笔颜色

mPaint.setARGB( 255, 35, 31, 42 ); 

ARGB的颜色选择可以使用这网站

setAntiAlias(boolean aa); 会平滑一些

mPaint.setAntiAlias( true ); 

设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。

setDither(boolean dither); 颜色更精细

mPaint.setDither( true ); 

setMaskFilter(MaskFilter maskfilter); 实现滤镜的效果

Android包含了下面几种MaskFilter:

  • BlurMaskFilter 指定了一个模糊的样式和半径来处理Paint的边缘。
  • EmbossMaskFilter 指定了光源的方向和环境光强度来添加浮雕效果。

  • [x] 需要注意的是,由于在GPU硬件加速模式下,Paint的setMaskFilter不被GPU支持,所以为了能够正常使用setMaskFilter方法,我们需要将我们要绘制的View使用软件渲染模式

//为了确保画笔的setMaskFilter能供起效,我们需要对MyView禁用掉GPU硬件加速  
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){  
    //View从API Level 11才加入setLayerType方法  
    //设置myView以软件渲染模式绘图  
    setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
}  

BlurMaskFilter 模糊效果

new BlurMaskFilter(float radius, Blur style) 
  • radius: 阴影的模糊半径,如上图所示,其值越大表示图形绘制出来越模糊,其值越小图形越清晰。

  • Blur style:

类型 h效果
NORMAL 同时绘制图形本身内容+内阴影+外阴影,即正常阴影效果
SOLID 只绘制外阴影和图形内容本身,不绘制内阴影。
OUTER 不绘制图形内容以及内阴影,只绘制外阴影,即图形轮廓以内完全不绘制,轮廓线以内完全是空白的。
INNER 绘制图形内容本身+内阴影,不绘制外阴影。

效果展示

EmbossMaskFilter 浮雕效果

new EmbossMaskFilter (float[] direction, float ambient, float specular, float blurRadius) 
  • direction

是一个float类型的数组,表示光线的方向,是个向量,包含三个值,分别是x分量、y分量、z分量,这三个值的绝对大小并不重要,因为direction最后在真正被Android使用时会被归一化成一个单位向量,即变成长度为1的向量。direction中的坐标是在所画图形的右手坐标系中定义的,如下图所示:
image

  • ambient

    表示环境光因子,float类型,取值是0到1,值越接近于0,环境光越暗,值越接近于1,环境光越亮。

  • specular

    表示镜面反射因子,float类型,取值也是0到1。镜面反射就是模拟像镜子一样的高光反射,值越接近于0,镜面反射越强,被光照照射到的地方更容易出现很白很亮的状态,即高光效果。

  • blurRadius

    表示模糊半径,是float类型,其值越大,模糊效果越明显。

image

setColorFilter(ColorFilter filter) 设置颜色过滤器

可以直接传入

  • ColorMatrixColorFilter
  • LightingColorFilter
  • PorterDuffColorFilter

的对象作为参数

ColorMatrixColorFilter 色彩矩阵颜色过滤器

在Android中图片是以RGBA像素点的形式加载到内存中的,修改这些像素信息需要一个叫做ColorMatrix类的支持,这个类其实定义的是一个矩阵,是一个4x5的float[]类型的矩阵

ColorMatrix colorMatrix = new ColorMatrix(new float[]{  
                1, 0, 0, 0, 0,  // 红色向量
                0, 1, 0, 0, 0,  // 绿色向量
                0, 0, 1, 0, 0,  // 蓝色向量
                0, 0, 0, 1, 0,  // 透明度向量
        }); 

其中,第一行表示的R(红色)的向量,第二行表示的G(绿色)的向量,第三行表示的B(蓝色)的向量,最后一行表示A(透明度)的向量

image

这个矩阵不同的位置表示的R、G、B、A值,其范围在0.0F至2.0F之间,1为保持原图的RGB值。每一行的第五列数字表示”偏移值“。

  • ”偏移值“:比如:(255, 253, 251, 247)和纯白(255, 255, 255, 255)之间的偏移值(0, 2, 4, 8)我们称之为白平衡的色彩偏移

我们来看看这个矩阵是怎么计算的。其实说白了就是矩阵之间的运算乘积:

image

这里MyColor的RGBA值我们需要转换为[0,1]。通过这种计算我们可以将我们自己设定的颜色和矩阵的颜色进行叠加,创立一个新的颜色

// 生成色彩矩阵  
ColorMatrix colorMatrix = new ColorMatrix(new float[]{  
        -1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值