需要的知识点:canvas.drawPath(),path的布尔运算,path绘制图案
path的布尔运算
/**
* Set this path to the result of applying the Op to this path and the specified path.
* The resulting path will be constructed from non-overlapping contours.
* The curve order is reduced where possible so that cubics may be turned
* into quadratics, and quadratics maybe turned into lines.
*
* @param path The second operand (for difference, the subtrahend)
*
* @return True if operation succeeded, false otherwise and this path remains unmodified.
*
* @see Op
* @see #op(Path, Path, android.graphics.Path.Op)
*/
public boolean op(Path path, Op op) {
return op(this, path, op);
}
可以看到需要传递参数path和 op
第一个参数path的东西太多了,有空大家自己去看看文档
第二个参数op 就定义了几个属性
/**
* The logical operations that can be performed when combining two paths.
*
* @see #op(Path, android.graphics.Path.Op)
* @see #op(Path, Path, android.graphics.Path.Op)
*/
public enum Op {
/**
* Subtract the second path from the first path.
*/
DIFFERENCE,
/**
* Intersect the two paths.
*/
INTERSECT,
/**
* Union (inclusive-or) the two paths.
*/
UNION,
/**
* Exclusive-or the two paths.
*/
XOR,
/**
* Subtract the first path from the second path.
*/
REVERSE_DIFFERENCE
}
DIFFERENCE 数学中叫差集
取值 path1-path2
2.INTERSECT 交集
Path1与Path2相交的部分
3.UNION 并集
Path1与Path2的全部部分
4.XOR
Path1和Path2的全部去除相交的部分
5.REVERSE_DIFFERENCE
这个看名字就知道是和第一个相反了解了上边的这些,咱们开始绘制太极图案
首先绘制大体轮廓
canvas.translate(mWith / 2, mHeight / 2);//把坐标移动到中心位置
Path path1 = new Path();
Path path2 = new Path();
Path path3 = new Path();
Path path4 = new Path();
Path path5 = new Path();
Path path6 = new Path();
path1.addCircle(0, 0, 200, Path.Direction.CW);
path6.addCircle(0, 0, 200, Path.Direction.CW);
path2.addRect(0, -200, 200, 200, Path.Direction.CW);
path5.addRect(-200, -200, 0, 200, Path.Direction.CW);
path3.addCircle(0, -100, 100, Path.Direction.CW);
path4.addCircle(0, 100, 100, Path.Direction.CW);
- 接着开始按上边介绍的交集、并集取值
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
/**
* 绘制白色太极
*/
//差集 p1减去和p2后剩下的
path1.op(path2, Path.Op.DIFFERENCE);
//并集
path1.op(path3, Path.Op.UNION);
path1.op(path4, Path.Op.DIFFERENCE);
canvas.drawPath(path1, mPaint);
/**
* 绘制黑色太极
*/
mPaint.setColor(Color.BLACK);
path6.op(path5, Path.Op.DIFFERENCE);
path6.op(path4, Path.Op.UNION);
path6.op(path3, Path.Op.DIFFERENCE);
canvas.drawPath(path6, mPaint);
}
- 绘制太极里边的小圆点
/**
* 绘制太极图案中的小圆点
* @param canvas 画布
*/
private void drawSmallCircle(Canvas canvas) {
Path pathBlack = new Path();
Path pathWhite = new Path();
mPaint.setColor(Color.BLACK);
pathBlack.addCircle(0, -100, 20, Path.Direction.CW);
canvas.drawPath(pathBlack, mPaint);
mPaint.setColor(Color.WHITE);
pathWhite.addCircle(0, 100, 20, Path.Direction.CW);
canvas.drawPath(pathWhite, mPaint);
}
最后效果图