Android应用开发android 购物车小球掉落动画
白羽 2019-03-12 来源 :网络 阅读 1200 评论 0

摘要:本文将带你了解Android应用开发android 购物车小球掉落动画,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发android 购物车小球掉落动画,希望本文对大家学Android有所帮助。



Android应用开发android 购物车小球掉落动画



    先贴效果图
   
   
   
    对自定义View小红球的绘制
   

    public class BallView extends TextView implements   ValueAnimator.AnimatorUpdateListener {
     
        public static final int VIEW_SIZE   = 20;
     
        protected Context mContext;
        protected Paint   mPaint4Circle;
        protected int radius;
     
        protected Point   startPosition;
        protected Point   endPosition;
     
     
        public BallView(Context context)   {
            this(context, null);
        }
     
        public BallView(Context context,   AttributeSet attrs) {
            this(context, attrs,   0);
        }
     
        public BallView(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 pxSize = (int)   convertDpToPixel(VIEW_SIZE, mContext);
            //绘制大小
            setMeasuredDimension(pxSize,   pxSize);
            //求出半径
            radius = pxSize / 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;
            }
     
            //绘制一个贝塞尔曲线的控制点   默认每个往上飞100
            int pointX = (startPosition.x   + endPosition.x) / 2;
            int pointY = (int)   (startPosition.y - convertDpToPixel(100, mContext));
            Point controllPoint = new   Point(pointX, pointY);
     
            BezierEvaluator   bezierEvaluator = new BezierEvaluator(controllPoint);
            ValueAnimator anim =   ValueAnimator.ofObject(bezierEvaluator, startPosition, endPosition);
              anim.addUpdateListener(this);
            anim.setDuration(400);
            anim.addListener(new   AnimatorListenerAdapter() {
                @Override
                public void   onAnimationEnd(Animator animation) {
                      super.onAnimationEnd(animation);
                    ViewGroup viewGroup =   (ViewGroup) getParent();
                    //动画完成后移除view
                      viewGroup.removeView(BallView.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{
     
            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);
            }
        }
     
        //dp转换px
        public static float   convertDpToPixel(float dp, Context context) {
            Resources resources =   context.getResources();
            DisplayMetrics metrics =   resources.getDisplayMetrics();
     
            float px = dp *   (metrics.densityDpi / 160f);
            return px;
        }
    }

        

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程