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