[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中。
setInAnimation
和setOutAnimation
做了什么
就是设置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.ViewAnimator
的showOnly
方法。
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. 配套视频在 [优酷] ()
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。