TabLayout(二)

当进行 tablayout 切换时的处理流程
在 TabLayout.setupWithViewPager(vp)过程中
我们通过 TabLayout.pageChangeListener 获取 viewpager 的翻页事件获取页码 position
对当前 TabLayout 添加一个为 ViewPager 准备的 OnTabSelectedListener

if (viewPager != null) {
            this.viewPager = viewPager;
            if (this.pageChangeListener == null) {
                this.pageChangeListener = new TabLayout.TabLayoutOnPageChangeListener(this);
            }

            this.pageChangeListener.reset();
            viewPager.addOnPageChangeListener(this.pageChangeListener);
            this.currentVpSelectedListener = new TabLayout.ViewPagerOnTabSelectedListener(viewPager);
            this.addOnTabSelectedListener(this.currentVpSelectedListener);
            PagerAdapter adapter = viewPager.getAdapter();
            if (adapter != null) {
                this.setPagerAdapter(adapter, autoRefresh);
            }

            if (this.adapterChangeListener == null) {
                this.adapterChangeListener = new TabLayout.AdapterChangeListener();
            }

            this.adapterChangeListener.setAutoRefresh(autoRefresh);
            viewPager.addOnAdapterChangeListener(this.adapterChangeListener);
            this.setScrollPosition(viewPager.getCurrentItem(), 0.0F, true);
        } else {
            this.viewPager = null;
            this.setPagerAdapter((PagerAdapter)null, false);
        }

我们正常对 tablayout 的切换操作是通过点击对应 tab 来进行,所以来看 tabview 的点击监听

        public boolean performClick() {
            boolean handled = super.performClick();
            if (this.tab != null) {
                if (!handled) {
                    this.playSoundEffect(0);
                }

                this.tab.select();
                return true;
            } else {
                return handled;
            }
        }
//进入到 tab.select();
        public void select() {
            if (this.parent == null) {
                throw new IllegalArgumentException("Tab not attached to a TabLayout");
            } else {
                this.parent.selectTab(this);
            }
        }
//然后进入到 TabLayout.selectTab
    void selectTab(TabLayout.Tab tab, boolean updateIndicator) {
        TabLayout.Tab currentTab = this.selectedTab;
        if (currentTab == tab) {//与上一次选中的 tab相同
            if (currentTab != null) {
//遍历所有的 onTabSelectedListener 监听并进行回调
                this.dispatchTabReselected(tab);
//执行动画
                this.animateToTab(tab.getPosition());
            }
        } else {//与上一次选中的不同
            int newPosition = tab != null ? tab.getPosition() : -1;
            if (updateIndicator) {
                if ((currentTab == null || currentTab.getPosition() == -1) && newPosition != -1) {
                    this.setScrollPosition(newPosition, 0.0F, true);
                } else {
                    this.animateToTab(newPosition);
                }

                if (newPosition != -1) {
                    this.setSelectedTabView(newPosition);
                }
            }

            this.selectedTab = tab;
            if (currentTab != null) {
                this.dispatchTabUnselected(currentTab);
            }

            if (tab != null) {
                this.dispatchTabSelected(tab);
            }
        }

    }

根据选中的 tabview 获取对应的 targetview.Left /Right
通过 ValueAnimator 进行动画位移量计算
通过 ViewCompat 进行SlidingTabIndicator的位移操作

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 开源项目效果 调用实例 必练基本功 Android studio 项目导入依赖compile路径 dependen...
    随心随性_0a25阅读 2,426评论 1 0
  • 一、简述 TabLayout是Android Support Design库的新控件,可以用来实现开源框架View...
    CQ_TYL阅读 1,694评论 0 5
  • 一、概述 它也是design中新出的一个控件,用来实现选项卡切换的效果,以前我们常用RadioGroup+Radi...
    Serenity那年阅读 2,484评论 0 9
  • 文章目录 文章修修补补添加了不少,主要分3个时间段 最早实现,就是在tab切换的时候在下边画一条线 不画线了,因为...
    有点健忘阅读 1,929评论 0 0
  • 我小时候在农村长大,我家在陕西省黄土高坡上的一个小山村,太峪沟。 这个村里出了一个英雄,就是智取华山的刘吉尧刘...
    蜂人蜜语阅读 886评论 10 18