自定义View-签到(二)

本文介绍了一种通过Android自定义视图实现签到动画的方法。该动画包括从起始位置沿特定路径移动到目标位置的过程,并伴有旋转动画效果,最终完成签到。文中详细展示了如何通过代码设置路径、测量路径长度、更新视图位置等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.当我们点击签到,也会有些动画效果,就比如下面这种,从开始位置沿着一个path运动到目标位置,然后签到成功。

 

 

2.实现代码

public void btn_sign(final View view) {

        view.setClickable(false);
        generateCoin.setVisibility(View.VISIBLE);

        //获取控件当前位置
        final int[] startLoc = new int[2];
        generateCoin.getLocationInWindow(startLoc);

        //获取目标位置
        int[] targetLoc = new int[2];
        targetCoin.getLocationInWindow(targetLoc);

        path.reset();
        path.moveTo(startLoc[0],startLoc[1]);
        path.cubicTo(2*(startLoc[0]+targetLoc[0])/3,2*(startLoc[1]+targetLoc[1])/3,(startLoc[0]+targetLoc[0])/3,(startLoc[1]+targetLoc[1])/3,targetLoc[0],targetLoc[1]);

        pathMeasure = new PathMeasure(path, false);

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, pathMeasure.getLength());

        valueAnimator.setDuration(1000);
        valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);

                view.setClickable(true);
                generateCoin.setVisibility(View.INVISIBLE);
                generateCoin.setX(startLoc[0]);
                generateCoin.setY(startLoc[1]);

                startAddCoin();
            }
        });
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();

                //按照path,移动view到目标位置
                pathMeasure.getPosTan(value, mCurrentPosition, null);
                generateCoin.setX(mCurrentPosition[0]);
                generateCoin.setY(mCurrentPosition[1]);
            }
        });

        valueAnimator.start();

    }

    private void startAddCoin() {
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(targetCoin, "rotationY", 0, 720);

        animator1.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);

                coinCount.setText(String.valueOf(Integer.parseInt((String) coinCount.getText())+12));
            }
        });
        animator1.setDuration(800).start();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值