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进行动画编码。