Android: анимация в представлении галереи?

Единственное основное различие, о котором я знаю, - то, что, так как Вы не используете реальный класс, встраивание (очень?) тяжелее, чтобы сделать.

11
задан Mr.Sandy 8 February 2017 в 10:49
поделиться

2 ответа

Надеюсь, это будет полезно. Мне удалось «смоделировать» решение для сжатия / увеличения с помощью виджета Gallery . Поскольку они удалили getScale () , все стало немного сложнее. Я думаю, что это совсем не лучшее решение, но, по крайней мере, я могу с этим жить.

Я обнаружил, что Галерея ЧРЕЗВЫЧАЙНО ПЛОХО управляет фокусом. Итак, первый подход заключался в добавлении слушателя смены фокуса в отображаемый ImageView , но безуспешно. Фокус - это МЕССИЯ ... в том смысле, что выбранное изображение не является текущим сфокусированным видом. Я отправил письмо в список рассылки разработчиков 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

That будет нашим эффектом «роста», и вам нужно будет сохранить его в: res / anim / grow.xml или под любым другим именем, которое вам подходит (но всегда в каталоге res / anim).

Вы можете следовать руководству по ресурсам из здесь , чтобы создать представление Галерея . ImageAdapter создает ImageView каждый раз, когда объект Gallery вызывает getView () . Одно из решений, которое вы можете реализовать, - это добавить строку к методу getView () , которая идентифицирует View с позицией , следующим образом:

...
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");

    }
    });

ПРИМЕЧАНИЕ. Вы можете заметить, что все значения из анимации и из параметров макета был выбран мной под рукой. Это потому, что я не собираюсь чистить код за вас. И это всего лишь временное решение проблемы с ПЛОХОЙ фокусировкой с этим виджетом или системой просмотра 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) {
    }
}
15
ответ дан 3 December 2019 в 05:34
поделиться

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

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

4
ответ дан 3 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: