MetroLoading 加载动画

Posted BIGPiePieTree

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MetroLoading 加载动画相关的知识,希望对你有一定的参考价值。

Metro风格的条形谱线加载动画



           这个类似于Metro风格的动画在水平方向有很多的条形谱线上下缩放,并且有一定的规律 。先看一下效果吧 


然后就是怎么实现了,其实这个控件的实现很简单,就从动画的形式来说吧 第一、条形是呈水平排列的,第一想法肯定是继承ViewGroup然后拥有多个子View(我选择的是继承LinearLayout,这样的话就省去了onMeasure和onLayout啦 0.0) 第二、每一个单独的条形谱都在竖直方向上上下缩放,我想到的使用属性动画就可以很容易的实现了。
既然思路也有了 , show the code
首先我们先定义一些这个控件的attrs属性吧
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="lodingView">
        <attr name="color" format="color" />
        <attr name="barWidth" format="dimension" />
        <attr name="barHeight" format="dimension" />
        <attr name="barCount" format="integer" />
        <attr name="duration" format="integer" />
        <attr name="peakCount" format="integer"/>
    </declare-styleable>
</resources>

解释一下每个属性对应的控件表现,color 是条的颜色(当然条形的颜色也可以是彩色的),barWidth是条的宽度,barHeight是条的高度,barCount是条的数目,duration是动画时间,peakCount是在条形上下缩放的时候产生的波峰。那定义一个这样的控件的时候就是这样的
    <org.createjoy.myview.LodingView
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        test:barHeight="60dp"
        test:barWidth="6dp"
        test:barCount="20"
        test:peakCount="2"
        test:duration="1000"
        test:color="@color/colorPrimary">

    </org.createjoy.myview.LodingView>

然后呢然后呢,就是我们的View具体代码了 先是基本的那些变量和属性balabala
    private View[] views;
    private Context context;
    private float barWidth;   //条形宽度
    private float barHeight;   //条形高度
    private int barColor;   //条形背景色
    private int barCount;   //条形数目
    private int duration;   //动画时间
    private int peakCount;      //波峰个数

        this.context = context;

        //从xml中获取各个属性值

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.lodingView);
        barWidth = a.getDimension(R.styleable.lodingView_barWidth, 20);
        barHeight = a.getDimension(R.styleable.lodingView_barHeight, 20);
        barColor = a.getColor(R.styleable.lodingView_color, 0xFFFF11FF);
        barCount = a.getInt(R.styleable.lodingView_barCount, 4);
        duration = a.getInt(R.styleable.lodingView_duration, 800);
        peakCount = a.getInt(R.styleable.lodingView_peakCount, 2);
        a.recycle();
        init();

然后就是我们的主要的init()方法了,
    private void init() 
        views = new View[barCount];
        for (int i = 0; i < views.length; i++) 
            View view = new View(context);
            LayoutParams layoutParams = new LayoutParams((int) barWidth, (int) barHeight);
            layoutParams.setMargins(10, 0, 0, 0);
            layoutParams.gravity = Gravity.CENTER_VERTICAL;
            view.setLayoutParams(layoutParams);
            view.setBackgroundColor(barColor);
            int m = barCount / peakCount;

            int delaytime;
            int time = duration * 2 / m;

            if (i % m <= m / 2) 
                delaytime = (i % m) * time;
             else 
                delaytime = (m - i % m) * time;
            
            views[i] = view;
            ObjectAnimator customAnim = ObjectAnimator.ofFloat(view,"scaleY",1.0f,0.2f);
            customAnim.setStartDelay(delaytime);
            customAnim.setRepeatMode(ValueAnimator.REVERSE);
            customAnim.setRepeatCount(1000);
            customAnim.setDuration(duration);
            customAnim.start();
            addView(view);
        

    

代码还是比较少的,逻辑也很简单,首先根据barCount创建相应的view,我们可以看到上面的动态,每个条形的来回时间其实是一样的,要想达到波浪的效果,我们就需要它们在前后有一定时间差下先后执行动画。首先我们先把每个不同的部分分开,就像下图
在红线的左边就是一个峰,对应的条数也就是m ,每一个峰囊括的部分动画应该是一样的, 然后就是在左边部分又用绿线分成了两部分,左边的条,第一条和最後一条,先后动画的时间差就是我们的duration,所以每一条的时间差就是这里的time 。绿线左边执行的时间是慢慢增加的,右边的线是慢慢减少的,基本就是对称的。然后就是给每个view添加动画了
            ObjectAnimator customAnim = ObjectAnimator.ofFloat(view,"scaleY",1.0f,0.2f);
            customAnim.setStartDelay(delaytime);
            customAnim.setRepeatMode(ValueAnimator.REVERSE);
            customAnim.setRepeatCount(1000);
            customAnim.setDuration(duration);
            customAnim.start();

这样我们想要的效果就达到了。 这样的一个view在动画上面还可以有很多的拓展。改进之后同样在github可以看到。
Github代码下载



以上是关于MetroLoading 加载动画的主要内容,如果未能解决你的问题,请参考以下文章

当内容滚动到视图中时激活 CSS3 动画

amcharts svg条形图上的值之间的动画转换

为条形图设置动画

如何用matplotlib ArtistAnimation绘制直方图或条形动画?

如何用matplotlib ArtistAnimation绘制直方图或条形动画?

Google图表(可视化)中堆积条形图中的第三个条形图无效