前段时间根据项目需求有一个无限向上滚动显示文字的TextView,这可难住宝宝了,如果说左右循环滚动还好,上下滚动没做过啊,怎么办,只有百度了,然后就找到了几个相关类,TextViewSwitcher,ImageSwitcher,ViewSwitcher,现在就总结一下如何使用这几个类吧。
1. ViewSwitcher介绍
打开ViewSwitch源码,我们可以看到上面注释部分大概意思:ViewSwitcher是在两个View之间进行切换,它有一个用来创建需要显示View的工厂类。我们既可以使用该工厂来创建View,也可以直接添加它们。一个ViewSwitcher有且只能有两个子View,而且同时只能有一个View显示给用户。 下面是ViewSwitcher的源码:
public class ViewSwitcher extends ViewAnimator {
/**
* 用来创建两个子View的工厂对象,
*/
ViewFactory mFactory;
public ViewSwitcher(Context context) {
super(context);
}
public ViewSwitcher(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 该方法用来添加View,可以看到如果ViewSwitcher中的子View大于等于两个的时候
* 再添加View的时候会报错,
*/
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
if (getChildCount() >= 2) {
throw new IllegalStateException("Can't add more than 2 views to a ViewSwitcher");
}
super.addView(child, index, params);
}
@Override
public CharSequence getAccessibilityClassName() {
return ViewSwitcher.class.getName();
}
/**
* 获取到下一个view
*/
public View getNextView() {
int which = mWhichChild == 0 ? 1 : 0;
return getChildAt(which);
}
/**
*该方法通过ViewFactory工厂,创建View,添加到VeiwSwitcher中,并返回该view
*/
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;
}
/**
*设置一个ViewFactory工厂对象,调用obtainView方法,在obtainView中调用ViewFactory的makeView方法创建View,并添加到ViewSwitcher中,
*/
public void setFactory(ViewFactory factory) {
mFactory = factory;
obtainView();
obtainView();
}
/**
*该方法用来重置ViewSwitcher中子View为不可见
*/
public void reset() {
mFirstTime = true;
View v;
v = getChildAt(0);
if (v != null) {
v.setVisibility(View.GONE);
}
v = getChildAt(1);
if (v != null) {
v.setVisibility(View.GONE);
}
}
/**
* 用来创建View添加到ViewSwitcher中的ViewFactory接口
*/
public interface ViewFactory {
View makeView();
}
}
2. ViewSwitcher使用:
1.在布局中进行填充:
<ViewSwitcher
android:id="@+id/viewSwitcher"
android:layout_width="80dp"
android:layout_height="80dp"/>
2. 在Activity或Fragment中查到到该控件:
ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
viewSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() { //创建需要显示的View
ImageView iv = new ImageView(this);
iv.setLayoutParams(new ImageSwitcher.LayoutParams(
ImageSwitcher.LayoutParams.WRAP_CONTENT,
ImageSwitcher.LayoutParams.WRAP_CONTENT));
return iv;
}
});
viewSwitcher.getNextView(); // 获取到下一个View对象
//下面几个方法都来自其父类
viewSwitcher.showNext(); // 显示上一个View
viewSwitcher.showPrevious(); // 显示下一个View
viewSwitcher.setInAnimation(); // 设置进入显示的动画
viewSwitcher.setOutAnimation(); // 设置退出不显示的动画