Надеюсь, это полезно. Мне удается «имитировать» решение для усадки/выращивания с помощью виджета Gallery
. Поскольку они удалили getScale()
, все становится немного сложнее. Я думаю, что это не лучшее решение, но, по крайней мере, я могу жить с ним.
То, что я нашел, это то, что Gallery
управляет фокусом ЧРЕЗВЫЧАЙНО ПЛОХО. Итак, первый подход состоял в том, чтобы добавить слушателя смены фокуса на отображаемом ImageView
, но не повезло. Фокус - это MESS там ... в том смысле, что выбранное изображение не является в настоящее время сфокусированным видом. Я отправил письмо в список рассылки разработчиков android-разработчиков о некоторой ошибке в 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).
Вы можете следить за рекомендациями по ресурсам от here, чтобы создать вид 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 когда он получает фокус/не сфокусирован.
Я надеюсь, что это может помочь вам найти путь вокруг вашей проблемы,
С уважением,
New 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) {
}
}
Я делаю то же самое, но он не работает в некоторых устройствах Android, если вы достигли этой анимации в галерее, отправьте мне код. – Hasmukh