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

首頁 > 系統 > Android > 正文

Android貝塞爾曲線初步學習第三課 Android實現添加至購物車的運動軌跡

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

不知上一節高仿QQ未讀消息氣泡大家還喜歡么,今天繼續練習貝賽爾曲線,這一節我們通過貝賽爾曲線和屬性動畫估值器實現添加至購物車的運動軌跡,效果如下:

這里寫圖片描述

1、新建自定義View,重寫構造方法,初始化Paint、Path;

2、確定起始點、終止點、控制點坐標,這里我們直接固定:

 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {  super.onSizeChanged(w, h, oldw, oldh);  mStartX = 100;  mStartY = 100;  mEndX = w - 100;  mEndY = h - 100;  mControlX = w - 100;  mControlY = 100; }

3、畫起止點小球和貝賽爾曲線路徑:

@Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  canvas.drawCircle(mStartX, mStartY, 24, mCirclePaint);  canvas.drawCircle(mEndX, mEndY, 24, mCirclePaint);  mPath.reset();  mPath.moveTo(mStartX, mStartY);  mPath.quadTo(mControlX, mControlY, mEndX, mEndY);  canvas.drawPath(mPath, mPathPaint); }

這樣基本的東西就完成了。

4、那么該怎樣使一個小球隨著貝賽爾曲線的路徑軌跡運動呢,那就需要得到運動到當前的點在貝賽爾曲線上的坐標,使用如下工具類:

/** * 計算貝賽爾曲線坐標的工具類 */public class BezierUtil { /**  * B(t) = (1 - t)^2 * P0 + 2t * (1 - t) * P1 + t^2 * P2, t ∈ [0,1]  *  * @param t 曲線長度比例  * @param p0 起始點  * @param p1 控制點  * @param p2 終止點  * @return t對應的點  */ public static PointF calculateBezierPointForQuadratic(float t, PointF p0, PointF p1, PointF p2) {  PointF point = new PointF();  float temp = 1 - t;  point.x = temp * temp * p0.x + 2 * t * temp * p1.x + t * t * p2.x;  point.y = temp * temp * p0.y + 2 * t * temp * p1.y + t * t * p2.y;  return point; } /**  * B(t) = P0 * (1-t)^3 + 3 * P1 * t * (1-t)^2 + 3 * P2 * t^2 * (1-t) + P3 * t^3, t ∈ [0,1]  *  * @param t 曲線長度比例  * @param p0 起始點  * @param p1 控制點1  * @param p2 控制點2  * @param p3 終止點  * @return t對應的點  */ public static PointF calculateBezierPointForCubic(float t, PointF p0, PointF p1, PointF p2, PointF p3) {  PointF point = new PointF();  float temp = 1 - t;  point.x = p0.x * temp * temp * temp + 3 * p1.x * t * temp * temp + 3 * p2.x * t * t * temp + p3.x * t * t * t;  point.y = p0.y * temp * temp * temp + 3 * p1.y * t * temp * temp + 3 * p2.y * t * t * temp + p3.y * t * t * t;  return point; }}

只需要傳入對應的參數即可獲得到當前點在貝賽爾曲線上的坐標。其中曲線長度比例t 以及起始點、終止點都可以在屬性動畫估值器Evaluator中獲得:

/** * 貝賽爾曲線估值器 */public class BezierEvaluator implements TypeEvaluator<PointF> { /* 控制點坐標 */ private PointF mControlPoint; public BezierEvaluator(PointF controlPoint) {  mControlPoint = controlPoint; } @Override public PointF evaluate(float v, PointF pointF, PointF t1) {  return BezierUtil.calculateBezierPointForQuadratic(v, pointF, mControlPoint, t1); }}

注:Point與PointF的區別:
Point使用的是int類型來存儲x、y坐標,而PointF使用的是float類型。

5、設置點擊監聽setOnclickListner(this),重寫onClick方法:

 @Override public void onClick(View view) {  BezierEvaluator evaluator = new BezierEvaluator(new PointF(mControlX, mControlY));  PointF startPoint = new PointF(mStartX, mStartY);  PointF endPoint = new PointF(mEndX, mEndY);  ValueAnimator anim = ValueAnimator.ofObject(evaluator, startPoint, endPoint);  anim.setDuration(1000);  anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {   @Override   public void onAnimationUpdate(ValueAnimator valueAnimator) {    PointF curPoint = (PointF) valueAnimator.getAnimatedValue();    mCurX = (int) curPoint.x;    mCurY = (int) curPoint.y;    invalidate();   }  });  anim.start(); }

使用估值器BezierEvaluator的對象,在屬性動畫更新監聽中獲取到該當前所在位置,并重繪:

canvas.drawCircle(mCurX, mCurY, 24, mCirclePaint);

即可實現一種類似于添加至購物車的運動軌跡效果。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 枞阳县| 巴塘县| 新龙县| 盈江县| 武平县| 荆门市| 龙井市| 进贤县| 江华| 宝山区| 楚雄市| 义乌市| 河南省| 海兴县| 青岛市| 额敏县| 井陉县| 谷城县| 云浮市| 阿合奇县| 山阴县| 阿勒泰市| 巴东县| 建阳市| 天全县| 秦皇岛市| 永兴县| 丽水市| 平原县| 岳阳市| 泾阳县| 成武县| 龙山县| 岱山县| 商城县| 虞城县| 扶风县| 霍邱县| 荆门市| 商丘市| 上虞市|