可以直接跳转到ViewAnimator中的第二个视图

时间:2012-06-27 17:34:37

标签: android android-animation android-view

我有一个ViewAnimator(确切地说ViewSwitcher),其中有与之关联的淡入/淡出动画和两个Views,我使用ViewAnimator.showNext()和{{}进行过渡{1}}方法。

我的应用程序中有一项要求,有时我需要直接从第二个ViewAnimator.showPrevious()开始,而不显示从第一个View到第二个View的淡入淡出动画。任何人都知道是否有一种直接的方法可以实现这一目标,而不必处理与我ViewAnimator相关的输入/输出动画?

  

注意:我尝试过调用ViewAnimator.setDisplayedChild(1),但这也会动画过渡。

3 个答案:

答案 0 :(得分:17)

我环顾四周等待回应,但我猜这是不可能的。因此,如果没有更好的解决方案,当您想要直接跳转到ViewAnimator的特定子View时,请将ViewAnimator的进/出动画设置为null,如下所示:

myViewAnimator.setInAnimation(null);
myViewAnimator.setOutAnimation(null);
myViewAnimator.setDisplayedChild(childIndex);

如果有人知道更好的方式 - 而不是使用ViewAnimator的动画片进/出动画 - 请分享!

答案 1 :(得分:7)

不幸的是,没有内置函数可以做到这一点,但你可以添加这个功能,它可以完成这项工作:

public static void setDisplayedChildNoAnim(ViewAnimator viewAnimator, int whichChild) {
    Animation inAnimation = viewAnimator.getInAnimation();
    Animation outAnimation = viewAnimator.getOutAnimation();
    viewAnimator.setInAnimation(null);
    viewAnimator.setOutAnimation(null);
    viewAnimator.setDisplayedChild(whichChild);
    viewAnimator.setInAnimation(inAnimation);
    viewAnimator.setOutAnimation(outAnimation);
}

答案 2 :(得分:0)

这是一种更全面的方法,可让您选择id或视图,以及是否带有动画:

fun ViewAnimator.setViewToSwitchTo(viewToSwitchTo: View, animate: Boolean = true): Boolean {
    if (currentView === viewToSwitchTo)
        return false
    for (i in 0 until childCount) {
        if (getChildAt(i) !== viewToSwitchTo)
            continue
        if (animate)
            displayedChild = i
        else {
            val outAnimation = this.outAnimation
            val inAnimation = this.inAnimation
            this.inAnimation = null
            this.outAnimation = null
            displayedChild = i
            this.inAnimation = inAnimation
            this.outAnimation = outAnimation
        }
        return true
    }
    return false
}

fun ViewAnimator.setViewToSwitchTo(@IdRes viewIdToSwitchTo: Int, animate: Boolean = true): Boolean {
    if (currentView.id == viewIdToSwitchTo)
        return false
    for (i in 0 until childCount) {
        if (getChildAt(i).id != viewIdToSwitchTo)
            continue
        if (animate)
            displayedChild = i
        else {
            val outAnimation = this.outAnimation
            val inAnimation = this.inAnimation
            this.inAnimation = null
            this.outAnimation = null
            displayedChild = i
            this.inAnimation = inAnimation
            this.outAnimation = outAnimation
        }
        return true
    }
    return false
}

用法示例:

viewSwitcher.setViewToSwitchTo(someView,false)