自适应 Tab 宽度可以滑动文字逐渐变色的 TabLayout(仿今日头条顶部导航)
TabLayout
相信大家都用过,2015年Google大会上发布了新的Android Support Design库里面包含了很多新的控件,其中就包含TabLayout
,它可以配合ViewPager
完成很好的效果。
一种类似于今日头条指示器,根据ViewPager的页面滑动,文字逐渐变色。
今日头条的顶部tab导航效果的实现,我们一般会用RadioGroup+Fragment+ViewPager来实现,适配器繁多,代码量大,今天我们来介绍TabLayout的使用。TabLayout为Android的Design库中的一个控件。首先我们来看一下运行的效果图:
ColorTrackTabLayout
先看下效果
使用
因为是继承TabLayout,所以用法跟TabLayout一模一样
- //隐藏Indicator
- mTab.setSelectedTabIndicatorHeight(0);
- //设置左右内边距
- mTab.setTabPaddingLeftAndRight(10,10);
- mTab.setupWithViewPager(mViewPager);
原理
ColorTrackLayout
主要是继承了TabLayout,对它做了一些扩展。
既然是随着页面的滑动文字颜色渐变那么肯定少不了ViewPager的页面监听,这个在我们调用setupWithViewPager
的时候TabLayout就已经添加监听。
- private void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh,
- boolean implicitSetup) {
- ....
- if (viewPager != null) {
- mViewPager = viewPager;
- // Add our custom OnPageChangeListener to the ViewPager
- if (mPageChangeListener == null) {
- //添加了滑动监听
- mPageChangeListener = new TabLayoutOnPageChangeListener(this);
- }
- mPageChangeListener.reset();
- viewPager.addOnPageChangeListener(mPageChangeListener);
- // Now we'll add a tab selected listener to set ViewPager's current item
- mCurrentVpSelectedListener = new ViewPagerOnTabSelectedListener(viewPager);
- addOnTabSelectedListener(mCurrentVpSelectedListener);
- final PagerAdapter adapter = viewPager.getAdapter();
- if (adapter != null) {
- // Now we'll populate ourselves from the pager adapter, adding an observer if
- // autoRefresh is enabled
- setPagerAdapter(adapter, autoRefresh);
- }
- // Add a listener so that we're notified of any adapter changes
- if (mAdapterChangeListener == null) {
- mAdapterChangeListener = new AdapterChangeListener();
- }
- mAdapterChangeListener.setAutoRefresh(autoRefresh);
- viewPager.addOnAdapterChangeListener(mAdapterChangeListener);
- // Now update the scroll position to match the ViewPager's current item
- setScrollPosition(viewPager.getCurrentItem(), 0f, true);
- } else {
- // We've been given a null ViewPager so we need to clear out the internal state,
- // listeners and observers
- mViewPager = null;
- setPagerAdapter(null, false);
- }
- ....
- }
创建了mPageChangeListener并添加了监听
所以我们必须要重写setupWithViewPager
删除掉原来的监听,换成我们自己的监听
- mPageChangeListener = new TabLayoutOnPageChangeListener(this);
- @Override
- public void setupWithViewPager(@Nullable ViewPager viewPager, boolean autoRefresh) {
- super.setupWithViewPager(viewPager, autoRefresh);
- try {
- //通过反射找到mPageChangeListener
- Field field = TabLayout.class.getDeclaredField("mPageChangeListener");
- field.setAccessible(true);
- TabLayoutOnPageChangeListener listener = (TabLayoutOnPageChangeListener) field.get(this);
- if (listener != null) {
- //删除自带监听
- viewPager.removeOnPageChangeListener(listener);
- mPageChangeListenter = new ColorTrackTabLayoutOnPageChangeListener(this);
- mPageChangeListenter.reset();
- viewPager.addOnPageChangeListener(mPageChangeListenter);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
还需要做的一点就是把TabLayout每一个的Tab布局替换成我们的。怎么替换呢?重写addTab
,在添加的时候改成我们的布局
- @Override
- public void addTab(@NonNull Tab tab, int position, boolean setSelected) {
- ColorTrackView colorTrackView = new ColorTrackView(getContext());
- colorTrackView.setProgress(setSelected ? 1 : 0);
- colorTrackView.setText(tab.getText() + "");
- colorTrackView.setTextSize(mTabTextSize);
- colorTrackView.setTag(position);
- colorTrackView.setTextChangeColor(mTabSelectedTextColor);
- colorTrackView.setTextOriginColor(mTabTextColor);
- LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- colorTrackView.setLayoutParams(layoutParams);
- tab.setCustomView(colorTrackView);
- super.addTab(tab, position, setSelected);
- if (position == 0) {
- //默认选中第一个
- setSelectedView(position);
- }
- setTabWidth(position, colorTrackView);
- }
其关键就是将我们的布局利用setCustomView方法来设置上去。
源码链接 https://github.com/DingXianSen/DcColorTabLayout
自适应 Tab 宽度可以滑动文字逐渐变色的 TabLayout(仿今日头条顶部导航)的更多相关文章
- iOS仿今日头条滑动导航
之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问 ...
- [Android] Android 类似今日头条顶部的TabLayout 滑动标签栏 效果
APP市场中大多数新闻App都有导航菜单,导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面,今日头条, 网易新闻等. 本文主要讲的是用:T ...
- Android仿今日头条和知乎等App顶部滑动导航实现代码分析及源码下载
一.本文所涉及到的知识点 源码下载 二.目标 通过利用ViewPager+FragmentStatePagerAdapter+TabLayout 实现顶部滑动效果,如图: 三.知识点讲解 1.View ...
- 仿今日头条app手机端顶部触屏滑动导航
swiper.js <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 自定义tabpageindicator,可以自定义tab是三角形还是矩形,但是tab不具有滑动的功能
我是不会滴,但是看了一些大神写的,我修改了一下,大家可以参照参照 一,自定义Mytabpageindicator,直接贴代码了,具体的在代码中有注释 package com.wangy.mytabpa ...
- 基于jQuery图片遮罩滑动文字切换特效
基于jQuery图片遮罩滑动文字切换特效.这是一款jquery hover鼠标滑动选项卡切换透明背景遮罩文字显示特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
- 自适应图片宽度的jQuery焦点幻灯轮播代码
自适应图片宽度的jQuery焦点幻灯轮播代码 注意要1.7.2版本的jq才支持点击后显示点击的图片,不然就是一直顺序播放 演示 XML/HTML Code <div id="sli ...
- EasyUI设置Layout自适应浏览器宽度和高度
//设置自适应浏览器宽度和高度 function setLayoutHeight() { var height = $(window).height() - 20; $("#main_lay ...
- tab切换的效果——仿照今日头条APP的切换效果
说点废话;不知道是哪一版本起头条的tab切换效果就变了,一直琢磨着这个事,去度娘那里也没有什么结果:正好这两天有空就尝试做了一下:用前端的技术来实现: 先看效果吧:上面的tab随着slide滑动,上面 ...
随机推荐
- 浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题
本文出处:http://www.cnblogs.com/wy123/p/7501261.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
前言:在Remoting中处理事件其实并不复杂,但其中有些技巧需要你去挖掘出来.正是这些技巧,仿佛森严的壁垒,让许多人望而生畏,或者是不知所谓,最后放弃了事件在Remoting的使用.关于这个主题,在 ...
- h5drag事件
在拖动目标上触发事件 (源元素):ondragstart - 用户开始拖动元素时触发ondrag - 元素正在拖动时触发ondragend - 用户完成元素拖动后触发释放目标时触发的事件:ondrag ...
- [转]RMI方式Ehcache集群的源码分析
RMI方式Ehcache集群的源码分析 Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示: Ehcache支持 ...
- startsWith和endWith方法
startsWith(): 例如:if(a.startsWith(b)) //判断字符串a 是不是以字符串b开头. 语法1 public boolean startsWith(String prefi ...
- Java之String、StringBuffer、StringBuilder
String.StringBuffer和StringBuilder的理解 这三个类学过已经有一段时间了,想通过这篇文章再将其复习一下,以求温故知新. 首先说一下三者各自的特性 String: Stri ...
- 玩一把JS的链式调用
链式调用我们平常用到很多,比如jQuery中的$(ele).show().find(child).hide(),再比如angularjs中的$http.get(url).success(fn_s).e ...
- java1.8新特性
转自:http://www.oschina.NET/translate/everything-about-Java-8 建议去看原文,此处转载只是为了记录. 这篇文章是对Java8中即将到来的改进做一 ...
- 软工+C(2017第6期) 最近发展区/脚手架
// 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...
- JAVA课程设计
博客作业教学数据分析系统(From:网络五条狗) 通过网络爬虫技术,将每位同学的分数链接爬到数据库,并根据每位同学该次作业的分数链接,获取该次作业的浏览量.评论量.图片数等信息,接着根据Java班级博 ...