2009-10-13 6 views
11

Когда я использую Галерея виджетов, как я могу получить изображения сказать масштаб до & свечение на выбран и масштабируется вниз & ООН послесвечению на время невыделенному?Android: Анимация в галерее?

Все учебники я видел этот эффект, но я не в состоянии видеть его ...

Есть ли какая-то из анимации, что я должен приложить к галерее?

+0

Я делаю то же самое, но он не работает в некоторых устройствах Android, если вы достигли этой анимации в галерее, отправьте мне код. – Hasmukh

ответ

15

Надеюсь, это полезно. Мне удается «имитировать» решение для усадки/выращивания с помощью виджета 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) { 
    } 
} 
+0

РЕДАКТИРОВКА: Приведение к 'ImageView' было напрасно. – Sebastian

+0

удивительный! благодаря! – davs

+0

+1 Не видел этого. Принято как ответ. Спасибо за ваше время, ребята! Очень полезно. – Legend

4

Вам необходимо использовать ImageSwitcher. У ImageSwitcher есть методы для установки анимации ввода и вывода (когда изображение выбрано и отменено, или выбрано и заменено).

following link имеет хороший учебник о том, как использовать его в сочетании с Галереей.

+0

Вау ... Это потрясающий сайт ...! Спасибо, тонна ... – Legend

+0

Извините, что я этого не заметил, но я все еще не мог найти способ масштабирования и масштабирования изображений в самом объекте imagewitcher ... То, что я имею в виду, это верхняя часть, которая видна ... Когда вы нажимаете, это должно дать нам нормальный размер, еще меньший размер ... Я пропустил какое-то тривиальное решение? – Legend

2

Я реализовал подобную анимацию, как это:

final Animation shrink = AnimationUtils.loadAnimation(activity, R.anim.shrink); 
shrink.setFillAfter(true); 

gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      // This iterates through the views which are currently displayed on screen. 
      for (int k=0; k<gallery.getChildCount(); k++){ 
       // Do whatever else you want, here. 
       // This is how you get a particular element of a view 
       ImageView background = (ImageView) gallery.getChildAt(k).findViewById(R.id.menu_item_background); 

       //clear animation 
       gallery.getChildAt(k).clearAnimation(); 

      } 

      // Scale the selected one 
      view.startAnimation(shrink); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> adapterView) {} 

    });