Вем привет. Разрабатываю игру пазл на подобие пятнашек. Суть проблемы такова. Имеются кнопки (ImageButton)
в коллекции ArrayList mButtons
и на каждую повешан свой слушатель, у слушателя прописываю анимирование кнопки. При нажатии на кнопку анимация срабатывает хорошо, НО!!! если идти назад к той кнопке которую мы передвинули она не нажимается! Как буд то поверх нее еще наложилась текстура! Другие кнопки нажимаются. Перепробовал все что можно:
v.getAnimation().reset();
v.getAnimation().cancel();
v.clearAnimation();
v.setAnimation(null);
v.getAnimation().setAnimationListener(null);
не помогло! Если есть советы и вы сталкивались с той же проблемой прошу ответить!
Картинка для нагядности:
Нужная часть кода, чтобы было понятнее:
public class TouchButtonAction implements View.OnClickListener {
private GameController mController;
private List<ImageButton> mButtons;
private List<GridLayout.LayoutParams> mParams;
private final Animation myAnimA;
private volatile boolean isAnimAFinish = true;
public TouchButtonAction(Context context, GameController controller, List<ImageButton> buttons, List<GridLayout.LayoutParams> params) {
this.mParams = params;
this.mButtons = buttons;
this.mController = controller;
this.myAnimA = AnimationUtils.loadAnimation(context, R.anim.bounce_swap);
final ButtonBounceInterpolator mInterpolatorA = new ButtonBounceInterpolator(0.07, 20);
this.myAnimA.setInterpolator(mInterpolatorA);
// this.myAnimA.setAnimationListener(new Animation.AnimationListener() {
// @Override
// public void onAnimationStart(Animation animation) {
// isAnimAFinish = false;
//// animation.setFillAfter(false);
//// animation.reset();
//
// }
//
// @Override
// public void onAnimationEnd(Animation animation) {
//// animation.reset();
// animation.cancel();
// isAnimAFinish = true;
//// synchronized (this){
//
//// }
// }
//
// @Override
// public void onAnimationRepeat(Animation animation) {
//
// }
// });
@Override
public void onClick(final View v) {
int a = mButtons.indexOf((ImageButton) v);
int b = 0;
for (ImageButton button : mButtons) {
if (!button.isEnabled()) {
b = mButtons.indexOf(button);
}
}
if (тут проверка логики) {
SoundPlay.playSoundPool(SoundPlay.TOUCH);
if (isAnimAFinish){
// v.post(new Runnable() {
// @Override
// public void run() {
// synchronized (this){
v.startAnimation(myAnimA);
isAnimAFinish = false;
// }
//
// }
// });
}
if (v.getAnimation() != null){
if (v.getAnimation().hasEnded()){
Log.d("LOGGG", "hasEnded Anim");
v.getAnimation().reset();
v.getAnimation().cancel();
v.clearAnimation();
v.setAnimation(null);
v.getAnimation().setAnimationListener(null);
isAnimAFinish = true;
}
}
Collections.swap(mButtons, a, b);
mController.getGridLayout().removeAllViewsInLayout();
mController.getGridLayout().removeAllViews();
for (int i = 0; i < mButtons.size(); i++) { // i < 12
ImageButton button = mButtons.get(i);
mController.getGridLayout().addView(button, mParams.get(i));
}
mController.getGridLayout().invalidate();
} else {
SoundPlay.playSoundPool(SoundPlay.TOUCH_BANG);
}
mController.checkSolution(mButtons);
}
Оказывается, надо было использовать не AnimationUtils.loadAnimation(), а совсем другие классы которые позволяют манипулировать объектами, например такие как виджеты.
Пример анимации прыгающей кнопки:
AnimatorSet as = new AnimatorSet();
float y = view.getTranslationY(), distance = 20F;
as.playSequentially(
ObjectAnimator.ofFloat(view, "translationY", y - distance), // анимация 1
ObjectAnimator.ofFloat(view, "translationY", y), // анимация 2
ObjectAnimator.ofFloat(view, "translationY", y - (distance / 2)), // анимация 3
ObjectAnimator.ofFloat(view, "translationY", y)); // анимация 4
as.setDuration(600);
as.start();
И анимация вашего виджета начинает прыгать. Надеюсь вам это помогло как и мне.
Вначале про бизнес-логикуЕсть идея программы, часть функций уже реализована, структура (как на картинке) уже создана
Хочу получить данные из своей базы данных в Firebase, а точнее поле Имя Моя база имеет такую структуру: