Надеюсь, это полезно. Мне удается «смоделировать» решение сжатия / роста с помощью виджета Gallery
. Так как они удалили getScale()
, все становится немного сложнее. Я думаю, что это вообще не лучшее решение, но, по крайней мере, я могу с этим жить.
Я обнаружил, что Gallery
управляет фокусом ЧРЕЗВЫЧАЙНО ПЛОХО. Итак, первый подход состоял в том, чтобы добавить слушателя изменения фокуса на ImageView
, но не повезло. Фокус - это MESS ... с точки зрения того, что выбранное изображение не является текущим фокусированным видом. Я отправил письмо в список рассылки android-developers о какой-то ошибке в API doc (касательно метода focusSearch()
и некоторых контуров фокуса).
Вот мое решение этой проблемы:
Создание ресурса анимации для «увеличения» изображения:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1.0"
android:toXScale="1.10"
android:fromYScale="1.0"
android:toYScale="1.10"
android:duration="300"
android:pivotX="50%"
android:pivotY="50%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fillAfter="false"/>
Если вы не понимаете, что это значит, вам следует прочитать this
Это будет наш эффект «увеличения», и вам нужно будет сохранить его в: res/anim/grow.xml
или под любым другим именем, которое вам подходит (но всегда в res / anim dir).
Вы можете следовать руководству по ресурсам из здесь , чтобы создать Gallery
представление. ImageAdapter
создает ImageView
каждый раз, когда объект Gallery
вызывает getView()
. Один из способов обойти это - добавить в метод getView()
строку, которая идентифицирует View
с position
, таким образом:
...
i.setId(position);
...
С этой строкой, добавленной к методу getView()
объекта ImageAdpater
, вы можете однозначно идентифицировать это представление в слушателе, например:
g.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected (AdapterView<?> parent, View v, int position, long id) {
Animation grow = AnimationUtils.loadAnimation(YourActivity.this, R.anim.grow);
View sideView = parent.findViewById(position - 1);
if (sideView != null)
((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));
sideView = parent.findViewById(position + 1);
if (sideView != null)
((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));
v.startAnimation(grow);
v.setLayoutParams(new Gallery.LayoutParams(170, 150));
}
public void onNothingSelected (AdapterView<?> parent) {
System.out.println("NOTHING SELECTED");
}
});
ПРИМЕЧАНИЕ. Вы можете заметить, что все значения из анимации и из параметров макета были выбраны мной под рукой. Это потому, что я не собираюсь чистить код для вас. И это всего лишь обходной путь BAD-фокуса с этим виджетом или системой просмотра Android. Если фокус был в порядке, то все, что вам нужно сделать, это установить прослушиватель изменения фокуса, который заставляет большие / уменьшенные значения, когда он получил фокус / несфокусированный.
Надеюсь, это поможет вам найти решение вашей проблемы,
С уважением,
Новое РЕДАКТИРОВАНИЕ: Это установленный мной слушатель, я также добавил строку i.clearAnimation()
в методе getView()
:
private class SelectListener implements AdapterView.OnItemSelectedListener {
private Animation grow;
private int last;
public SelectListener() {
grow = AnimationUtils.loadAnimation(RouteGallery.this, R.anim.grow);
last = 0;
}
public void onItemSelected (AdapterView<?> parent, View v, int position, long id) {
View sideView = parent.findViewById(last);
if (sideView != null && last != position)
sideView.clearAnimation();
v.startAnimation(grow);
last = position;
}
public void onNothingSelected (AdapterView<?> parent) {
}
}