[Android] TextSwitcher -- 怎么做到的

上文当中,我们描述了如何使用TextSwitcher控件。本文将通过分析Android Framework层源码来阐释它是如何实现文本的平滑切换的的。

TextSwitcher的类继承关系

技术分享
有此继承结构我们可以知道,TextSwitcher:
- 继承自FrameLayout,所以其子View层叠地放置着
- 继承自ViewAnimator,所以其持有两个Animation对象,用于呈现淡出、渐入等动画效果。

setFactory做了什么

阅读ViewSwitcher源码,我们可以发现在setFactory方法中,会构造2个我们在makeView回调中生成的视图。

    public void setFactory(ViewFactory factory) {
        mFactory = factory;
        // 构建一个子View
        obtainView();
        // 再构建一个子View
        obtainView();
    }

然后,又将这2个View对象加入到了FrameLayout中。

setInAnimationsetOutAnimation做了什么

就是设置ViewAnimator所持有的Animation对象。
android.view.animation.Animation

    public void setInAnimation(Animation inAnimation) {
        mInAnimation = inAnimation;
    }
setText做了什么
    public void setText(CharSequence text) {
        final TextView t = (TextView) getNextView();
        t.setText(text);
        // 显示下一个View
        showNext();
    }

最终调用了android.widget.ViewAnimatorshowOnly方法。

    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) {
                    // 让新TextView演示进入动画
                    child.startAnimation(mInAnimation);
                }
                child.setVisibility(View.VISIBLE);
                mFirstTime = false;
            } else {
                if (animate && mOutAnimation != null && child.getVisibility() == View.VISIBLE) {
                    // 让旧TextView演示淡出动画
                    child.startAnimation(mOutAnimation);
                } else if (child.getAnimation() == mInAnimation)
                    child.clearAnimation();
                child.setVisibility(View.GONE);
            }
        }
    }

从而实现了文本视图的平滑切换。

注:
1. 相关代码在 GitHub
2. 配套视频在 [优酷] ()

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。