#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, в котором использовался лямбда, синтаксисом внутреннего класса, который должен работать во всех проектах.