Canvas 笔记
Path
arcTo 方法
在 path 中的arcTo()
方法只画弧形,不画扇形,所以没有useCenter
这个参数
其中的arcTo(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean forceMoveTo)
中的最后一个参数代表是否将画笔抬起,即强制将画笔的移到圆弧的起点再开始进行绘制addArc() 方法
这个方法与上一个方法的区别在于没有 forceMoveTo 这个参数,实际上等同于arcTo(...,true)
方法
arcTo() 和 addArc()。它们也是用来画线的,但并不使用当前位置作为弧线的起点。
close() 方法
等同于 当前点连接到地点,即path.lineTo(起点x,起点y);
其中当Paint.Style
为FILL
或FILL_AND_STROKE
,Path
会自动封闭子图形addXXX() 和 XXXTo()
addXXX() 方法是添加子图形,是一次不间断的连线,每一个都会连在一起,而 XXXTo() 方法的每次调用都是新增一个子图形,不连线(即抬笔)Path.setFillType(Path.FillType ft) 设置填充方式
射线的方向不限顺时针 (CW clockwise) 和逆时针 (CCW counter-clockwise)
- EVEN_ODD 奇偶原则
取点画射线,如果与图形相交的次数为奇数,则认为在内部,如果为偶数,则认为在外部 - WINDING 非零环绕数原则
- EVEN_ODD 奇偶原则
- 取点画射线,与图形相交,若顺时针交点则加1,若为逆时针则减1
- 到最后,若结果为0,则认为这个点在外部,不涂色,若非0,则认为在内部,进行涂色
PorterDuff.Mode的合成模式
其中 ComposeShader composeShader = new ComposeShader(BatManShader batManLogoShader, PorterDuff.Mode.SRC_IN);
的构造函数的参数中,第一个参数是目标图像(dst)
,第二个参数是 源图像(source)
- Alpha 合成 (Alpha Compositing) 一共12种,具体可见Google文档
SRC
只画源图像SRC_OVER
二者都绘制,但要源图像放在目标图像的上面SRC_IN
只画源图像在目标图像中的部分SRC_ATOP
丢弃不在目标图像中的源图像,即二者都绘制,重叠部分绘制源图像 Discards the source pixels that do not cover destination pixels.SRC_OUT
只绘制不在目标图像中的源图像DST
只画目标图像DST_OVER
二者都绘制,但目标图像放在原图上面DST_IN
只画目标图像在源图像中的部分DST_ATOP
丢弃不在源图像中的目标图像,即二者都绘制,重叠部分绘制目标图像 Discards the destination pixels that are not covered by source pixels.DST_OUT
只绘制不在源图像中的目标图像CLEAR
清除被源图像覆盖的部分XOR
不绘制源图像覆盖目标图像的部分
- 混合(Blending)
这几类主要是通过修改图层
- setStrokeMiter(float miter) 方法
其中参数miter
的意义是miter=a/b
,若我们定义拐角的值为α,则miter=1/sin(α/2)
,而当我们设置这个值的时候,当大于这个值的角会被保留,而小于这个角度的角责备削平,即Paint.Join.MITER
模式,当设置的miter
的值越大的时候,则α
越小。
getTextBounds() 方法
在Paint.getTextBounds(String text, int start, int end, Rect bounds)
方法中,获取到的bounds
,如果要取到该字符text
的中间值,即该字符距离x轴的距离,为(bounds.top + bounds.bottom)/2
而不是(bounds.bottom - bottom.top)/2
,因为在绘制的时候,x轴其实就是baseline
,而yoffset
的实际意义就是文字水平中心线与文字基线之间的距离。Matrix
在设置多次matrix
的时候,需要调用.reset()
方法,否则其属性值会进行相加。
Matrix中有三类方法preXX()
、setXX()
、postXX()
所有的方法都是对矩阵进行变换
假设M
为原始矩阵,则preXX()
方法是对矩阵进行右乘,即M' = M * S(sx, sy)
,postXX()
方法是对矩阵进行左乘,即M' = S(sx, sy) * M
,而setXX()
方法会清空之前调用过的所有pre
、post
、set
方法。
可以把Matrix变换想象成一个队列,队列里面包含了若干个变换操作,队列中每个操作按照先后顺序操作变换目标完成变换,pre相当于向队首增加一个操作,post相当于向队尾增加一个操作,set相当于清空当前队列重新设置。
例如:
1 | m.postTranslate(100, 100); |
调用顺序:
translate(50f, 50f) -> scale(0.8f, 0.8f) -> scale(3f, 3f)