国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android貝塞爾曲線初步學習第一課

2019-10-23 18:34:53
字體:
來源:轉載
供稿:網友

貝塞爾曲線有一階、二階、三階、N階

一階就是一條直線,有起點終點,沒有控制點,對應方法就是

canvas.drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint) ;

二階為曲線,有起點終點,一個控制點,對應方法就是

path.quadTo(float x1, float y1, float x2, float y2);

其中x1、y1為控制點坐標, x2、y2為終點坐標,效果如下:

Android,貝塞爾曲線

三階由倆個控制點控制,對應方法就是

path.cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);

其中x1、y1、x2、y2為兩個控制點坐標, x3、y3為終點坐標,效果如下:

Android,貝塞爾曲線

做一個demo鞏固一下用法:

Android,貝塞爾曲線

新建一個SecondBezierView繼承View,重寫構造方法、初始化畫筆、固定起點和終點的坐標,重寫onTouchEvent()方法獲取當前點擊的點為控制點:

 @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: mControlX = event.getX(); mControlY = event.getY(); invalidate(); break; } return true; }

在onDraw()方法中畫點、畫連接線、畫文本、畫二階貝塞爾曲線

 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(mStartX, mStartY, 8, mLinePaint); canvas.drawText("起點", mStartX, mStartY, mLinePaint); canvas.drawCircle(mEndX, mEndY, 8, mLinePaint); canvas.drawText("終點", mEndX, mEndY, mLinePaint); canvas.drawCircle(mControlX, mControlY, 8, mLinePaint); canvas.drawText("控制點", mControlX, mControlY, mLinePaint); canvas.drawLine(mStartX, mStartY, mControlX, mControlY, mLinePaint); canvas.drawLine(mEndX, mEndY, mControlX, mControlY, mLinePaint); mBezierPath.reset();//因為不斷重繪,path的路徑也要重置,不然頁面上會顯示很多條線 mBezierPath.moveTo(mStartX, mStartY);//移至起點 mBezierPath.quadTo(mControlX, mControlY, mEndX, mEndY);//二階貝塞爾曲線,傳入控制點和終點坐標 canvas.drawPath(mBezierPath, mBezierPaint); }

最后添加一個回彈的動畫,用的是OvershootInterpolator插值器,在onTouchEvent的MotionEvent.ACTION_UP中:

 case MotionEvent.ACTION_UP: ValueAnimator animX = ValueAnimator.ofFloat(mControlX, getWidth() / 2); animX.setDuration(500); animX.setInterpolator(new OvershootInterpolator()); animX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mControlX = (float) animation.getAnimatedValue(); invalidate(); } }); animX.start(); ValueAnimator animY = ValueAnimator.ofFloat(mControlY, getHeight() / 2); animY.setDuration(500); animY.setInterpolator(new OvershootInterpolator()); animY.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mControlY = (float) animation.getAnimatedValue(); invalidate(); } }); animY.start(); break;

再來個三階的

Android,貝塞爾曲線

主要就是用到了多點觸控:

 private boolean mIsSecondPoint = false; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) {//多點觸控 case MotionEvent.ACTION_POINTER_DOWN: mIsSecondPoint = true; break; case MotionEvent.ACTION_POINTER_UP: mIsSecondPoint = false; break; case MotionEvent.ACTION_MOVE: mControlX1 = event.getX(0);//獲取控制點1的橫縱坐標 mControlY1 = event.getY(0); if (mIsSecondPoint) {  mControlX2 = event.getX(1);//獲取控制點2的橫縱坐標  mControlY2 = event.getY(1); } invalidate(); break; } return true; }

然后再onDraw()中畫三階貝塞爾曲線

 mBezierPath.reset(); mBezierPath.moveTo(mStartX, mStartY); mBezierPath.cubicTo(mControlX1, mControlY1, mControlX2, mControlY2, mEndX, mEndY); canvas.drawPath(mBezierPath, mBezierPaint);

大功告成,打完收工。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 满城县| 佛教| 潼南县| 南昌市| 沂源县| 邢台市| 岑巩县| 乌鲁木齐县| 博野县| 鄂托克前旗| 东乌珠穆沁旗| 墨江| 双牌县| 曲水县| 汝城县| 斗六市| 清原| 长治市| 阿勒泰市| 农安县| 凉城县| 晋州市| 潼关县| 青川县| 共和县| 竹北市| 偃师市| 涿州市| 临城县| 稷山县| 武乡县| 玉田县| 巨鹿县| 铜川市| 子长县| 柳河县| 剑川县| 饶河县| 达拉特旗| 澄江县| 宁波市|