ObjectAnimator无限旋转时出现卡顿问题

10

我有一个名为infinite_rotation的动画器,定义如下:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:propertyName="rotation"
        android:repeatCount="infinite"
        android:valueFrom="0"
        android:valueTo="360"
        android:duration="2000" />
</set>
当我不再需要这个东西时(时间不确定),我调用infinite_animator.cancel()。然后在其布局容器上播放一个淡出动画。
<set xmlns:android="http://schemas.android.com/apk/res/android">
        <objectAnimator
            android:propertyName="alpha"
            android:repeatCount="0"
            android:valueTo="0.0"
            android:duration="1000" />
</set>
结果的动画是旋转停止,但在淡出时会出现卡顿。我错过了什么吗?
这是它的样子: enter image description here 更新:我在使用老的三星Tab4和Kitkat操作系统上测试了上述问题。我刚在一个相对较新的三星平板电脑上使用Marshmallow OS进行了测试。动画正常工作。所以我想知道如何在我的旧设备/操作系统上修复这个不好的动画?
这是动画调用:
private void animateRefreshButton() {
    ImageView iv_refresh = (ImageView) findViewById(R.id.iv_refresh);

    if(infinite_animator == null) {
        infinite_animator = AnimatorInflater.loadAnimator(this, R.animator.refresh_rotate);
    }
    infinite_animator.setTarget(iv_refresh);
    infinite_animator.start();
}

hideRefreshButton() 在应用程序确定刷新完成时被启动。这是取消并淡出动画的调用:

private void hideRefreshButton() {
    if(infinite_animator != null) {
        infinite_animator.cancel();
    }

    Animator anim = AnimatorInflater.loadAnimator(this, R.animator.refresh_fadeout);
    anim.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {}

        @Override
        public void onAnimationEnd(Animator animation) {
            framelayout_container_of_iv_refresh.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationCancel(Animator animation) {}

        @Override
        public void onAnimationRepeat(Animator animation) {}
    });
    anim.setTarget(framelayout_container_of_iv_refresh);
    anim.start();
}

你尝试将 fillAfter 设置为 true 来实现旋转动画吗? - algrid
你能发布一下那个行为的gif吗? - azizbekian
好的,我今天会发布这个 GIF。 - user1506104
@algrid 我认为 setFillAfter 只适用于视图动画(View Animation)而不适用于属性动画(Property Animation)。 - user1506104
请在您开始和停止相应动画的代码中添加代码。 - iMDroid
显示剩余3条评论
1个回答

20

个人而言,我不使用动画 API,因为它存在“问题”。相反,在这种情况下,我会选择Animators API

这是片段:


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
// 查找名为 imageView 的视图 View view = findViewById(R.id.imageView);
// 创建一个旋转动画对象 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, View.ROTATION, 0.0f, 360.0f);
// 设置动画时长和重复次数并设置线性插值器 objectAnimator.setDuration(2000); objectAnimator.setRepeatCount(Animation.INFINITE); objectAnimator.setInterpolator(new LinearInterpolator());
// 添加动画状态监听器 objectAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(Animator animation) { // 当动画被取消时,淡出视图并设置淡出时间 view.animate() .alpha(0.0f) .setDuration(1000); } });
// 启动动画 objectAnimator.start();
// 设置视图点击事件处理程序 view.setOnClickListener((v) -> objectAnimator.cancel());
}

那么这将是输出结果:

在此输入图片描述


我已在模拟器(API 19)上测试:按预期工作。


我也在使用ObjectAnimator。在我的情况下,我通过XML资源创建了动画。 - user1506104
不用担心(分享你的想法仍然加1)...在我分享代码之前,请查看更新后的问题。 - user1506104
是的,这个可以工作。但我应该在它的容器RelativeLayout上应用淡出效果。 - user1506104
这是个问题吗?不要执行 view.animate().alpha(0.0f).setDuration(1000),而要执行 relativeLayout.animate().alpha(0.0f).setDuration(1000) - azizbekian
是的,我认为那就是问题所在。我试图移除布局,在图像视图上淡出效果很好。 - user1506104
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接