颜色相关:color、shader、colorFilter、Xfermode
1.直接设置颜色
setColor(int color)
setARGB(int a, int r, int g, int b)参数为透明度及三原色
2.设置着色器
着色器:图形领域里一个通用的概念,是一种颜色方案或着色规则。
setShader(Shader shader)
Shader.TileMode:端点范围之外的着色规则
CLAMP:在端点之外延续端点处的颜色(即超出边缘使用边缘处颜色)
MIRROR:镜像模式
REPEAT:重复模式
LinearGradient 线性渐变
简介:设置两个点作为端点,使用两个或一组颜色实现颜色的渐变效果。
构造:LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile) 。
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile);
参数:x0 y0 x1 y1:渐变的两个端点的位置
color0,color1,int[] colors:两个或一组颜色
positions:颜色数组的相对位置
tile:平铺方式
RadialGradient 辐射渐变
简介:从中心向周围辐射状的渐变。
构造方法: RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode);
RadialGradient (float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile);
参数:centerX centerY:辐射中心的坐标
radius:辐射半径
centerColor,edgeColor,int[] colors:辐射中心、边缘的颜色或一组颜色
SweepGradient 扫描、梯度渐变
简介:以某个点位中心旋转一周所形成的效果。
构造:SweepGradient(float cx, float cy, int color0, int color1)
SweepGradient (float cx, float cy, int[] colors, float[] positions);
参数:cx cy :扫描的中心
color0,color1,colors:起始颜色或颜色数组
BitmapShader 位图着色
简介:用 Bitmap 的像素来作为图形或文字的填充。
构造方法: BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
参数: bitmap:用来做模板的 Bitmap 对象
tileX:X轴方向上位图的衔接形式
tileY:Y轴方向上位图的衔接形式
ComposeShader混合着色器
简介:着色效果的叠加,比如将BitmapShader与LinearGradient的混合渲染 。
构造:ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode);
参数:shaderA, shaderB:两个相继使用的 Shader
mode:两个 Shader 的叠加模式
使用
3.颜色过滤
简介:为绘制的内容设置一个统一的过滤策略,然后 Canvas.drawXXX() 方法会对每个像素都进行过滤后再绘制出来。
setColorFilter(ColorFilter colorFilter)
颜色相关知识
光的三原色:红、绿、蓝(三色相加是白色,所以是加色模式,即黑色环境中用光后环境变亮)
色(颜料)的三原色:红、黄、蓝(三色相加是黑色,所以是减色模式,即在白色材料上使用颜料后让它变暗了)
RGBA模型:R(Red红色),G(Green绿色),B(Blue蓝色),A(Alpha透明度)
色调(色相/颜色):物体的颜色
饱和度(彩度):色彩的鲜艳度。颜色的纯度:0(灰)~100%(饱和)
亮度(明度):眼睛对光源和物体表面的明暗程度的感觉,主要是由光线强弱决定的一种视觉经验
LightingColorFilter 光照色彩过滤器
简介:通过改变光照来实现颜色过滤,可以用来模拟简单的灯光效果。
构造:LightingColorFilter(int mul, int add)
参数:mul:色彩倍增,用来和目标像素相乘
add:色彩添加,用来和目标像素相加(都是16进制的色彩值)
算法: (RGB值 * mul + Add) % 255,从而得到新的RPG值,整个过程中Alpha不参与改变;
PorterDuffColorFilter混排颜色过滤器
简介:通过指定具体颜色值和PorterDuff混合模式来实现图片颜色的改变。
构造:PorterDuffColorFilter(int color, PorterDuff.Mode mode)
使用:paint.setColorFilter(new PorterDuffColorFilter(color,mode));
img.setColorFilter(new PorterDuffColorFilter(color,mode));
ColorMatrixColorFilter颜色矩阵过滤器
ColorMatrix颜色矩阵:是(4 * 5)的一个颜色矩阵,1~4行定义RGBA,第五列定义颜色偏移量
使用封好的api修改颜色矩阵:
setRotate(int axis, float degrees):设置色调
setSaturation(float sat):设置饱和度
setScale(float rScale, float gScale, float bScale, float aScale):设置亮度
4.处理源图像和 View 已有内容的关系(混合计算方式)
setXfermode(Xfermode xfermode)
Xfermode:指的是你要绘制的内容和 Canvas 的目标位置的内容应该怎样结合计算出最终的颜色
PorterDuff.Mode:用来指定两个图像共同绘制时的颜色策略。(目前只有这个子类)
在API中Android为我们提供了18种模式(比上图多了两种ADD和OVERLAY)
1.Alpha 合成 (Alpha Compositing):PorterDuff算法(描述了12种关于 Alpha 通道将两个图像共同绘制的操作)
2.混合 (Blending):操作颜色的本身Photoshop软件里的那些模式(与Alpha、PorterDuff无关,属于Google官方加入的)
CLEAR:清除图像
SRC:只显示源图像
DST:只显示目标图像
SRC_OVER:将源图像放在目标图像上方
DST_OVER:将目标图像放在源图像上方
SRC_IN:只在源图像和目标图像相交的地方绘制【源图像】
DST_IN:只在源图像和目标图像相交的地方绘制【目标图像】,绘制效果受到源图像对应地方透明度影响
SRC_OUT:只在源图像和目标图像不相交的地方绘制【源图像】,
相交的地方根据目标图像的对应地方的alpha进行过滤,目标图像完全不透明则完全过滤,完全透明则不过滤
DST_OUT:只在源图像和目标图像不相交的地方绘制【目标图像】,
在相交的地方根据源图像的alpha进行过滤,源图像完全不透明则完全过滤,完全透明则不过滤
SRC_ATOP:在源图像和目标图像相交的地方绘制【源图像】,在不相交的地方绘制【目标图像】,
相交处的效果受到源图像和目标图像alpha的影响
DST_ATOP:在源图像和目标图像相交的地方绘制【目标图像】,在不相交的地方绘制【源图像】,
相交处的效果受到源图像和目标图像alpha的影响
XOR:在源图像和目标图像相交的地方之外绘制它们,在相交的地方受到对应alpha和色值影响,如果完全不透明则相交处完全不绘制
DARKEN:变暗,较深的颜色覆盖较浅的颜色,若两者深浅程度相同则混合
LIGHTEN:变亮,与DARKEN相反,DARKEN和LIGHTEN生成的图像结果与Android对颜色值深浅的定义有关
MULTIPLY:正片叠底,源图像素颜色值乘以目标图像素颜色值除以255得到混合后图像像素颜色值
SCREEN:滤色,色调均和,保留两个图层中较白的部分,较暗的部分被遮盖
ADD:饱和相加,对图像饱和度进行相加,不常用
OVERLAY:叠加
离屏缓冲(Off-screen Buffer)
简介:把内容绘制在额外的缓冲层上,再把绘制好的内容贴回 View 中(解决直接绘制View层时范围外区域为黑色的问题)
两种方式:
1.Canvas.saveLayer():可以做短时的离屏缓冲
int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
canvas.drawXXX();
canvas.restoreToCount(saved);
2.View.setLayerType():直接把整个 View 都绘制在离屏缓冲中
setLayerType(LAYER_TYPE_HARDWARE):使用 GPU 来缓冲
setLayerType(LAYER_TYPE_SOFTWARE) :直接用一个 Bitmap 来缓冲