本文小編為大家詳細介紹“Android怎么自定義View繪制貝塞爾曲線”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Android怎么自定義View繪制貝塞爾曲線”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在平面內任選 3 個不共線的點,依次用線段連接。
在第一條線段上任選一個點 D。計算該點到線段起點的距離 AD,與該線段總長 AB 的比例。
根據上一步得到的比例,從第二條線段上找出對應的點 E,使得 AD:AB = BE:BC。
連接這兩點 DE。
從新的線段 DE 上再次找出相同比例的點 F,使得 DF:DE = AD:AB = BE:BC。
到這里,我們就確定了貝塞爾曲線上的一個點 F。接下來,請稍微回想一下中學所學的極限知識,讓選取的點 D 在第一條線段上從起點 A 移動到終點 B,找出所有的貝塞爾曲線上的點 F。所有的點找出來之后,我們也得到了這條貝塞爾曲線。
回過頭來看這條貝塞爾曲線,為了確定曲線上的一個點,需要進行兩輪取點的操作,因此我們稱得到的貝塞爾曲線為二次曲線(這樣記憶很直觀,但曲線的次數其實是由前面提到的伯恩斯坦多項式決定的)。
三個點的基本關系如下:

Android 的Path類提供了繪制二階貝塞爾曲線的方法,使用方法如下:
public class CurveView extends View{
private float mSupX;
private float mSupY;
private int mWidth;
private int mHeight;
private Paint mPaint;
private Path mPath;
public CurveView(Context context) {
super(context);
}
public CurveView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(10);
mPath = new Path();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY) {
mWidth = widthSize;
}
if (heightMode == MeasureSpec.EXACTLY) {
mHeight = heightSize;
}
setMeasuredDimension(mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
mPath.reset();
mPath.moveTo(mWidth / 5, mHeight / 2); //設置起點
mPath.quadTo(mSupX, mSupY, mWidth * 4 / 5, mHeight / 2); //設置輔助點和終點
canvas.drawPath(mPath, mPaint);
canvas.drawPoint(mSupX, mSupY, mPaint);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_MOVE:
mSupX = event.getX();
mSupY = event.getY();
invalidate();
}
return true;
}
}Draw以后效果如下:

讀到這里,這篇“Android怎么自定義View繪制貝塞爾曲線”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。