いくつかのオブジェクトを表示する GridView があり、視覚的に各オブジェクトにはイメージ アイコンとテキスト ラベルがあります。また、クリックしたときに画像アイコンに「プッシュアンドポップ」効果を持たせたいです。つまり、押すと画像が右下方向に少し移動し、離すと元の位置に戻ります。
オブジェクト (およびそのイメージ アイコン) は、いくつかの動的ソースからのものです。私の直感では、アイテムごとに StateListDrawable を作成します。これには、押されたかどうかという 2 つの状態があります。GridView アイテム ビューの場合、Drawable とラベルに対応できるボタンを使用して、私の要件を完全に満たします。
元のオブジェクトをラップするアイテム クラスを定義しました。
public class GridItem<T> {
public static final int ICON_OFFSET = 4;
private StateListDrawable mIcon;
private String mLabel;
private T mObject;
public Drawable getIcon() {
return mIcon;
}
public void setIcon(Drawable d) {
if (null == d) {
mIcon = null;
}else if(d instanceof StateListDrawable) {
mIcon = (StateListDrawable) d;
} else {
InsetDrawable d1 = new InsetDrawable(d, 0, 0, ICON_OFFSET, ICON_OFFSET);
InsetDrawable d2 = new InsetDrawable(d, ICON_OFFSET, ICON_OFFSET, 0, 0);
mIcon = new StateListDrawable();
mIcon.addState(new int[] { android.R.attr.state_pressed }, d2);
mIcon.addState(StateSet.WILD_CARD, d1);
//This won't help either: mIcon.addState(new int[]{}, d1);
}
}
public String getLabel() {
return mLabel;
}
public void setLabel(String l) {
mLabel = l;
}
public T getObject() {
return mObject;
}
public void setObject(T o) {
mObject = o;
}
}
問題は、グリッド アイテムに触れると、アイコンが予想どおりに「移動」することですが、アイテムから指を離しても元の位置に戻らないことです。
私の質問は、次のような XML リソースから膨張したものと同等の StateListDrawable をプログラムで作成する方法です。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/image_pressed" />
<item android:drawable="@drawable/image_normal" />
</selector>
?