ViewSwitcher和自定义动画ImageView

时间:2014-01-19 14:12:40

标签: android animation view

我想实现一些RotatingImageView,我有一个看起来像这样的动画:

public void init() {

    mCurrentRotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.51f);
    mCurrentRotateAnimation.setDuration(0);
    mCurrentRotateAnimation.setRepeatCount(Animation.INFINITE);
    mCurrentRotateAnimation.setRepeatMode(Animation.RESTART);
    mCurrentRotateAnimation.setInterpolator(new InfoInterpolator());
    startAnimation(mCurrentRotateAnimation);
}

当这个RotatingImageView开始在ViewSwitcher(ViewAnimator)中使用时出现困难,并且ViewSwitcher根据它所拥有的输入/输出动画改变自己的动画(基本上通过调用startAnimation()他自己的输入/输出动画,覆盖了我的旋转动画

// ViewSwitcher/ViewAnimator code changing the animation    
void showOnly(int childIndex, boolean animate) {
    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (i == childIndex) {
            if (animate && mInAnimation != null) {
                child.startAnimation(mInAnimation);
            }
            child.setVisibility(View.VISIBLE);
            mFirstTime = false;
        } else {
            if (animate && mOutAnimation != null && child.getVisibility() == View.VISIBLE) {
                child.startAnimation(mOutAnimation);
            } else if (child.getAnimation() == mInAnimation)
                child.clearAnimation();
            child.setVisibility(View.GONE);
        }
    }
}

我尝试保留假插补器的输入以“知道”旋转动画停止的位置,并在ViewSwitcher调用startAnimation时恢复它,但旋转动画中仍然存在“跳跃”!

如何让ImageView一直旋转,添加和删除来自ViewSwitcher / ViewAnimator 的正确输入/输出动画,而不停止旋转动画

提前多多感谢!

1 个答案:

答案 0 :(得分:1)

如果您使用旧动画系统同时通过ViewSwitcher更改其可见性,您的动画视图将始终闪烁。 解决方案是使用ViewPropertyAnimator实际修改视图的属性,这就是为什么你的视图即使在被viewSwitcher隐藏之后也会保持其位置(这里是它的角度)。

以下是基于RotatingImageView的示例,如果您的目标是android&lt; 11你应该使用NineOldAndroids

@SuppressLint("NewApi")
private void init() {
    ObjectAnimator rotationAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(getContext(), R.animator.rotation);
    rotationAnimator.setTarget(this);
    rotationAnimator.start();
}

这里是rotation.xml(放在res / animator中)

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:propertyName="rotation"
    android:repeatCount="infinite"
    android:repeatMode="restart"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueTo="360"
    android:valueType="floatType" />