大晚上的,浅聊一下视图切换器(ViewSwitcher)吧。ViewSwitcher类间接继承FrameLayout类,所以这么一理解视图切换器其实就是个类似于帧布局的视图容器。接下来瞅一瞅怎么使用它吧。
首先,在加载的主布局中找到ViewSwitcher控件。
ViewSwitcher中有个setFactory方法,我们来看看它。
public void setFactory(ViewFactory factory) {
mFactory = factory;
obtainView();
obtainView();
}
这个方法中传入了一个ViewFactory对象,字面意思视图工厂,就是动态生产视图View用的。
public interface ViewFactory {
View makeView();
}
可以看出它是一个函数式接口,只有一个要实现的makeView方法,该方法要返回一个视图。setFactory方法中调用了两次obtainView方法。
private View obtainView() {
View child = mFactory.makeView();
LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (lp == null) {
lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
addView(child, lp);
return child;
}
可以看出 obtainView中是使用我们实现的ViewFactory视图工厂来生产View的,然后把该View添加到容器中。共调用了两次obtainView,那么在容器中只有重叠的两个视图存在,源码注释中也有提到,A ViewSwitcher can only have two child views, of which only one is shown at a time.
好了,setFactory看完了,说白了就是要往ViewSwitcher 容器中添加我们的视图,而这个视图是从视图工厂ViewFactory得到的,所以我们的逻辑要实现这个接口中的makeView方法。
添加动画效果setInAnimation和setOutAnimation这里就不说啦,感兴趣的自己去了解。
上面加载完我们的视图,我们得要用啊,可以使用它的getNextView方法。
public View getNextView() {
int which = mWhichChild == 0 ? 1 : 0;
return getChildAt(which);
}
上面说过,它就造了2视图,所以getNextView就是从这2个视图中轮流返回。得到了我们定义的视图后就可以补充视图内容数据了。绑定完数据后,我们要重新把视图展示出来,那就需要用它的showPrevious和showNext方法了,总体还是比较简单的。