一、LayoutAnimation
LayoutAnimation是一个View动画,作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这样的动画效果。
这种效果常用于ListView上,我们时常会看到一种特殊的ListView,它的每个item都以一定的动画的形式出现,它使用的就是LayoutAnimation。
实现:
1. XML实现:
(1) 定义LayoutAnimation
//res/anim/anim_layout.xml
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/anim_item" />
(2) 为子元素指定具体的入场动画
//res/anim/anim_item.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
<translate
android:fromXDelta="500"
android:toXDelta="0"
/>
<alpha
android:fromAlpha="0.1"
android:toAlpha="1" />
</set>
(3) 为ViewGroup指定android:layoutAnimation属性
对ListView来说,这样ListView的item就具有出场动画了,这种方式适用于所有的ViewGroup。
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/anim_layout"
android:background="#fff4f7f9"
android:cacheColorHint="#00000000"
android:divider="#dddbdb"
android:dividerHeight="1.0px"
android:listSelector="@android:color/transparent" />
属性:
android:delay:
表示子元素开始动画的时间延迟。比如子元素入场动画的时间周期为300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画。总体来说,第一个子元素延迟150ms开始播放入场动画,第二个子元素延迟300ms开始播放入场动画,依次类推。
android:animationOrder:
表示子元素动画的顺序。有三种选项:normal、reverse、和random,其中normal表示顺序显示,reverse表示逆向显示,random表示随机显示。
android:animation:
为子元素指定具体的入场动画。
2. 代码实现:
通过LayoutAnimationController来实现。
//res/anim/anim_item.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
<translate
android:fromXDelta="500"
android:toXDelta="0"
/>
<alpha
android:fromAlpha="0.1"
android:toAlpha="1" />
</set>
//代码
ListView listView = (ListView)layout.findViewById(R.id.list);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);
二、Activity的切换效果
Activity有默认的切换效果,这个效果我们也可以自定义,主要用的overridePendingTransition(int enterAnim, int exitAnim)这个方法,这个方法必须在startActivity(intent)或者finish()之后被调用才能生效。参数如下:
enterAnim:Activity被打开时,所需的动画资源id;
exitAnim:Activity被暂停时,所需的动画资源id。
实现:
1. 当启动一个新Activity时,指定新Activity的切换效果:
Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
2. 当Activity退出时,指定自己的切换效果:
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
}
三、Fragment的切换效果
Fragment也可以添加切换效果,由于Fragment是在 API 11 中新引入的类,因此为了兼容性我们需要使用 support-v4 这个兼容包,在这种情况下我们可以通过FragmentTransaction中的setCustomAnimations()方法来添加切换效果。
这个切换动画需要是View动画,之所以不能采用属性动画是因为属性动画也是 API 11 新引入的。
例子:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view){
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.enter_anim, R.anim.exit_anim)
.add(R.id.fl_main, new ContentFragment(), null)
.commit();
}
public void remove(View view){
if(getSupportFragmentManager().findFragmentById(R.id.fl_main) != null) {
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.enter_anim, R.anim.exit_anim)
.remove(getSupportFragmentManager().findFragmentById(R.id.fl_main))
.commit();
}else{
Toast.makeText(this, "未找到可移除的指定id的Fragment",Toast.LENGTH_SHORT).show();
}
}
}