Android自定義View繪制貝塞爾曲線的方法
本文實例為大家分享了Android自定義View繪制貝塞爾曲線的具體代碼,供大家參考,具體內(nèi)容如下
在平面內(nèi)任選 3 個不共線的點,依次用線段連接。
在第一條線段上任選一個點 D。計算該點到線段起點的距離 AD,與該線段總長 AB 的比例。
根據(jù)上一步得到的比例,從第二條線段上找出對應的點 E,使得 AD:AB = BE:BC。
連接這兩點 DE。
從新的線段 DE 上再次找出相同比例的點 F,使得 DF:DE = AD:AB = BE:BC。
到這里,我們就確定了貝塞爾曲線上的一個點 F。接下來,請稍微回想一下中學所學的極限知識,讓選取的點 D 在第一條線段上從起點 A 移動到終點 B,找出所有的貝塞爾曲線上的點 F。所有的點找出來之后,我們也得到了這條貝塞爾曲線。
回過頭來看這條貝塞爾曲線,為了確定曲線上的一個點,需要進行兩輪取點的操作,因此我們稱得到的貝塞爾曲線為二次曲線(這樣記憶很直觀,但曲線的次數(shù)其實是由前面提到的伯恩斯坦多項式?jīng)Q定的)。
三個點的基本關系如下:
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以后效果如下:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android中EditText實現(xiàn)不可編輯解決辦法
這篇文章主要介紹了Android中EditText實現(xiàn)不可編輯解決辦法,需要的朋友可以參考下2014-12-12Android仿微信聯(lián)系人列表字母側(cè)滑控件
這篇文章主要為大家詳細介紹了Android仿微信聯(lián)系人列表字母側(cè)滑控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06Android開發(fā)Viewbinding委托實例詳解
這篇文章主要為大家介紹了Android開發(fā)Viewbinding委托實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06android RecyclerView側(cè)滑菜單,滑動刪除,長按拖拽,下拉刷新上拉加載
本篇文章主要介紹了android RecyclerView側(cè)滑菜單,滑動刪除,長按拖拽,下拉刷新上拉加載,非常具有實用價值,需要的朋友可以參考下。2017-03-03android實現(xiàn)關閉或開啟移動網(wǎng)絡數(shù)據(jù)
本篇文章是對android實現(xiàn)關閉或開啟移動網(wǎng)絡數(shù)據(jù)進行了詳細的分析介紹,需要的朋友參考下2013-06-06