文章目录
前言
记录一些自定义绘制时的小知识点,包括Canvas、Path、Paint、PathMeasure 等工具类。
1. Path在调用addCircle()、addArc()等方法时,需要传一个Direction参数
public void addCircle(float x, float y, float radius, @NonNull Direction dir) {
isSimplePath = false;
nAddCircle(mNativePath, x, y, radius, dir.nativeInt);
}
public void addArc(@NonNull RectF oval, float startAngle, float sweepAngle) {
addArc(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle);
}
Direction是个枚举,有两个值,用来表示这个路径的绘制方向
CW : 顺时针
CCW : 逆时针
2. Path有一个属性fillType,用来表示填充方式
public void setFillType(@NonNull FillType ft) {
nSetFillType(mNativePath, ft.nativeInt);
}
FillType 是个枚举,有四个值
WINDING : 根据图形的绘制方向,任一点发出的射线与顺时针方向相交+1,逆时针方向相交-1,和为0则为填充,不为1则是镂空
EVEN_ODD : 不管绘制方向,任一点发出的射线与图形的交点,如果是奇数为填充,偶数为镂空
INVERSE_WINDING :与WINDING相反
INVERSE_EVEN_ODD :与EVEN_ODD相反
借用一张网图:
3. PathMeasure,Path的测量工具类
//path如果改变,需要调用setPath重新设置,第二个参数为是否将首尾连接闭合
val pathMeasure = PathMeasure(path, false)
//Path的长度
pathMeasure.length
//获取path中距离起点distance的点的坐标和正切值,存到Matrix中
val matrix = Matrix()
pathMeasure.getMatrix(
5f,
matrix,
PathMeasure.POSITION_MATRIX_FLAG and PathMeasure.TANGENT_MATRIX_FLAG
)
//获取Path中距离起点distance的点的坐标和正余弦值
val pos = FloatArray(2)
val tan = FloatArray(2)
pathMeasure.getPosTan(5f, pos, tan)
4. Paint有个属性pathEffect,用来设置Path的效果
例如使用PathDashPathEffect来画虚线
public PathDashPathEffect(Path shape, //虚线的形状
float advance, //前置量
float phase, //间隔
Style style //Style, 分为 TRANSLATE ROTATE MORPH
) {
native_instance = nativeCreate(shape.readOnlyNI(), advance, phase, style.native_style);
}
5. Paint有个属性xfermode,用来设置图形的融合模式
public Xfermode setXfermode(Xfermode xfermode) {
return installXfermode(xfermode);
}
目前,Xfermode只有一个子类,就是PorterDuffXfermode类,构造函数中需要传入一个PorterDuff.Mode参数。
这个Mode有以下类型