在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
中定義的動畫效果在兩個狀態之間進行過渡。