美文网首页安卓动画效果自定义viewUI
【原创】属性动画-仿网易彩票数字奖池动画效果

【原创】属性动画-仿网易彩票数字奖池动画效果

作者: 刀放下好好说话 | 来源:发表于2017-09-04 16:27 被阅读74次

一、先看网易中奖奖池的效果

wangyi.gif

二、思路

明显的动画效果,而且是随着时间的推移,前面的数字暂停下来。数字的滚动用线程?!当然可以实现。但是前面的数字停下,这种效果不好处理。我开始想的是从最大的数字开始跑,一直减到0,在跑的过程中比对数字的位数,高位的就截取最终的结果,低位的显示当前的计数。同样的很麻烦,而且控制不了显示的位数,万一显示上亿,GG了。
换思路,我发现网易的动画里每个位置上的数字都是很随机的出现,不是规律的递减。那就获取最终结果的位数,然后线程里随机0到9:

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < size; i++) {
            sb.append((int) Math.ceil(Math.random() * 9));
        }
        return sb.toString();

如果size是5,返回的一直是一个五位数,当很快速的刷新的时候,效果就很动画了。
上述代码实际测试可以实现。但是要想实现前面的数字暂停下来的效果,又没有了思路。

三、巧合

在搜索的时候,发现属性动画里有一个参数fraction,一直是从0到1(左右包含)的变化,感觉很有戏。因为这个暂停的数字看作进度,也是从[0,1]区间里变化。

3.1 定义估值器

    public class NumberEvaluator implements TypeEvaluator<String> {
    
        @Override
        public String evaluate(float fraction, String startValue, String endValue) {
            int size = endValue.length();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < size; i++) {
                if(i * 1.0 / size > fraction) {
                    sb.append((int) Math.ceil(Math.random() * 9));
                }else{
                    sb.append(String.valueOf(endValue).charAt(i));
                }
            }
            return sb.toString();
        }
    }

这个类就是传入一个开始值和一个结束值,然后返回无数的中间值,这个fraction默认0到1变化(不知道可不可以改变)。我们遍历显示的位数,如果它与整体的比值大于fraction,说明进度还没有到,如果小于,说明已经过了这个进度,画个图示意一下:

test.png

就是随着时间的流逝,返回最终值得前几位和随机值的组合。

四、代码实现

        ValueAnimator numberAnim = ValueAnimator.ofObject(new NumberEvaluator(), "0", "676767676767");
        numberAnim.setDuration(3000);
        numberAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                String number = (String) animation.getAnimatedValue();
                tvNumber.setText(number);
            }
        });
        numberAnim.start();
        numberAnim.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                tvNumber.setText("676767676767");
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });

new一个定义的估值器扔进去,起始值不关心,传空,传一个最终的显示值,然后动画里不断的监听拿到中间值设置进去,动画结束,把最终的值设置上,结束。

五、最终效果

number.gif

附上GayHub地址,有兴趣可以肛一波。

相关文章

  • 【原创】属性动画-仿网易彩票数字奖池动画效果

    一、先看网易中奖奖池的效果 二、思路 明显的动画效果,而且是随着时间的推移,前面的数字暂停下来。数字的滚动用线程?...

  • [Android动画]属性动画-小球下落动画实现

    属性动画 属性动画是通过直接改变View属性,实现的动画效果。与补间动画不同的是,属性动画是对象的属性的真实改变,...

  • 属性动画animator

    属性动画和传统动画的区别 传统动画只是具有显示的效果,不会正真改变位置、属性动画则相反 传统动画的写法 属性动画的...

  • Android动画之属性动画

    属性动画和补间动画的不同之处就是它通过动态改变对象的属性从而达到动画效果,它可以对任何对象做动画,并且动画效果也得...

  • Android属性动画基础篇

    1、什么是属性动画 简单来说就是通过改变对象属性而形成的动画效果。 2、为什么使用属性动画 我们知道,在属性动画之...

  • 属性动画—仿雅虎加载效果

    通过自定view绘制几个不同颜色的小圆,通过旋转、聚合等动画实现的一个加载效果;自绘控件,肯定少不了画笔的使用; ...

  • 属性动画Android实践—仿网易云乐签动画实现

    最近使用网易云签到时发现它的乐签动画效果很不错,正好抱着回顾下属性动画跟自定义View的心态来自己实现下这个效果,...

  • 使用lottie加载json动画

    github代码传送门 先上效果图,这个是做的一个仿抖音的点赞动画: 众所周知,属性动画、补间动画通常只能做一些效...

  • 笔记:Android 动画

    Android 动画 Android动画分为三种: 属性动画 帧动画 View动画 View动画支持4种效果 平移...

  • Android UI——Material Design——属性动

    属性动画 什么是属性动画 属性动画是从3.0及以后出现的,可以不断的控制控件的属性变化达到动画的效果,一般我们是一...

网友评论

    本文标题:【原创】属性动画-仿网易彩票数字奖池动画效果

    本文链接:https://www.haomeiwen.com/subject/oupejxtx.html