Android-анимация не плавная на BackgroundImage
Я создал простое приложение с некоторыми анимациями в Android. В моем макете у меня есть ImageView с sourceImage и кнопкой на нем. Когда я нажимаю кнопку, я хочу, чтобы она двигалась и изменяла размер одновременно. Я использовал 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();
}
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();
}