Как сделать анимацию перевода кнопки в Android Studio?

#java #android-studio

#java #android-studio

Вопрос:

Я пытаюсь переместить кнопку с одного сайта на другой. Мне удается переместить ее, но когда она перемещается, я должен нажать на то место, где она была раньше, вместо того, чтобы нажимать на кнопку. Почему это происходит?

Вот как это выглядит. Вы можете видеть, как в конце, когда я нажимаю на другую сторону, активируется тень кнопки

Мой код:

Анимация xaml

move.xml:

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    >

    <translate
        android:fromYDelta="0%p"
        android:fromXDelta="0%p"
        android:toXDelta="-300"
        android:toYDelta="-300"
        android:duration="500"
        ></translate>

</set>  

В коде:

     Animation animation = AnimationUtils.loadAnimation(this,R.anim.move);
    btnNext.startAnimation(animation);
  

Ответ №1:

Это происходит потому, что анимация выполняется путем изменения свойств представления translationX и translationY, а не фактической позиции, которую авторы фреймворка пользовательского интерфейса, в своей бесконечно малой мудрости, поместили во внешний класс, наследуя LayoutParams. Следовательно, события щелчка отправляются в «необработанную» позицию представления, которая не учитывает преобразования представления (ссылка). Анимации в Android все еще довольно утомительны и неукротимы, но, по крайней мере, есть много подходов. Для этого случая ValueAnimator для полей LayoutParams кажется решением. Если макет допускает поля, это может выглядеть так:

 final ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) btnNext.getLayoutParams();
int initialX = displayWidth - btnNextWidth, finalX = displayWidth / 2;

ValueAnimator.ofInt(initialX, finalX)
    .setDuration(500)
    .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator valueAnimator) {
             Integer ax = (Integer) valueAnimator.getAnimatedValue();
             Log.i("anim", "x: "   ax);
             lp.leftMargin = ax;
             btnNext.requestLayout();
         }
    });
  

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

1. Я попробовал это и в Integer ax = (Integer) valAnim.GetValue(); , говорится, не удается разрешить метод ‘GetValue ()’. Я пробовал с помощью getValues(), но ничего не произошло

2. извините, моя ошибка, метод называется getAnimatedValue; я отредактировал ответ

3. valAnim — это параметр ValueAnimator метода onAnimationUpdate в AnimatorUpdateListener; Я отредактировал ответ, заменив синтаксис java 8, в котором использовался лямбда, синтаксисом внутреннего класса, который должен работать во всех проектах.