Android绘制Paint学习笔记

来源:互联网 发布:淘宝买烟暗语 编辑:程序博客网 时间:2024/06/01 09:45

一.Shader

> 着色器,一种颜色渲染方案, 和setColor平级,用了Shader表示就shader的颜色方案来绘制,不会再使用setColor了.
1.LinearGradient
Shader shader = new LinearGradient(100, 100, 500, 500, Color.parseColor("#E91E63"),          Color.parseColor("#2196F3"), Shader.TileMode.CLAMP);paint.setShader(shader);canvas.drawCircle(300, 300, 200, paint);  

参数 :
1.x0,y0 渲染起点
2.x1,y1 渲染终点
3.startColor 开始颜色
4.endColor结束颜色
5. Shader.TileMode CLAMP:沿用边缘最后一个像素向外扩张 REPEAT:重复整个之前渲染过程 MIRROR:镜像重复

2.RadialGradient
>不知道怎么描述,个人理解为菊花形状,当然颜色之间有渐变
Shader shader = new RadialGradient(300, 300, 200, Color.parseColor("#E91E63"),          Color.parseColor("#2196F3"), Shader.TileMode.CLAMP);paint.setShader(shader);...canvas.drawCircle(300, 300, 200, paint); 

参数:
1. centerX
2. centerY
3. radius
4. centerColor 中心的起始颜色
5. edgeColor 我感觉应该叫endColor?
6. TileMode tileMode

3.SweepGradient
> 以一个点为中心,重0°开始扫描到360°.颜色渐变
Shader shader = new SweepGradient(300, 300, Color.parseColor("#E91E63"),          Color.parseColor("#2196F3"));paint.setShader(shader);...canvas.drawCircle(300, 300, 200, paint);  
  1. centerX
  2. centerY
  3. startColor
  4. endColor
4.BitmapShader
>为毛上面的叫Gradient 这个又叫Shader,就不能统一下,可以实现例如:画圆头像  
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.batman);  Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);  paint.setShader(shader);canvas.drawCircle(300, 300, 200, paint);  
  1. Bitmap 画笔基于的图片
  2. TileMode

二.PorterDuff

Porter 是一个人,这个人发明了一个绘制思想,叫Alpha 合成.(简单理解为shader之间是互斥的) Duff也是一个人 ,发明的是混合 (Blending).(融合渲染) 简单来说,这个东西就是作为绘制内容的颜色处理方案. 还有这种操作?
使用场景:

// 第一个 Shader:头像的 BitmapBitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.batman);  Shader shader1 = new BitmapShader(bitmap1, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);// 第二个 Shader:从上到下的线性渐变(由透明到黑色)Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.batman_logo);  Shader shader2 = new BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);// ComposeShader:结合两个 ShaderShader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.SRC_OVER);  paint.setShader(shader);canvas.drawCircle(300, 300, 300, paint); 

有很多种组合方式,可以到官文里看看:
PorterDuff的17种模式介绍

三.ColorFilter

颜色滤镜 : 使用方法 aint.setColorFilter(ColorFilter filter)
有三个子类使用: LightingColorFilter PorterDuffColorFilter 和 ColorMatrixColorFilter。

LightingColorFilter

以原来的颜色为#ffffff为基准,输入过滤的颜色,结果为剩下的颜色
计算方法:
R’ = R * 0x0 / 0xff + 0x0 = 0 // 红色被移除
G’ = G * 0xff / 0xff + 0x0 = G
B’ = B * 0xff / 0xff + 0x0 = B

ColorFilter lightingColorFilter = new LightingColorFilter(0x00ffff, 0x000000);  paint.setColorFilter(lightingColorFilter);  

参数:
1. int mul 需要被过滤的颜色(16进制)(上面的/)
2. int add 需要增加的颜色 (16进制) (上面的+)

PorterDuffColorFilter

和ComposeShader 有点类似和区别 PorterDuffColorFilter只能指定颜色 ComposeShader可以指定shader (特指BitmapShader)

ColorMatrixColorFilter

使用一个 ColorMatrix 来对颜色进行处理。 ColorMatrix 这个类,内部是一个 4x5 的矩阵.
这个调整的范围就有点大了,很难控制调整的颜色和预期的统一,毕竟大家都是正常人.
API里内置了 常用使用场景可以用方法setSaturation(float sat)来设置. 知识很深,等使用到就会深入研究.

四. setXfermode(Xfermode xfermode)

用来整合paint要绘制的内容View中已有的内容的组合方式
注: 使用完Xfermode要setnull清楚

Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);canvas.drawBitmap(rectBitmap, 0, 0, paint); // 画方  paint.setXfermode(xfermode); // 设置 Xfermode  canvas.drawBitmap(circleBitmap, 0, 0, paint); // 画圆  paint.setXfermode(null); // 用完及时清除 Xfermode  

很多地方涉及到PorterDuff
这里写图片描述
离屏缓冲:
前提:使用了XFermode.
问题: 会将整个canvas的一起绘制到第二个canvas上.导致重叠部分黑色.
做法:Canvas.saveLayer() 离屏缓冲将绘制内容绘制到一个缓冲区,再讲缓冲和目标组合绘制.

int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);canvas.drawBitmap(rectBitmap, 0, 0, paint); // 画方paint.setXfermode(xfermode); // 设置 Xfermodecanvas.drawBitmap(circleBitmap, 0, 0, paint); // 画圆paint.setXfermode(null); // 用完及时清除 Xfermodecanvas.restoreToCount(saved);