Анимация Android не плавная на BackgroundImage

Я создал простое приложение с некоторыми анимациями в Android. В моем макете у меня есть ImageView с исходным изображением и кнопкой на нем. Когда я нажимаю кнопку, я хочу, чтобы она перемещалась и изменяла размер одновременно. Я использовал ObjectAnimator и ValueAnimator для создания анимаций и воспроизведения их вместе с animatorSet. Моя проблема в том, что моя кнопка не двигается плавно. Я проверил несколько анимационных библиотек, таких как Transitions Everywhere и APIDemos. В этих библиотеках, когда я устанавливаю ImageBackground, представление не может двигаться плавно, и у всех из них есть моя проблема. Может ли кто-нибудь помочь мне решить эту проблему?

мой код макета:

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/imageview"
    android:fitsSystemWindows="true"
    android:src="@drawable/image"
    android:scaleType="fitXY" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/frame">

    <Button
        android:layout_width="100dp"
        android:layout_height="45dp"
        android:id="@+id/btn_start"
        android:layout_gravity="center_horizontal|bottom"
        android:gravity="center_vertical|center_horizontal"
        android:textAllCaps="false"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Start" />
//  ....................
</FrameLayout>
</android.support.design.widget.CoordinatorLayout>

мой код анимации:

btn_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ButtonAnimation();
     }
 });

private void ButtonAnimation() {
    Animator moveButtonAnimY = ObjectAnimator.ofFloat(btn_start, "translationY", 0, 200)
            .setDuration(500);
    final ValueAnimator valueAnimator = ValueAnimator.ofFloat(width_btn_start, width_btn_start * 2.0f);
    valueAnimator.setDuration(500);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            btn_start.getLayoutParams().width = value.intValue();
            btn_start.requestLayout();
        }
    });

    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(moveButtonAnimY, valueAnimator);
    animatorSet.start();
}    

person Narsis    schedule 25.04.2016    source источник


Ответы (1)


Согласно Википедии:

Анимация — это процесс создания иллюзии движения и изменения посредством быстрого отображения последовательности статических изображений, минимально отличающихся друг от друга.

Таким образом, анимация является довольно сложной задачей для устройства, и плавность, как вы упомянули, зависит от конфигурации устройства.

Итак, сначала проверьте, достаточно ли мощности устройства для плавного выполнения этой анимации.

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

Лучшей версией вашего кода будет:

btn_start.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ButtonAnimation();
    }
});
Animator moveButtonAnimY = ObjectAnimator.ofFloat(btn_start,"translationY", 0, 200).setDuration(500);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(width_btn_start, width_btn_start * 2.0f);
valueAnimator.setDuration(500);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    public void onAnimationUpdate(ValueAnimator animation) {
        Integer value = (Integer) animation.getAnimatedValue();
        btn_start.getLayoutParams().width = value.intValue();
        btn_start.requestLayout();
    }
});
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(moveButtonAnimY, valueAnimator);

private void ButtonAnimation() {
    animatorSet.start();
}  
person Alok Saini    schedule 25.04.2016
comment
alok, я тестирую ваш код на своем LG g3, но не вижу никаких изменений в скорости анимации! - person MohsenTi; 26.04.2016