ViewSwitcher类解析,可以用来在两个View中切换显示,并添加切换动画

前段时间根据项目需求有一个无限向上滚动显示文字的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(); // 设置退出不显示的动画
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值