Android Animation with Code - 代码实现动画

1 Aug 2016

这是个模板框架,通过编写代码来实现动画效果。

项目地址:
https://github.com/pulque/AnimationCode

1.实现效果

通过模板实现下雨和纸片掉落的效果。

2.基本方式

—Atom为基本元素,即下雨效果的一个雨滴,实现类为RainItem。
—Molecuar为雨滴的一个集合,放在Scene里边,实现类为RainScene。
—SupWidget为一个场景,把Scene画到这里,实现类为RainView。

3.模板优点

—尽可能的把各个元素分开,灵活掌握。
—使用SurfaceView,能够用双缓冲画布使动画更流畅。
—运用自定义view的方式,使用在XML里更方便。
—添加了一些控制方法,使用起来更灵活。

4.使用修改

实现Atom类,并重写draw、move、reset方法。
—draw:画你想画的元素。
—move:计算这次或下次的元素位置、大小等参数,并判断是否重置或出局。
—reset:重置你的所有变量。

实现Molecular类,重写initScene方法。
—initScene:根据itemNum的数量,添加你的Atom到list里。

实现SupWidget类,重写initScene方法。
—initScene:返回你的scene。

5.修改自定义View的参数(可选)

主要修改SupWidget和attrs.xml。

位置:
—com.lizheblogs.android.animationcode.view.animation.base.SupWidget
—/res/values/attrs.xml

修改attrs.xml代码:
<declare-styleable name="Molecular">
        <attr name="itemNum" format="integer" />
        <attr name="itemColor" format="color" />
        <attr name="randColor" format="boolean" />
        <attr name="MBackground" format="color" />
        <attr name="MDelayStop" format="integer" />
</declare-styleable>
说明:
Molecular为集合名字,里边是参数名字和类型。

修改SupWidget代码:
if (attrs != null) {
    TypedArray a = 
    	context.obtainStyledAttributes(attrs, R.styleable.Molecular);
    itemNum = a.getInt(R.styleable.Molecular_itemNum, 0);
    itemColor = a.getColor(R.styleable.Molecular_itemColor, 0xff000000);
    randColor = a.getBoolean(R.styleable.Molecular_randColor, false);
    bgColor = a.getColor(R.styleable.Molecular_MBackground, -1);
    delayStop = a.getInt(R.styleable.Molecular_MDelayStop, -1);
    a.recycle();
 }
 
说明:
获取XML中定义的参数,注意获取的时候是集合名字+下划线+参数名字,
例如R.styleable.Molecular_itemColor。

XML中使用:
<com.lizheblogs.android.animationcode.view.animation.widget.AllView
       android:id="@+id/surface"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       molecular:itemNum="300"
       molecular:randColor="true" />
注意:父布局或根布局中要添加:
xmlns:molecular="http://schemas.android.com/apk/res-auto"

6.总结:

经过几天的努力还是搞定了动画,还有布局透明,也学习到了很多东西。
其间也遇到了点问题,现整理一下。

—surface view的父布或本身局添加padding或者margin都会使动画无效。
—线程空循环时候,如果没有代码走,最好sleep点间隔,要不app会卡掉。
—研究纸片下落的算法花了些时间,大概有点样子。觉得算法很重要。
—角度和弧度直接的变换在Math.toRadians和Math.toDegrees()中就可以找到。
—对Random有更深的了解。
—学会了自定义View。
—了解了<<的使用,color = alpha << 24 | r << 16 | g << 8 | b;
—方法中,觉得延时结束和一点点结束挺有意思的。

接下来有空研究下使用xml进行动画编码。