TabLayout相信大家都用过,2015年Google大会上发布了新的Android Support Design库里面包含了很多新的控件,其中就包含TabLayout,它可以配合ViewPager完成很好的效果。

一种类似于今日头条指示器,根据ViewPager的页面滑动,文字逐渐变色。

今日头条的顶部tab导航效果的实现,我们一般会用RadioGroup+Fragment+ViewPager来实现,适配器繁多,代码量大,今天我们来介绍TabLayout的使用。TabLayout为Android的Design库中的一个控件。首先我们来看一下运行的效果图:

ColorTrackTabLayout

先看下效果

使用

因为是继承TabLayout,所以用法跟TabLayout一模一样

  1. //隐藏Indicator
  2. mTab.setSelectedTabIndicatorHeight(0);
  3. //设置左右内边距
  4. mTab.setTabPaddingLeftAndRight(10,10);
  5. mTab.setupWithViewPager(mViewPager);

原理

ColorTrackLayout主要是继承了TabLayout,对它做了一些扩展。

既然是随着页面的滑动文字颜色渐变那么肯定少不了ViewPager的页面监听,这个在我们调用setupWithViewPager的时候TabLayout就已经添加监听。

  1. private void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh,
  2. boolean implicitSetup) {
  3. ....
  4.  
  5. if (viewPager != null) {
  6. mViewPager = viewPager;
  7.  
  8. // Add our custom OnPageChangeListener to the ViewPager
  9. if (mPageChangeListener == null) {
  10. //添加了滑动监听
  11. mPageChangeListener = new TabLayoutOnPageChangeListener(this);
  12. }
  13. mPageChangeListener.reset();
  14. viewPager.addOnPageChangeListener(mPageChangeListener);
  15.  
  16. // Now we'll add a tab selected listener to set ViewPager's current item
  17. mCurrentVpSelectedListener = new ViewPagerOnTabSelectedListener(viewPager);
  18. addOnTabSelectedListener(mCurrentVpSelectedListener);
  19.  
  20. final PagerAdapter adapter = viewPager.getAdapter();
  21. if (adapter != null) {
  22. // Now we'll populate ourselves from the pager adapter, adding an observer if
  23. // autoRefresh is enabled
  24. setPagerAdapter(adapter, autoRefresh);
  25. }
  26.  
  27. // Add a listener so that we're notified of any adapter changes
  28. if (mAdapterChangeListener == null) {
  29. mAdapterChangeListener = new AdapterChangeListener();
  30. }
  31. mAdapterChangeListener.setAutoRefresh(autoRefresh);
  32. viewPager.addOnAdapterChangeListener(mAdapterChangeListener);
  33.  
  34. // Now update the scroll position to match the ViewPager's current item
  35. setScrollPosition(viewPager.getCurrentItem(), 0f, true);
  36. } else {
  37. // We've been given a null ViewPager so we need to clear out the internal state,
  38. // listeners and observers
  39. mViewPager = null;
  40. setPagerAdapter(null, false);
  41. }
  42. ....
  43.  
  44. }

创建了mPageChangeListener并添加了监听

所以我们必须要重写setupWithViewPager删除掉原来的监听,换成我们自己的监听

  1. mPageChangeListener = new TabLayoutOnPageChangeListener(this);
  2.  
  3. @Override
  4. public void setupWithViewPager(@Nullable ViewPager viewPager, boolean autoRefresh) {
  5. super.setupWithViewPager(viewPager, autoRefresh);
  6. try {
  7. //通过反射找到mPageChangeListener
  8. Field field = TabLayout.class.getDeclaredField("mPageChangeListener");
  9. field.setAccessible(true);
  10. TabLayoutOnPageChangeListener listener = (TabLayoutOnPageChangeListener) field.get(this);
  11. if (listener != null) {
  12. //删除自带监听
  13. viewPager.removeOnPageChangeListener(listener);
  14. mPageChangeListenter = new ColorTrackTabLayoutOnPageChangeListener(this);
  15. mPageChangeListenter.reset();
  16. viewPager.addOnPageChangeListener(mPageChangeListenter);
  17. }
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. }
  21.  
  22. }

还需要做的一点就是把TabLayout每一个的Tab布局替换成我们的。怎么替换呢?重写addTab,在添加的时候改成我们的布局

  1. @Override
  2. public void addTab(@NonNull Tab tab, int position, boolean setSelected) {
  3. ColorTrackView colorTrackView = new ColorTrackView(getContext());
  4. colorTrackView.setProgress(setSelected ? 1 : 0);
  5. colorTrackView.setText(tab.getText() + "");
  6. colorTrackView.setTextSize(mTabTextSize);
  7. colorTrackView.setTag(position);
  8. colorTrackView.setTextChangeColor(mTabSelectedTextColor);
  9. colorTrackView.setTextOriginColor(mTabTextColor);
  10. LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
  11. colorTrackView.setLayoutParams(layoutParams);
  12. tab.setCustomView(colorTrackView);
  13.  
  14. super.addTab(tab, position, setSelected);
  15. if (position == 0) {
  16. //默认选中第一个
  17. setSelectedView(position);
  18. }
  19.  
  20. setTabWidth(position, colorTrackView);
  21. }

借鉴: www.weyye.me/detail/colo…

其关键就是将我们的布局利用setCustomView方法来设置上去。

源码链接 https://github.com/DingXianSen/DcColorTabLayout

自适应 Tab 宽度可以滑动文字逐渐变色的 TabLayout(仿今日头条顶部导航)的更多相关文章

  1. iOS仿今日头条滑动导航

    之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问 ...

  2. [Android] Android 类似今日头条顶部的TabLayout 滑动标签栏 效果

    APP市场中大多数新闻App都有导航菜单,导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面,今日头条, 网易新闻等. 本文主要讲的是用:T ...

  3. Android仿今日头条和知乎等App顶部滑动导航实现代码分析及源码下载

    一.本文所涉及到的知识点 源码下载 二.目标 通过利用ViewPager+FragmentStatePagerAdapter+TabLayout 实现顶部滑动效果,如图: 三.知识点讲解 1.View ...

  4. 仿今日头条app手机端顶部触屏滑动导航

    swiper.js <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. 自定义tabpageindicator,可以自定义tab是三角形还是矩形,但是tab不具有滑动的功能

    我是不会滴,但是看了一些大神写的,我修改了一下,大家可以参照参照 一,自定义Mytabpageindicator,直接贴代码了,具体的在代码中有注释 package com.wangy.mytabpa ...

  6. 基于jQuery图片遮罩滑动文字切换特效

    基于jQuery图片遮罩滑动文字切换特效.这是一款jquery hover鼠标滑动选项卡切换透明背景遮罩文字显示特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div ...

  7. 自适应图片宽度的jQuery焦点幻灯轮播代码

    自适应图片宽度的jQuery焦点幻灯轮播代码 注意要1.7.2版本的jq才支持点击后显示点击的图片,不然就是一直顺序播放 演示   XML/HTML Code <div id="sli ...

  8. EasyUI设置Layout自适应浏览器宽度和高度

    //设置自适应浏览器宽度和高度 function setLayoutHeight() { var height = $(window).height() - 20; $("#main_lay ...

  9. tab切换的效果——仿照今日头条APP的切换效果

    说点废话;不知道是哪一版本起头条的tab切换效果就变了,一直琢磨着这个事,去度娘那里也没有什么结果:正好这两天有空就尝试做了一下:用前端的技术来实现: 先看效果吧:上面的tab随着slide滑动,上面 ...

随机推荐

  1. 浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题

    本文出处:http://www.cnblogs.com/wy123/p/7501261.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  2. Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触

    前言:在Remoting中处理事件其实并不复杂,但其中有些技巧需要你去挖掘出来.正是这些技巧,仿佛森严的壁垒,让许多人望而生畏,或者是不知所谓,最后放弃了事件在Remoting的使用.关于这个主题,在 ...

  3. h5drag事件

    在拖动目标上触发事件 (源元素):ondragstart - 用户开始拖动元素时触发ondrag - 元素正在拖动时触发ondragend - 用户完成元素拖动后触发释放目标时触发的事件:ondrag ...

  4. [转]RMI方式Ehcache集群的源码分析

    RMI方式Ehcache集群的源码分析   Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示:   Ehcache支持 ...

  5. startsWith和endWith方法

    startsWith(): 例如:if(a.startsWith(b)) //判断字符串a 是不是以字符串b开头. 语法1 public boolean startsWith(String prefi ...

  6. Java之String、StringBuffer、StringBuilder

    String.StringBuffer和StringBuilder的理解 这三个类学过已经有一段时间了,想通过这篇文章再将其复习一下,以求温故知新. 首先说一下三者各自的特性 String: Stri ...

  7. 玩一把JS的链式调用

    链式调用我们平常用到很多,比如jQuery中的$(ele).show().find(child).hide(),再比如angularjs中的$http.get(url).success(fn_s).e ...

  8. java1.8新特性

    转自:http://www.oschina.NET/translate/everything-about-Java-8 建议去看原文,此处转载只是为了记录. 这篇文章是对Java8中即将到来的改进做一 ...

  9. 软工+C(2017第6期) 最近发展区/脚手架

    // 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...

  10. JAVA课程设计

    博客作业教学数据分析系统(From:网络五条狗) 通过网络爬虫技术,将每位同学的分数链接爬到数据库,并根据每位同学该次作业的分数链接,获取该次作业的浏览量.评论量.图片数等信息,接着根据Java班级博 ...