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.StyleFILLFILL_AND_STROKE Path 会自动封闭子图形

  • addXXX() 和 XXXTo()
    addXXX() 方法是添加子图形,是一次不间断的连线,每一个都会连在一起,而 XXXTo() 方法的每次调用都是新增一个子图形,不连线(即抬笔)

  • Path.setFillType(Path.FillType ft) 设置填充方式
    射线的方向不限

    顺时针 (CW clockwise) 和逆时针 (CCW counter-clockwise)

    1. EVEN_ODD 奇偶原则
      取点画射线,如果与图形相交的次数为奇数,则认为在内部,如果为偶数,则认为在外部
    2. WINDING 非零环绕数原则
  • 取点画射线,与图形相交,若顺时针交点则加1,若为逆时针则减1
  • 到最后,若结果为0,则认为这个点在外部,不涂色,若非0,则认为在内部,进行涂色

PorterDuff.Mode的合成模式

其中 ComposeShader composeShader = new ComposeShader(BatManShader batManLogoShader, PorterDuff.Mode.SRC_IN);的构造函数的参数中,第一个参数是目标图像(dst),第二个参数是 源图像(source)

  1. 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 不绘制源图像覆盖目标图像的部分
  1. 混合(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()方法会清空之前调用过的所有prepostset方法。

可以把Matrix变换想象成一个队列,队列里面包含了若干个变换操作,队列中每个操作按照先后顺序操作变换目标完成变换,pre相当于向队首增加一个操作,post相当于向队尾增加一个操作,set相当于清空当前队列重新设置。
例如:

1
2
3
4
5
m.postTranslate(100, 100);   
m.preScale(0.5f, 0.5f);
m.setScale(0.8f, 0.8f);
m.postScale(3f, 3f);
m.preTranslate(50f, 50f);

调用顺序:
translate(50f, 50f) -> scale(0.8f, 0.8f) -> scale(3f, 3f)

作者

PPTing

发布于

2023-03-13

更新于

2024-05-24

许可协议

评论