У меня есть GridView для отображения некоторых объектов, и визуально каждый из объектов будет иметь значок изображения и текстовую метку.Я также хочу, чтобы при щелчке на значке изображения был эффект «толкания и выталкивания», т. Е. При нажатии изображение сместится на небольшое расстояние в нижнем правом направлении, а после отпускания вернется в исходное положение.
Объекты (и значки их изображений) взяты из некоторых динамических источников.Моя интуиция заключается в создании StateListDrawable для каждого элемента, который будет иметь два состояния: нажата или нет.Для вида элемента 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;
}
}
Теперь проблема в том, что когда я касаюсь элемента сетки, значок «движется» совершенно так, как я ожидал,но он не восстановит свое первоначальное положение, когда мой палец поднимется, оставляя предмет.
Мой вопрос таков: как программно создать StateListDrawable, эквивалентный тому, который был накачан из ресурса XML, например
<?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>
?