/**
* Author : 黄家驹 time : 2017/8/1.
* 此乃二阶贝塞尔曲线的部分理解,目前不具有了解三阶贝塞尔曲线能力;往后会更新三阶贝塞尔曲线;
*/
public class MyBezier extends View {
private Paint paint;
private Path path;
private Point starpoint;
private Point endpoint;
private Point assistpoint;
private int VillainX;
private int VillainY;
public MyBezier(Context context) {
this(context, null);
}
public MyBezier(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyBezier(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
path = new Path();
//开始坐标
starpoint = new Point(300, 600);
//结束坐标
endpoint = new Point(900, 600);
//控制点坐标
assistpoint = new Point(600, 900);
// 抗锯齿
paint.setAntiAlias(true);
// 防抖动
paint.setDither(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 画笔颜色
paint.setColor(Color.BLACK);
// 笔宽
paint.setStrokeWidth(10);
// 空心
paint.setStyle(Paint.Style.STROKE);
// 重置路径
path.reset();
path.moveTo(starpoint.x, starpoint.y);
//二阶贝塞尔曲线重要方法
path.quadTo(assistpoint.x, assistpoint.y, endpoint.x, endpoint.y);
//画路线
canvas.drawPath(path, paint);
//固定控制点
// canvas.drawPoint(assistpoint.x,assistpoint.y,paint);
//填充图片
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ee), VillainX, VillainY, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//控制点改为手指点击坐标
VillainX = assistpoint.x = (int) event.getX();
VillainY = assistpoint.y = (int) event.getY();
invalidate();
break;
}
return true;
}
}
二阶贝塞尔曲线部分理解
最新推荐文章于 2024-01-18 11:30:09 发布