Ответ 1
Надеюсь, это полезно. Мне удается "имитировать" решение для усадки/выращивания с помощью виджета Gallery
. Поскольку они удалили getScale()
, все становится немного сложнее. Я думаю, что это не лучшее решение, но по крайней мере я могу с ним жить.
Я обнаружил, что Gallery
управляет фокусом EXTREMELY BAD. Итак, первый подход заключался в том, чтобы добавить слушателя смены фокуса на отображаемый ImageView
, но не повезло. Фокус - это MESS там... в терминах, что выбранное изображение не является в настоящее время сфокусированным представлением. Я отправил почту в список рассылки разработчиков android-разработчиков о некоторой ошибке в API-документе (в отношении метода 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).
Чтобы создать представление 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 focus с этим виджетами или системой просмотра Android. Если фокус был в порядке, то все, что вам нужно сделать, это установить прослушиватель смены фокуса, который делает gros/shrink когда он получает фокус/не сфокусирован.
Надеюсь, это поможет вам найти путь для вашей проблемы,
Привет,
Новый EDIT: это слушатель, который я установил, я также добавил строку 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) {
}
}