Я попытался настроить простую анимацию подбрасывания монет для действия подбрасывания монет. Поэтому я создал два рисованных объекта (coin_heads и coin_tails) и настроил этот фрагмент кода. Я создаю случайное значение, и после этого у меня есть простое выражение if, чтобы определить, должны ли появляться головы или хвосты. В зависимости от того, что ничья будет заменено. Я уже знал, что всякий раз, когда вы заменяете рисованный элемент на yourobject.setImageDrawable(ContextCompat.getDrawable(this,drawable));
его вращение, масштабируйте и т. c сбрасываются (поэтому я хочу установить вращение и альфа на значения, которые я анимировал до этого).
Я думал, что будет проще использовать метод animate () вместо XML - аргументы, вот почему у меня сейчас проблема. Всякий раз, когда я пытаюсь запустить это, он пропускает мои первые строки
cimg.setAlpha(1f);
cimg.animate().alphaBy(-1f).setDuration(800);
Итак, чтобы описать, что происходит: как только я нажимаю кнопку, чтобы перевернуть монету, альфа изображения сразу устанавливается на 0 и затем анимированные назад к 1 во времени 800 мс. Но я хочу, чтобы он сначала анимировался в Alpha = 0 через 800 мс, а затем снова в 1 в 800 мс.
Вот код метода flip (я много комментировал во время отладки):
public void flip(View view) {
TextView coin = (TextView) findViewById(R.id.coinField);
ImageView cimg = (ImageView) findViewById(R.id.coinimage);
double flip1 = Math.random();
//start of animation
//cimg.animate().scaleXBy(4f).setDuration(1000);
//cimg.animate().scaleYBy(4f).setDuration(1000);
//cimg.animate().rotationBy(180f).setDuration(1000);
//first animation
cimg.setAlpha(1f);
cimg.animate().alphaBy(-1f).setDuration(800);
//final animation
if (flip1>=0.5) {
coin.setText(R.string.heads);
cimg.setImageDrawable(ContextCompat.getDrawable(this,R.drawable.coin_heads));
//cimg.setRotation(180f);
cimg.setAlpha(0f);
cimg.animate().alpha(1f).setDuration(800);
//cimg.animate().rotationBy(180f).setDuration(1000);
//cimg.animate().scaleXBy(0.25f).setDuration(1000);
//cimg.animate().scaleYBy(0.25f).setDuration(1000);
}
else {
coin.setText(R.string.tails);
cimg.setImageDrawable(ContextCompat.getDrawable(this,R.drawable.coin_tails));
//cimg.setRotation(180f);
cimg.setAlpha(0f);
cimg.animate().alpha(1f).setDuration(800);
//cimg.animate().rotationBy(180f).setDuration(1000);
//cimg.animate().scaleXBy(0.25f).setDuration(1000);
//cimg.animate().scaleYBy(0.25f).setDuration(1000);
}
}
Я был бы очень рад, если бы у кого-нибудь было решение для этого, поскольку я боролся с этим часами. Я также попытался использовать Thread.sleep(1000)
, чтобы убедиться, что анимация завершена, но при этом она по-прежнему пропускает первую анимацию, ждет 1 секунду, а затем выполняет свою работу как обычно.
Редактировать:
Я настроил это так. Теперь, когда я нажимаю кнопку, ничего не происходит:
public void flip(View view) {
final TextView coin = (TextView) findViewById(R.id.coinField);
final ImageView cimg = (ImageView) findViewById(R.id.coinimage);
final double flip1 = Math.random();
Animation anim = new Animation() {
@Override
protected Animation clone() throws CloneNotSupportedException {
cimg.setAlpha(1f);
cimg.animate().alpha(0f).setDuration(800);
return super.clone();
}
};
final Animation anim2 = new Animation() {
@Override
protected Animation clone() throws CloneNotSupportedException {
if (flip1>=0.5) {
coin.setText(R.string.heads);
cimg.setImageDrawable(getDrawable(R.drawable.coin_heads));
cimg.setAlpha(0f);
cimg.animate().alpha(1f).setDuration(800);
}
else {
coin.setText(R.string.tails);
cimg.setImageDrawable(getDrawable(R.drawable.coin_tails));
//cimg.setRotation(180f);
cimg.setAlpha(0f);
cimg.animate().alpha(1f).setDuration(800);
}
return super.clone();
}
};
anim2.setAnimationListener(null);
Animation.AnimationListener list = new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
anim2.start();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
};
anim.setAnimationListener(list);
}