【问题标题】:Android animations not smooth on BackgroundImageBackgroundImage 上的 Android 动画不流畅
【发布时间】:2016-04-25 12:09:33
【问题描述】:

我在 android 中创建了带有一些动画的简单应用程序。在我的布局中,我有一个带有 sourceImage 和一个按钮的 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();
}    

【问题讨论】:

    标签: android animation objectanimator animatorset


    【解决方案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();
    }  
    

    【讨论】:

    • 好吧,我在我的 LG g3 中测试了你的代码,但没有看到动画速度有任何变化!
    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2010-11-07
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多