0

我在 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();
}    
4

1 回答 1

0

根据维基百科:

动画是通过快速显示一系列彼此差异最小的静态图像来制造运动和变化错觉的过程。

因此,动画是设备处理的一项相当繁重的任务,您提到的平滑度取决于设备配置。

因此,首先检查设备是否有足够的电量来顺利执行该动画。

其次,您的代码每次单击按钮时都会初始化动画,相反,您应该初始化一次动画,并在每次需要启动动画时使用它们的实例。

您的代码的更好版本是:

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();
}  
于 2016-04-25T12:53:07.367 回答