京东到家,美团外卖等加入购物车的贝塞尔曲线view动画
2017-03-17 15:49
525 查看
import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.ViewGroup; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.TextView; /** * 加入购物车的贝塞尔曲线view */ public class BezierView extends TextView implements ValueAnimator.AnimatorUpdateListener { public static final int VIEW_SIZE = 20; public static final int DURATION = 600;//动画时长 protected Context mContext; protected Paint mPaint4Circle; protected int radius; protected Point startPosition; protected Point endPosition; public BezierView(Context context) { this(context, null); } public BezierView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BezierView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; mPaint4Circle = new Paint(); mPaint4Circle.setColor(Color.RED); mPaint4Circle.setAntiAlias(true); setGravity(Gravity.CENTER); setText("1"); setTextColor(Color.WHITE); setTextSize(12); } public void setStartPosition(Point startPosition) { startPosition.y -= 10; this.startPosition = startPosition; } public void setEndPosition(Point endPosition) { this.endPosition = endPosition; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int PX4SIZE = (int) convertDpToPixel(VIEW_SIZE, mContext); setMeasuredDimension(PX4SIZE, PX4SIZE); radius = PX4SIZE / 2; } @Override protected void onDraw(Canvas canvas) { canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, radius, mPaint4Circle); super.onDraw(canvas); } public void startBeizerAnimation() { if (startPosition == null || endPosition == null) return; int pointX = (startPosition.x + endPosition.x) / 2; int pointY = (int) (startPosition.y - convertDpToPixel(200, mContext)); Point controllPoint = new Point(poin d1d6 tX, pointY); BezierEvaluator bezierEvaluator = new BezierEvaluator(controllPoint); endPosition.offset(50,0); ValueAnimator anim = ValueAnimator.ofObject(bezierEvaluator, startPosition, endPosition); anim.addUpdateListener(this); anim.setDuration(DURATION); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); ViewGroup viewGroup = (ViewGroup) getParent(); viewGroup.removeView(BezierView.this); } }); anim.setInterpolator(new AccelerateDecelerateInterpolator()); anim.start(); } @Override public void onAnimationUpdate(ValueAnimator animation) { Point point = (Point) animation.getAnimatedValue(); setX(point.x); setY(point.y); invalidate(); } public class BezierEvaluator implements TypeEvaluator<Point> { private Point controllPoint; public BezierEvaluator(Point controllPoint) { this.controllPoint = controllPoint; } @Override public Point evaluate(float t, Point startValue, Point endValue) { int x = (int) ((1 - t) * (1 - t) * startValue.x + 2 * t * (1 - t) * controllPoint.x + t * t * endValue.x); int y = (int) ((1 - t) * (1 - t) * startValue.y + 2 * t * (1 - t) * controllPoint.y + t * t * endValue.y); return new Point(x, y); } } public static float convertDpToPixel(float dp, Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); float px = dp * (metrics.densityDpi / 160f); return px; } }
动画的使用
int startPosition[] = new int[2];v.getLocationInWindow(startPosition);playAnimation(startPosition);
/**
* 点击加号的跳动添加动画*/public void playAnimation(int[] start_location) {BezierView bezierView = new BezierView(activity);bezierView.setStartPosition(new Point(start_location[0], start_location[1]));ViewGroup rootView = (ViewGroup) activity.getWindow().getDecorView();rootView.addView(bezierView);int endPosition[] = new int[2];((MainActivity)activity).getBtnBottomCart().getLocationInWindow(endPosition);bezierView.setEndPosition(new Point(endPosition[0], endPosition[1]));bezierView.startBeizerAnimation();}
相关文章推荐
- react-native 仿京东加入购物车动画效果
- android 饿了么 加入购物车动画(贝塞尔曲线绘制)
- Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画
- Android贝塞尔曲线实现加入购物车抛物线动画
- react-native 仿京东加入购物车动画效果
- 京东360buy 手机项目的“加入购物车”动画效果研究
- 把商品添加到购物车的动画效果(贝塞尔曲线)
- 仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮。
- IOS 加入购物车动画
- java-web京东购物网 加入购物车与查看购物车的实现运用session服务器端(在数据库中查询)
- jQuery实现加入购物车飞入动画效果
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
- 类似淘宝、美团外卖等app首页 Demo分析 tableView+collectionView
- 基于jquery fly插件实现加入购物车抛物线动画效果,jquery.fly.js
- ViewPager使用及加入动画
- View Controller Transition:京东加购物车效果
- View Controller Transition:京东加购物车效果
- 基于jquery fly插件实现加入购物车抛物线动画效果
- 基于jquery fly插件实现加入购物车抛物线动画效果
- iOS 仿淘宝加入购物车前选择尺寸,规格弹窗的向内凹陷折叠动画效果和标签流布局