Update
This commit is contained in:
@@ -138,7 +138,85 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于
|
||||
|
||||
首先,两个数据点是控制贝塞尔曲线开始和结束的位置,比较容易理解,而控制点则是控制贝塞尔的弯曲状态,相对来说比较难以理解,所以本示例重点在于理解贝塞尔曲线弯曲状态与控制点的关系,废话不多说,先上效果图:
|
||||
|
||||

|
||||
|
||||
主要代码如下:
|
||||
|
||||
``` java
|
||||
public class Bessel1 extends View {
|
||||
|
||||
private Paint mPaint;
|
||||
private int centerX, centerY;
|
||||
|
||||
private PointF start, end, control;
|
||||
|
||||
public Bessel1(Context context) {
|
||||
super(context);
|
||||
mPaint = new Paint();
|
||||
mPaint.setColor(Color.BLACK);
|
||||
mPaint.setStrokeWidth(8);
|
||||
mPaint.setStyle(Paint.Style.STROKE);
|
||||
mPaint.setTextSize(60);
|
||||
|
||||
start = new PointF(0,0);
|
||||
end = new PointF(0,0);
|
||||
control = new PointF(0,0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
centerX = w/2;
|
||||
centerY = h/2;
|
||||
|
||||
// 初始化数据点和控制点的位置
|
||||
start.x = centerX-200;
|
||||
start.y = centerY;
|
||||
end.x = centerX+200;
|
||||
end.y = centerY;
|
||||
control.x = centerX;
|
||||
control.y = centerY-100;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
// 根据触摸位置更新控制点,并提示重绘
|
||||
control.x = event.getX();
|
||||
control.y = event.getY();
|
||||
invalidate();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
super.onDraw(canvas);
|
||||
|
||||
// 绘制数据点和控制点
|
||||
mPaint.setColor(Color.GRAY);
|
||||
mPaint.setStrokeWidth(20);
|
||||
canvas.drawPoint(start.x,start.y,mPaint);
|
||||
canvas.drawPoint(end.x,end.y,mPaint);
|
||||
canvas.drawPoint(control.x,control.y,mPaint);
|
||||
|
||||
// 绘制辅助线
|
||||
mPaint.setStrokeWidth(4);
|
||||
canvas.drawLine(start.x,start.y,control.x,control.y,mPaint);
|
||||
canvas.drawLine(end.x,end.y,control.x,control.y,mPaint);
|
||||
|
||||
// 绘制贝塞尔曲线
|
||||
mPaint.setColor(Color.RED);
|
||||
mPaint.setStrokeWidth(8);
|
||||
|
||||
Path path = new Path();
|
||||
|
||||
path.moveTo(start.x,start.y);
|
||||
path.quadTo(control.x,control.y,end.x,end.y);
|
||||
|
||||
canvas.drawPath(path, mPaint);
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user