Android的2种Animation模式:
1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;
2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。
四种基本动画类型
在JAVA类中:
1、AlphaAnimation(渐变动画)
2、ScaleAnimation(伸缩动画)
3、TranslateAnimation(位置动画)
4、RotateAnimation(旋转动画)
在XML文件中:
1、alpha(渐变动画)
2、scale(伸缩动画)
3、translate(位置动画)
4、rotate(旋转动画)
动画可以通过new动画类的方式来创建,也可以通过AnimationUtils工具类的loadAnimation方法来加载xml文件实现
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa = (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity.this,
R.anim.aa);
RotateAnimation ra = new RotateAnimation(0, 360);
ra = (RotateAnimation) AnimationUtils.loadAnimation(MainActivity.this,
R.anim.ra);
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 100);
ta = (TranslateAnimation) AnimationUtils.loadAnimation(
MainActivity.this, R.anim.ta);
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
sa = (ScaleAnimation) AnimationUtils.loadAnimation(MainActivity.this,
R.anim.sa);
}
}
对应动画的xml文件
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0"
android:toAlpha="1"
android:duration="1000">
</alpha>
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0"
android:toAlpha="1"
android:duration="1000">
</alpha>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="0"
android:toXScale="1"
android:fromYScale="0"
android:toYScale="1" >
</scale>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="100" >
</translate>
通过view.startAnimation()方法来启动动画
可以将多个动画放到一个动画集合中进行播放
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlphaAnimation aa = new AlphaAnimation(0, 1);
RotateAnimation ra = new RotateAnimation(0, 360);
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 100);
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
AnimationSet as = new AnimationSet(true);
as.addAnimation(aa);
as.addAnimation(ra);
as.addAnimation(ta);
as.addAnimation(sa);
btn.startAnimation(as);
}
}
通过xml文件的实现
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:shareInterpolator="true" >
<alpha
android:fromAlpha="0"
android:toAlpha="1" />
<rotate
android:fromDegrees="0"
android:toDegrees="360" />
<scale
android:fromXScale="0"
android:fromYScale="0"
android:toXScale="1"
android:toYScale="1" />
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="100" />
</set>
动画的事件监听
通过setAnimationListener(listener)方法来实现动画的监听,其中的listener参数为Animation.AnimationListener接
口。实现该接口需要重写三个方法:
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
sa.setAnimationListener(new Animation.AnimationListener() {
<span style="white-space:pre"> </span>// 动画开始前
@Override
public void onAnimationStart(Animation anim) {
}
<span style="white-space:pre"> </span>// 动画重复时
@Override
public void onAnimationRepeat(Animation anim) {
}
<span style="white-space:pre"> </span>动画结束后
@Override
public void onAnimationEnd(Animation anim) {
}
});
自定义动画
自定义动画一般继承Animation类,并重新其中的initialize()及applyTransformation()方法;initialize()在动画初始化时调用,可以获取到相应组件的宽和高;applyTransformation()则是实现自定义动画的方法
public class MyAnimation extends Animation {
@Override
public void initialize(int width, int height, int parentWidth,
int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
t.setAlpha(interpolatedTime);// 实现透明动画
// 实现位移动画
t.getMatrix().setTranslate(interpolatedTime * 100,
interpolatedTime * 100);
// 实现左右来回平移
t.getMatrix().setTranslate(
(float) (Math.sin(interpolatedTime * 10) * 10), 0);
super.applyTransformation(interpolatedTime, t);
}
}
布局动画
布局显示动画
LayoutAnimationController lac = new LayoutAnimationController(animation, delay);
lac.setOrder(LayoutAnimationController.ORDER_REVERSE);
layout.setLayoutAnimation(lac);
布局内容改变动画
可以在布局文件中添加 android:animateLayoutChanges="true"属性;如果想要改变动画效果,则要在代码中使用setLayoutTransition(transition)方法
通过xml文件来配置
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/aa"
android:delay="0.5" >
</layoutAnimation>
// 在相应的布局中使用以下属性<pre name="code" class="java" style="font-size:14px;">android:layoutAnimation="@anim/la"
Android图片逐帧动画
通过代码实现
public class MainActivity extends Activity {
private ImageView iv;
private AnimationDrawable ad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
ad = new AnimationDrawable();
ad.addFrame(getResources().getDrawable(R.id.image1), 100);
ad.addFrame(getResources().getDrawable(R.id.image2), 100);
ad.addFrame(getResources().getDrawable(R.id.image3), 100);
ad.addFrame(getResources().getDrawable(R.id.image4), 100);
ad.setOneShot(false);// 设置重复播放
iv.setBackgroundDrawable(ad);
ad.start();
//ad.stop();
}
}
通过xml文件配置实现
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/image1"
android:duration="100"/>
<item
android:drawable="@drawable/image2"
android:duration="100"/>
<item
android:drawable="@drawable/image3"
android:duration="100"/>
<item
android:drawable="@drawable/image4"
android:duration="100"/>
</animation-list>
iv.setBackgroundResource(R.drawable.al);
ad = iv.getBackground();