Android: анимация в просмотре галереи? - PullRequest
11 голосов
/ 13 октября 2009

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

Все уроки, которые я видел, имеют этот эффект, но я не могу его увидеть ...

Есть ли какая-то анимация , которую я должен прикрепить к Галерее ?

Ответы [ 3 ]

15 голосов
/ 07 июля 2010

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

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

Следующая ссылка содержит хорошее руководство по ее использованию в сочетании с Галереей.

2 голосов
/ 23 октября 2012

Я реализовал похожую анимацию так:

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) {}

    });
...