在Android中,StateListDrawable本身不支持動畫效果。但是,你可以使用TransitionDrawable和AnimationDrawable結合StateListDrawable來實現動畫效果。
這里是一個簡單的例子,展示了如何使用TransitionDrawable和AnimationDrawable實現動畫效果:
transition.xml文件,放在res/drawable目錄下。這個文件將定義兩個狀態之間的過渡動畫。<?xml version="1.0" encoding="utf-8"?><transition xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 第一個狀態的圖片 -->
<item android:drawable="@drawable/state1" />
<!-- 第二個狀態的圖片 -->
<item android:drawable="@drawable/state2" />
</transition>
animation.xml文件,放在res/anim目錄下。這個文件將定義動畫的持續時間和插值器。<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="300"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />
</set>
StateListDrawable并添加狀態。然后,為每個狀態設置TransitionDrawable。// 獲取TransitionDrawable
TransitionDrawable transitionDrawable = (TransitionDrawable) getResources().getDrawable(R.drawable.transition);
// 創建StateListDrawable
StateListDrawable stateListDrawable = new StateListDrawable();
// 為按下狀態設置TransitionDrawable
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, transitionDrawable);
// 為默認狀態設置另一個Drawable
stateListDrawable.addState(new int[]{}, getResources().getDrawable(R.drawable.default_state));
// 設置按鈕的背景
button.setBackground(stateListDrawable);
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 開始過渡動畫
transitionDrawable.startTransition(300);
break;
case MotionEvent.ACTION_UP:
// 結束過渡動畫
transitionDrawable.reverseTransition(300);
break;
}
return false;
}
});
這樣,當按鈕被按下時,TransitionDrawable會根據animation.xml中定義的動畫效果在兩個狀態之間進行過渡。