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

首頁 > 系統 > Android > 正文

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

2019-12-12 03:23:28
字體:
來源:轉載
供稿:網友

貝塞爾曲線有一階、二階、三階、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為終點坐標,效果如下:

這里寫圖片描述

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

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

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

這里寫圖片描述

做一個demo鞏固一下用法:

這里寫圖片描述

新建一個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;

再來個三階的

這里寫圖片描述

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

 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);

大功告成,打完收工。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鸡西市| 沭阳县| 武山县| 平泉县| 卢氏县| 洛南县| 和硕县| 南江县| 乌兰浩特市| 盱眙县| 西峡县| 宁强县| 盘山县| 宁国市| 炎陵县| 郴州市| 霞浦县| 富川| 江达县| 江华| 汝州市| 徐州市| 威信县| 朔州市| 南雄市| 佳木斯市| 西平县| 威信县| 三原县| 辽源市| 凌源市| 龙岩市| 鄂州市| 天门市| 英超| 徐闻县| 黄陵县| 侯马市| 武穴市| 涞源县| 修水县|