一、简单介绍
Android动画主要有4种:
Tween Animation 变换动画
Frame Animation 帧动画
Layout Animation 布局动画
Property Animation 属性动画
二、变换动画
变换动画有以下四种:
Alpha:渐变透明度动画
Scale:渐变尺寸缩放动画
Translate:位置移动动画
Rotate:旋转动画
它们的共同属性:
(1)Duration:动画持续时间(单位:毫秒)
(2)fillAfter:设置为true,动画转化在动画结束后被应用
(3)fillBefore:设置为true,动画转化在动画开始前被应用
(4)interpolator:动画插入器(加速、减速插入器)
(5)repeatCount:动画重复次数
(6)repeatMode:顺序重复/倒序重复
(7)startOffset:动画之间的时间间隔
实现方式
(1)配置文件(/res/anim)—— alpha scale translate rotate
特点:简单
Animation alpha = new AlphaAnimation(0.1f,1.0f);//设置动画透明度从10%~100% alpha.setDuration(5000);//设置动画时间为5秒 img.startAnimation(alpha);
(2)JAVA代码实现 —— AlphaAnimation ScaleAnimation TranslateAnimation RotateAnimation
特点:灵活
Animation scale = AnimationUtils.loadAnimation(TweenActivity.this,R.anim.scale_anim); img.startAnimation(scale);
四种动画基本实现
AlphaAnimation(透明度动画)
(1)fromAlpha:动画起始时的透明度
(2)toAlpha:动画终止时的透明度
0.0表示完全透明,1.0表示完全不透明
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="1000" android:fromAlpha="0.1" android:toAlpha="1.0" > </alpha> </set>
ScaleAnimation(缩放动画)
(1)formX,toX:分别是起始和结束时X坐标上的伸缩尺寸
(2)fromY,toY:分别是起始和结束时Y坐标上的伸缩尺寸
(3)pivotX,pivotY:分别是伸缩动画相对于x,y坐标开始的位置
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="2000" android:fillAfter="false" android:fromXScale="0.0" android:fromYScale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" /> </set>TranslateAnimation(位移动画)
(1)fromXDelta,fromYDelta:分别是起始时X、Y的坐标
(2)toXDelta,toYDelta:分别是结束时X、Y的坐标
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="1000" android:fromXDelta="10" android:fromYDelta="10" android:toXDelta="100" android:toYDelta="100" /> </set>
RotateAnimation(旋转动画)
(1)fromDegrees:起始的角度
(2)toDegrees:终止的角度
(3)pivotX,pivotY:分别为旋转动画相对于x,y的坐标开始位置
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <rotate android:duration="1000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="+360" /> </set>
组合动画
1)续播
实现方法一:分别两个动画A和B,先播放动画A,设置A的AnimationListener。当onAnimationEnd触发(即A播放完毕)时,开始播放B
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.translate); image.startAnimation(loadAnimation); final Animation loadAnimation2 = AnimationUtils.loadAnimation(this,R.anim.rotate); loadAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation arg0) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation arg0) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation arg0) { // TODO Auto-generated method stub image.startAnimation(loadAnimation2); } });实现方法二:写一个动画集AnimationSet,在其中定义动画A和B,为动画B设置startOffset,其值就是前一个动画播放的所需时间
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="3000" android:fromAlpha="0.2" android:toAlpha="1.0" /> <alpha android:duration="3000" android:fromAlpha="1.0" android:startOffset="3000" android:toAlpha="0.2" /> </set>
2)重复
利用Animation的setRepeatCount、setRepeatMode来实现动画循环
AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1.0f); alphaAnimation.setDuration(100); alphaAnimation.setRepeatCount(10); //倒序重复REVERSE 正序重复RESTART alphaAnimation.setRepeatMode(Animation.REVERSE); image.startAnimation(alphaAnimation);
3)Activity切换
使用overridePendingTransition方法
参数:第二个activity进入动画、第一个activity退出时的动画
Intent intent=new Intent(MainActivity.this,MainActivity2.class); startActivity(intent); overridePendingTransition(R.anim.zoom_in,R.anim.zoom_out);
三、逐帧动画
使用animation-list标签来分组一个item标签集合,定义要显示的图片,制定显示它的时间(以毫秒为单位)。
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/one" android:duration="500"/> <item android:drawable="@drawable/two" android:duration="500"/> <item android:drawable="@drawable/three" android:duration="500"/> <item android:drawable="@drawable/four" android:duration="500"/> <item android:drawable="@drawable/five" android:duration="500"/> <item android:drawable="@drawable/six" android:duration="500"/> </animation-list>
image.setImageResource(R.drawable.anim_list);
四、布局动画
为View Group添加动画,使用LayoutAnimationController
public class ListActivity extends Activity{ private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.list_layout); listView=(ListView) findViewById(R.id.listView); List<String>list=new ArrayList<String>(); for(int i=0;i<20;i++){ list.add("liyue"+i); } ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); listView.setAdapter(adapter); LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.zoom_in)); lac.setOrder(LayoutAnimationController.ORDER_NORMAL); listView.setLayoutAnimation(lac); listView.startLayoutAnimation(); } }
五、属性动画
其他动画不适合做具有交互的效果,只能做显示性的效果。例如:有个一个按钮一个图标,点击图标会显示Toast,点击按钮图标会从左到右移动。使用变换动画中的Translate完成位移。发现位移后点击图标并不会显示Toast,但是在初始位置点击会产生Toast。传统动画Animation是通过重绘来实现的十分耗费资源,而属性动画Animator是通过set和get方法来改变对象的属性从而来实现动画效果的。Android 3.0之后添加的属性动画框架。
待续……