概述

Android IndicatorView的灵感来源于SlidingTabView,虽然有句“不重复”造轮子在先,本着练手的目的,还是写了一个功能较为简单的类似view。

其比SlidingTabView在功能上欠缺的一点是:暂时没有添加“当内容显示不开时自动向左右滑动”的功能。

应用场景

可以胜任一屏显示所有tab标题的情况。

效果图



所有效果如上图所示

功能

  1. 均等Indicator显示;
  2. 不均等Indicator显示,根据tab标题的字宽度自动适配;
  3. Indicator可以添加indicator两端相对多增加的长度;
  4. 可以设置颜色渐变,一般可用来做tab切换,增加美感;
  5. 文字也可以随Indicator的颜色变化而变化,具有渐变效果;
  6. SimpleIndicatorView可以设置indicator的宽度相对每个等长单元的宽度比值;
  7. SimpleIndicatorView可以设置滑动方向,即水平方向或者竖直方向,同时可以设置底部线条的位置;
  8. 可与ViewPager联动;
  9. 可首尾循环;
  10. 支持padding,支持自定义点击效果等;
  11. 可一同设置文字;
  12. java代码控制非常简单,如果和ViewPager联动,那么只需要一行代码。

加入项目

  1. compile 'cn.carbs.android:IndicatorView:1.0.1'

使用方法

xml布局文件中声明:

SimpleIndicatorView和IndicatorView采用了两种不同的属性,原因是两者差距稍大,索性采用两套属性。由于属性较多,因此xml中的声明稍微复杂。之所以写了两个view,是因为竖直方向显示时,一般没有文字描述,另外SimpleIndicatorView较为轻量化,便于降低耦合。

1.对于IndicatorView,xml中这样声明:

  1. <cn.carbs.android.indicatorview.library.IndicatorView
  2. android:id="@+id/indicator_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="60dp"
  5. android:layout_marginTop="20dp"
  6. android:background="#ffeeeeee"
  7. android:paddingLeft="2dp"
  8. android:paddingRight="2dp"
  9. app:iv_IndicatorColorEnd="#ffee5544"
  10. app:iv_IndicatorColorGradient="true"
  11. app:iv_IndicatorColorStart="#ff3388ff"
  12. app:iv_IndicatorEven="false"
  13. app:iv_IndicatorLengthExtra="3dp"
  14. app:iv_IndicatorTextArray="@array/text_arrays_2"
  15. app:iv_IndicatorTextGap="20dp"
  16. app:iv_IndicatorTextSize="20dp"/>

2.对于SimpleIndicatorView,xml中这样声明:

  1. <cn.carbs.android.indicatorview.library.SimpleIndicatorView
  2. android:id="@+id/simple_indicator_view_v"
  3. android:layout_width="4dp"
  4. android:layout_height="match_parent"
  5. android:layout_alignParentLeft="true"
  6. app:iv_SimpleIndicatorColorEnd="#ffee5544"
  7. app:iv_SimpleIndicatorColorGradient="true"
  8. app:iv_SimpleIndicatorColorStart="#ff3388ff"
  9. app:iv_SimpleIndicatorCount="4"
  10. app:iv_SimpleIndicatorLinePosition="start"
  11. app:iv_SimpleIndicatorOrientation="vertical"
  12. app:iv_SimpleIndicatorWidthRation="0.8"/>

各个属性作用,见说明末尾。

java文件中的控制:

如果想和ViewPager联动,那么Java代码只有一句:

  1. mIndicatorView.setViewPager(mViewpager);

如果想主动改变其显示的索引值,可通过多种方式:

  1. //使IndicatorView当前指示的索引值加1
  2. mIndicatorView.increaseSelectedIndexWithViewPager();
  3. //使IndicatorView当前指示的索引值减1
  4. mIndicatorView.decreaseSelectedIndexWithViewPager();
  5. //使IndicatorView指向任意的索引值
  6. mIndicatorView.setIndexWithViewPager(int indexDest);

IndicatorView状态改变后的回调函数:

  1. mIndicatorView.setOnIndicatorChangedListener(new IndicatorView.OnIndicatorChangedListener() {
  2. @Override
  3. public void onIndicatorChanged(int oldSelectedIndex, int newSelectedIndex) {
  4. //如果已经和ViewPager关联了,那么不要在此处改变ViewPager的状态
  5. }
  6. });

注意事项

  1. IndicatorLengthExtra属性请暂时使用大于等于0的dimension值,因为我暂时没有对负值做限制,如果负值过小,可能显示会有问题;
  2. 不支持在Java代码中生成此view;
  3. IndicatorView只能水平方向显示,而SimpleIndicatorView可以竖直方向显示。
  4. IndicatorView能与ViewPager联动,而SimpleIndicatorView不能。

属性说明

IndicatorView的相关属性

  1. <declare-styleable name="IndicatorView">
  2. <attr name="iv_IndicatorEven" format="reference|boolean" /> //每个单元是否是等宽的
  3. <attr name="iv_IndicatorColor" format="reference|color" /> //indicator的颜色
  4. <attr name="iv_IndicatorColorStart" format="reference|color" /> //indicator的起始颜色,indicator的颜色随着滑动而进行改变,iv_IndicatorColorGradient属性开启后有效
  5. <attr name="iv_IndicatorColorEnd" format="reference|color" /> //indicator的终止颜色,iv_IndicatorColorGradient属性开启后有效
  6. <attr name="iv_IndicatorColorGradient" format="reference|boolean" />//是否允许indicator随着滑动而改变颜色
  7. <attr name="iv_IndicatorTextGap" format="reference|dimension" /> //每个text之间的间距,在单元非等宽的条件下有效(iv_IndicatorEven="false")
  8. <attr name="iv_IndicatorTextArray" format="reference" />//显示的tab标题
  9. <attr name="iv_IndicatorTextSize" format="reference|dimension" />//显示的tab标题的文字大小
  10. <attr name="iv_IndicatorTextColorNormal" format="reference|color" />//显示的tab标题的非选中状态文字颜色(iv_IndicatorColorGradient="false"条件下有效)
  11. <attr name="iv_IndicatorTextColorSelected" format="reference|color" />//显示的tab标题的选中状态文字颜色(iv_IndicatorColorGradient="false"条件下有效)
  12. <attr name="iv_IndicatorLengthExtra" format="reference|dimension" />//indicator长于每个tab标题的长度的一半
  13. <attr name="iv_IndicatorDuration" format="reference|integer" />//indicator切换时的动画持续时间
  14. <attr name="iv_IndicatorSelectedIndex" format="reference|integer" />//默认的选中索引
  15. <attr name="iv_IndicatorHeight" format="reference|dimension" />//indicator的高度
  16. <attr name="iv_IndicatorBgTouchedColor" format="reference|color" />//按下某个tab标题时的背景颜色
  17. <attr name="iv_IndicatorViewPagerAnim" format="reference|boolean" />//按下tab后,与之联动的ViewPager是否需要有动画效果,默认true
  18. </declare-styleable>

SimpleIndicatorView的相关属性

  1. <declare-styleable name="SimpleIndicatorView">
  2. <attr name="iv_SimpleIndicatorColor" format="reference|color" />//indicator的颜色
  3. <attr name="iv_SimpleIndicatorColorStart" format="reference|color" />//indicator的起始颜色,indicator的颜色随着滑动而进行改变,iv_IndicatorColorGradient属性开启后有效
  4. <attr name="iv_SimpleIndicatorColorEnd" format="reference|color" />//indicator的终止颜色,iv_IndicatorColorGradient属性开启后有效
  5. <attr name="iv_SimpleIndicatorColorGradient" format="reference|boolean" />//是否允许indicator随着滑动而改变颜色
  6. <attr name="iv_SimpleIndicatorCount" format="reference|integer" />//一共包含的单元数目
  7. <attr name="iv_SimpleIndicatorWidthRation" format="reference|float" />//indicator宽度与均分的单元的宽度比值
  8. <attr name="iv_SimpleIndicatorDuration" format="reference|integer" />//indicator切换时的动画持续时间
  9. <attr name="iv_SimpleIndicatorDefaultIndex" format="reference|integer" />//默认的选中索引
  10. <attr name="iv_SimpleIndicatorLineColor" format="reference|color" />//底部的线条的颜色
  11. <attr name="iv_SimpleIndicatorLineShow" format="reference|boolean" />//底部线条是否显示
  12. <attr name="iv_SimpleIndicatorLineThickness" format="reference|dimension" />//底部线条的高度
  13. <attr name="iv_SimpleIndicatorOrientation" format="enum">//indicator水平显示还是竖直显示
  14. <enum name="horizontal" value="0" />
  15. <enum name="vertical" value="1" />
  16. </attr>
  17. <attr name="iv_SimpleIndicatorLinePosition" format="enum">//底部线条的位置:水平方向,可以在顶部,可以在底部。竖直方向,可以在左侧,可以在右侧。
  18. <enum name="start" value="0" />
  19. <enum name="end" value="1" />
  20. </attr>
  21. </declare-styleable>

项目地址

Github

TODO

添加“点击item后,自动调整到合适位置,可显示超过一屏的tab”的功能

[原创]Android自定义View之IndicatorView,显示当前tab页所处位置的View的更多相关文章

  1. [原创]android自定义动画的一点感悟

    android提供了一系列的动画处理api,包括animator以及animation等.由于动画效果是根据人眼视觉残留原理形成的,因此动画过程中android需要不断频繁的更新view的相关属性,由 ...

  2. android 使用Tabhost 发生could not create tab content because could not find view with id 错误

    使用Tabhost的时候经常报:could not create tab content because could not find view with id 错误. 总结一下发生错误的原因,一般的 ...

  3. Android自定义组件系列【1】——自定义View及ViewGroup

    View类是ViewGroup的父类,ViewGroup具有View的所有特性,ViewGroup主要用来充当View的容器,将其中的View作为自己孩子,并对其进行管理,当然孩子也可以是ViewGr ...

  4. 【转】ANDROID自定义视图——onLayout源码 流程 思路详解

    转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...

  5. [翻译] MCProgressView 使用自定义图片做进度显示

    MCProgressView 使用自定义图片做进度显示 https://github.com/Baglan/MCProgressView Progress bar view with custom i ...

  6. Android 自定义 View 圆形进度条总结

    Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...

  7. 我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)

    今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...

  8. 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  9. android自定义View绘制天气温度曲线

    原文:android自定义View绘制天气温度曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012942410/article/detail ...

随机推荐

  1. C++类库介绍

    如果你有一定的C基础可能学起来比较容易些,但是学习C++的过程中又要尽量避免去使用一些C中的思想:平时还要多看一些高手写的代码,遇到问题多多思考,怎样才能把问题抽象化,以使自己头脑中有类的概念:最后别 ...

  2. APUE1

    [APUE]进程控制(上)   一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是in ...

  3. MERGE 用法

    1.不带输出的SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[InsertShiGongJiao] ), @com ...

  4. SQL Server转发记录指针的坏味道

    什么是转发记录指针? 转发记录指针是堆表中特有的数据存储机制. 当你修改了某个数据页中的一行时,如果该行所在的数据页已经无法存放其修改后的行, SQL Server会把这行数据移动到一个新的数据页上面 ...

  5. php后台开发(二)Laravel框架

    php后台开发(二)Laravel框架 为了提高后台的开发效率,往往需要选择一套适合自己的开发框架,因此,选择了功能比较完善的Laravel框架,仔细学来,感觉和Python语言的框架Django非常 ...

  6. [WinAPI] API 10 [创建、打开、读写文件,获取文件大小]

    在Windows系统中,创建和打开文件都是使用API函数CreateFile,CreateFile通过指定不同的参数来表示是新建一个文件,打开已经存在的文件,还是重新建立文件等.读写文件最为直接的方式 ...

  7. Entity Framework后台采用分页方式取数据与AspNetPager控件的使用

    本文是一个对AspNetPager控件使用的笔记! 有关AspNetPager控件可以查看杨涛主页.这是一个开放的自定义ASP.NET控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大, ...

  8. HighCharts之2D柱状图

    1.HighCharts之2D柱状图源码 column.html: <!DOCTYPE html> <html> <head> <meta charset=& ...

  9. 理解Javascript的异步等待

    目前async / await特性并没有被添加到ES2016标准中,但不代表这些特性将来不会被加入到Javascript中.在我写这篇文章时,它已经到达第三版草案,并且正迅速的发展中.这些特性已经被I ...

  10. [2]. jekyll安装与应用

    一.ruby安装 这里在win下安装ruby,对应自己电脑的操作系统位数,如我的是64位,对应下载Ruby 2.0.0-p353 (x64)这个版本的ruby.然后安装过程就很简单了: 命令行下输入r ...