demo中有四个animation效果:
本例显示了一个listview,点击一个item之后,跳转到一幅图片中。
动画1:listview的显示
listview的布局定义在animations_main_screen.xml中。这个listview设置了一个重要属性——layoutAnimation,值为layout_bottom_to_top_slide。表示这个listview的显示动画效果在layout_bottom_to_top_slide.xml文件中定义。我们查看layout_bottom_to_top_slide.xml文件:delay属性设置listview的每个item显示的延迟时间;animationOrder表示item的显示顺序,normal表示顺序、reverse表示逆序、random表示随机;animation设置每个item显示的动画。
每个item的动画定义在slide_right.xml文件中。可以看到,这是一个平移动画,设置了平移动画的插值、起始位置和动画持续的时间。其中插值见下一个demo的讲解。
动画2:点击item之后的动画
点击各个item之后,listview绕y轴旋转到背面,而图片像是在listview背面一样被旋转到屏幕上。这个动画是怎么做的呢?
1.首先看定义这个listview的布局文件animations_main_screen.xml文件。可以看到,FrameLayout下定义了一个ListView和一个ImageView。这两个view都是framelayout的子view,即都是靠左上角绘制。但初始时设置ImageView不可见(visibility属性设置为gone)。点击了list的一个item之后,才设置这个ImageView的显示图片。
2.看点击item后的java代码,见Transition3d.java
-点击listview的item后,设置ImageView的图片资源。然后加载动画,正向旋转90度,0-90
-点击图片后,加载动画,逆向旋转90度,180-90。二者加载的动画是自定义动画Rote3dAnimation的对象。
-设置动画的一些参数:持续时间、插值等
-设置动画的监听器:设置动画完成后做什么。本例就是显示另一个view(listview的动画完成后显示imageview,imageview的动画完成后显示listview)。
-调用startAnimation启动动画
3.定义这个绕y轴旋转的动画,见Rotate3dAnimation.java
顾名思义,这个例子展示“插值”。什么叫插值呢?通常我们需要一个动画,只定义几个关键帧,中间帧是系统添加进去的。那么默认就是匀速的从定义的关键帧1到2到3...android为我们提供了改变这种默认插值帧的方法。
看代码:
1 首先获得一个平移动画的对象,指定这个平移的开始位置和结束位置
2 设置一些参数:动画持续的时间、动画开始时间、动画持续的方式、动画持续的次数等
3 为这个动画设置插值:android为我们提供了可以直接使用的插值变量,比如:加速、减速、抖动等。
本例主要示范ViewFlipper的使用。ViewFlipper作为一个布局xml文件中的标签使用,作用是让其内部的子控件切换显示。android:flipInterval定义切换的时间间隔。java代码中可以先获取ViewFliper的id,从而得到ViewFlipper对象,调用startFlipping函数启动切换。
可以通过setInAnimation和setOutAnimation函数设置切换动画的类型,参数为一个Animation对象。这个对象可以通过AnimationUtils.loadAnimation函数得到。
loadAnimation函数的参数是Animation的资源id。这个资源可以是android自带的,比如fade_in,fade_out;也可以自定义。
Animation.java文件,布局为animation_1.xml.
看代码:
1.首先使用AnimationUtils.loadAnimation函数加载一个动画效果:
---参数2:是资源中的Animation对象的id,定义在shake.xml中。可以看到shake.xml文件中定义了一个translate,也就是通过循环平移实现抖动。属性中设置的平移的起始坐标、结束坐标、时间间隔、循环平移的次数。
---返回值:是参数2的Animation对象。
2.使用EditText.startAnimation()开始一个动画,将1步骤中的Animation对象作为参数传进去。