#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 (который вы можете, который у меня есть, что приятно 😉