Альфа-анимация Android, анимирующая все ImageViews вместо только вызывающего ImageView

#java #android #animation #imageview

#java #Android #Анимация #imageview

Вопрос:

Я внедряю настольную игру для курса, который я прохожу. Существует 5 «стоек» (ImageViews), по 1 для каждого из 5 игроков. Способ, которым я хочу показать текущему проигрывателю, — это «выделить» их стойку (достигается путем установки альфа-значения). Теперь это можно было бы успешно сделать, просто вызвав метод setAlpha, но переход от одного к другому немного затруднителен, поэтому я хотел бы использовать альфа-анимацию. Моя проблема в том, что при переключении текущего проигрывателя я хочу затемнить выделенную стойку и выделить следующую стойку. Он отлично справляется с этими двумя стойками, но, кроме того, каждая ДРУГАЯ стойка «тускнеет», поскольку она сразу становится ярче и медленно тускнеет. Делает игру довольно странной. Итак, те два, которые я хочу изменить, меняются правильно, но все остальные должны оставаться тусклыми. Для этого у меня настроен следующий код:

dim.xml:

 <?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.75"
    android:toAlpha="0.5"
    android:duration="1000"/>
  

highlight.xml:

 <?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.5"
    android:toAlpha="0.75"
    android:duration="1000"/>
  

методы dim и highlight:

 dim = AnimationUtils.loadAnimation(gui, R.anim.dim); dim.setFillAfter(true);
highlight = AnimationUtils.loadAnimation(gui, R.anim.highlight); highlight.setFillAfter(true);

public Runnable dim(final Player player) {
    return new Runnable() {
          public void run () {
              dim.reset();
              player.getRack().clearAnimation();
              player.getRack().startAnimation(dim);
              //player.getRack().setAlpha(128);
              continuation();
          }
        };
}

public Runnable highlight(final Player player) {
    return new Runnable() {
          public void run () {
              highlight.reset();
              player.getRack().clearAnimation();
              player.getRack().startAnimation(highlight);
              //player.getRack().setAlpha(192);
              continuation();
          }
        };
}
  

Вызываемые им места (обозначаются звездочками):

 public void setup() {
    int starting = (int)(Math.random()*players.size());
    curPlayer = players.get(starting);
    observer.execute(
    *** observer.dim(players.get(0)),
    *** observer.dim(players.get(1)),
    *** observer.dim(players.get(2)),
    *** observer.dim(players.get(3)),
    *** observer.dim(players.get(4)),
    *** observer.highlight(curPlayer)
    );
}

public void draw() {
    if(deck.isEmpty()) {
        //Game over
        return;
    }
    Question q = deck.pop();
    String answer = q.answer(curPlayer);
    answers.add(answer);
    Player oldPlayer = curPlayer;
    curPlayer = players.get((curPlayer.getPlayerNum()   1)%players.size());
    observer.execute(
        observer.ask(q.getQuestionText()),
        observer.say(answer),
    *** observer.dim(oldPlayer),
    *** observer.highlight(curPlayer)
    );
}
  

Есть идеи??? Я сталкиваюсь с этим и, похоже, нигде не могу найти ответа. Извините за большой объем кода!

Ответ №1:

Я не знаком с классами observer, которые вы используете. Попробуйте 2 вещи:

1) Повторно загружайте свои анимации при каждом вызове dim / highlight. 2) Попробуйте без наблюдателя в draw (явно вызовите startAnimation).

Я предполагаю, что класс observer выполняет то, что, по-видимому, делает, и # 2 не будет иметь значения, но его стоит попробовать. Если вы используете observer, чтобы разрешить вызов этих операций в потоке пользовательского интерфейса, создайте / используйте обработчик.

Комментарии:

1. Повторная загрузка анимации работала как шарм. Спасибо, приятель! Есть идеи, почему? Кажется довольно странным

2. Понятия не имею. Анимация может сохранять список целей внутри и сообщать им об обновлении? Я предполагаю. Пришлось бы взглянуть на исходный код Android (который вы можете, который у меня есть, что приятно 😉