一)混合动画效果
一个视图可以混合多种动画类型形成新的混合效果,使用AnimationSet类实现,与单个动画不同的是,AnimationSet()的参数要指定是否共用动画补间,动画补间是指一个动画在执行过程的属性,比如匀速执行或者加速执行,减速执行这些属性;然后使用AnimationSet类的addAnimation()添加视图动画。这里以一个按钮视图为例,在代码里和在资源文件里实现的效果是一样的
1)在代码中实现
private AnimationSet as;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
as=new AnimationSet(true);//参数为是否共用动画补间
as.setDuration(2000);
AlphaAnimation aa=new AlphaAnimation(0, 1);
aa.setDuration(2000);
as.addAnimation(aa);
TranslateAnimation ta=new TranslateAnimation(0, 50, 0,50);
ta.setDuration(2000);
as.addAnimation(ta);
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//v.startAnimation(as);
v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,
R.anim.as));
}
});
}
2)在xml里实现
新建xml文件,Root Element选择set,Resourced Typed选择Tween Animation
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true"
android:duration="2000" >
<alpha
android:fromAlpha="0"
android:toAlpha="1" />
<translate
android:fromXDelta="0"
android:toXDelta="50"
android:fromYDelta="0"
android:toYDelta="50"/>
</set>
然后再代码里添加一行
v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.as));
二)动画效果侦听
我们可以给动画效果设置监听事件,监听事件里会重写三个方法,可以监听到动画的不同时期,通过重写这些方法,动画的不同时期可以进行操作,比如下面在动画结束的时候弹出一个Toast,同理也可以在开始的时候或者重复的时候执行一些操作
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//v.startAnimation(as);
Animation a=AnimationUtils.loadAnimation(MainActivity.this,R.anim.as);
v.startAnimation(a);
a.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
Toast.makeText(MainActivity.this, "动画结束",Toast.LENGTH_SHORT).show();
}
});
}
});
三)自定义动画效果
新建类custom继承Aniamtion
在视图动画的执行过程里,有一个方法会一直执行,就是applyTransformation(float interpolatedTime, Transformation t) ,参数interpolatedTime是补间时间,在动画效果的执行过程里,从0到最后动画执行完成变为1;参数Transformation是变化对象,通过它改变一些动画效果显示出来,是个目标组件的意思。
public class CustomAnim extends Animation {
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
// TODO Auto-generated method stub
super.initialize(width, height, parentWidth, parentHeight);//获取目标对象的宽高
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
// System.out.println(interpolatedTime);
// t.setAlpha(interpolatedTime);//透明度从0渐变到1
// t.getMatrix().setTranslate(200*interpolatedTime, 200*interpolatedTime);
t.getMatrix().setTranslate((float)Math.sin(interpolatedTime*20)*50, 0);
super.applyTransformation(interpolatedTime, t);
}
}
利用interpolatedTime的随动画执行过程的渐变性,可以制作很多自定义的效果。比如上面代码里的设置透明度的变化:t.setAlpha(interpolatedTime);自定义的移动方式:t.getMatrix().setTranslate(200*interpolatedTime, 200*interpolatedTime);
在这里想制作一个控件在水平方向上摇头的动画效果,把Y轴的移动像素设置为0,这样控件就只能在水平方向移动,然后在X轴上进行周期性移动,就可以实现摇头的效果。在X轴的移动可以通过 interpolatedTime来实现,周期性可以通过Math.sin()这样的周期方法,传入interpolatedTime作为移动周期,也就是控件的移动频率快慢,整个参数的值是移动振幅,也就是移动距离长短。
sin()里的数值乘的倍数越大,移动的越快;Math的值乘的倍数越大,控件移动距离越长。