@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class DrawPath extends View {
public DrawPath(Context context) {
super(context);
}
public DrawPath(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public DrawPath(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public DrawPath(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
Paint paint = new Paint();
Path path = new Path(); // 初始化 Path 对象
{
// 使用 path 对图形进行描述(这段描述代码不必看懂)
path.addArc(200, 200, 400, 400, -225, 225);
path.arcTo(400, 200, 600, 400, -180, 225, false);
path.lineTo(400, 542);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制出 path 描述的图形(心形),大功告成
canvas.drawPath(path, paint);
/*-------------------------------Path 方法第一类:直接描述路径-------------------------------*/
//1、第一组: addXxx() ——添加子图形
//addCircle(float x, float y, float radius, Direction dir) 添加圆
path.addCircle(500, 800, 200, Path.Direction.CW);
//addOval(float left, float top, float right, float bottom, Direction dir)
//addOval(RectF oval, Direction dir) 添加椭圆
//addRect(float left, float top, float right, float bottom, Direction dir)
//addRect(RectF rect, Direction dir) 添加矩形
//addRoundRect(RectF rect, float rx, float ry, Direction dir)
//addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir)
//addRoundRect(RectF rect,float[] radii, Direction dir)
//addRoundRect(float left, float top, float right, float bottom, float[] radii, Direction dir) 添加圆角矩形
//addPath(Path path) 添加另一个 Path
//2、第二组:xxxTo() ——画线(直线或曲线)
//lineTo(float x, float y) / rLineTo(float x, float y) 画直线
paint.setStyle(Paint.Style.STROKE);
path.lineTo(200, 1000); // 由当前位置 (0, 0) 向 (200, 1000) 画一条直线
path.rLineTo(100, 0); // 由当前位置 (100, 100) 向正右方 100 像素的位置画一条直线
//quadTo(float x1, float y1, float x2, float y2)
//rQuadTo(float dx1, float dy1, float dx2, float dy2) 画二次贝塞尔曲线
//cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)
//rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 画三次贝塞尔曲线
//moveTo(float x, float y) / rMoveTo(float x, float y) 移动到目标位置
paint.setStyle(Paint.Style.STROKE);
path.lineTo(100, 100); // 画斜线
path.moveTo(200, 100); // 我移~~
path.lineTo(200, 0); // 画竖线
paint.setStyle(Paint.Style.STROKE);
path.lineTo(100, 100); // 由当前位置 (0, 0) 向 (100, 100) 画一条直线
path.rLineTo(100, 0); // 由当前位置 (100, 100) 向正右方 100 像素的位置画一条直线
paint.setStyle(Paint.Style.STROKE);
path.lineTo(100, 100);
path.arcTo(100, 100, 300, 300, -90, 90, false); // 直接连线连到弧形起点(有痕迹)
//addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)
//addArc(RectF oval, float startAngle, float sweepAngle)
//又是一个弧形的方法。一个叫 arcTo ,一个叫 addArc(),都是弧形,区别在哪里?
//其实很简单: addArc() 只是一个直接使用了 forceMoveTo = true 的简化版 arcTo() 。
paint.setStyle(Paint.Style.STROKE);
path.lineTo(100, 100);
path.addArc(100, 100, 300, 300, -90, 90);
//close() 封闭当前子图形
//子图形未封闭
paint.setStyle(Paint.Style.STROKE);
path.moveTo(100, 100);
path.lineTo(200, 100);
path.lineTo(150, 150);
//子图形封闭
paint.setStyle(Paint.Style.STROKE);
path.moveTo(100, 100);
path.lineTo(200, 100);
path.lineTo(150, 150);
path.close(); // 使用 close() 封闭子图形。等价于 path.lineTo(100, 100)
canvas.drawPath(path, paint);
/*-------------------------------Path 方法第一类:直接描述路径-------------------------------*/
/*-------------------------------Path 方法第二类:辅助的设置或计算------------------------------*/
//Path.setFillType(Path.FillType ft) 设置填充方式
//方法中填入不同的 FillType 值,就会有不同的填充效果。FillType 的取值有四个:
//EVEN_ODD
//WINDING (默认值)
//INVERSE_EVEN_ODD
//INVERSE_WINDING
//drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 画 Bitmap
//drawBitmap(bitmap, 200, 100, paint);
//drawText(String text, float x, float y, Paint paint) 绘制文字
//canvas.drawText(text, 200, 100, paint);
//Paint.setTextSize(float textSize)
String text = "Hello";
paint.setTextSize(18);
canvas.drawText(text, 100, 25, paint);
paint.setTextSize(36);
canvas.drawText(text, 100, 70, paint);
paint.setTextSize(60);
canvas.drawText(text, 100, 145, paint);
paint.setTextSize(84);
canvas.drawText(text, 100, 240, paint);
/*-------------------------------Path 方法第二类:辅助的设置或计算------------------------------*/
}
}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP