[原创]Android自定义View之IndicatorView,显示当前tab页所处位置的View
概述
Android IndicatorView的灵感来源于SlidingTabView,虽然有句“不重复”造轮子在先,本着练手的目的,还是写了一个功能较为简单的类似view。
其比SlidingTabView在功能上欠缺的一点是:暂时没有添加“当内容显示不开时自动向左右滑动”的功能。
应用场景
可以胜任一屏显示所有tab标题的情况。
效果图
所有效果如上图所示
功能
- 均等Indicator显示;
- 不均等Indicator显示,根据tab标题的字宽度自动适配;
- Indicator可以添加indicator两端相对多增加的长度;
- 可以设置颜色渐变,一般可用来做tab切换,增加美感;
- 文字也可以随Indicator的颜色变化而变化,具有渐变效果;
- SimpleIndicatorView可以设置indicator的宽度相对每个等长单元的宽度比值;
- SimpleIndicatorView可以设置滑动方向,即水平方向或者竖直方向,同时可以设置底部线条的位置;
- 可与ViewPager联动;
- 可首尾循环;
- 支持padding,支持自定义点击效果等;
- 可一同设置文字;
- java代码控制非常简单,如果和ViewPager联动,那么只需要一行代码。
加入项目
compile 'cn.carbs.android:IndicatorView:1.0.1'
使用方法
xml布局文件中声明:
SimpleIndicatorView和IndicatorView采用了两种不同的属性,原因是两者差距稍大,索性采用两套属性。由于属性较多,因此xml中的声明稍微复杂。之所以写了两个view,是因为竖直方向显示时,一般没有文字描述,另外SimpleIndicatorView较为轻量化,便于降低耦合。
1.对于IndicatorView,xml中这样声明:
<cn.carbs.android.indicatorview.library.IndicatorView
android:id="@+id/indicator_view"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginTop="20dp"
android:background="#ffeeeeee"
android:paddingLeft="2dp"
android:paddingRight="2dp"
app:iv_IndicatorColorEnd="#ffee5544"
app:iv_IndicatorColorGradient="true"
app:iv_IndicatorColorStart="#ff3388ff"
app:iv_IndicatorEven="false"
app:iv_IndicatorLengthExtra="3dp"
app:iv_IndicatorTextArray="@array/text_arrays_2"
app:iv_IndicatorTextGap="20dp"
app:iv_IndicatorTextSize="20dp"/>
2.对于SimpleIndicatorView,xml中这样声明:
<cn.carbs.android.indicatorview.library.SimpleIndicatorView
android:id="@+id/simple_indicator_view_v"
android:layout_width="4dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
app:iv_SimpleIndicatorColorEnd="#ffee5544"
app:iv_SimpleIndicatorColorGradient="true"
app:iv_SimpleIndicatorColorStart="#ff3388ff"
app:iv_SimpleIndicatorCount="4"
app:iv_SimpleIndicatorLinePosition="start"
app:iv_SimpleIndicatorOrientation="vertical"
app:iv_SimpleIndicatorWidthRation="0.8"/>
各个属性作用,见说明末尾。
java文件中的控制:
如果想和ViewPager联动,那么Java代码只有一句:
mIndicatorView.setViewPager(mViewpager);
如果想主动改变其显示的索引值,可通过多种方式:
//使IndicatorView当前指示的索引值加1
mIndicatorView.increaseSelectedIndexWithViewPager();
//使IndicatorView当前指示的索引值减1
mIndicatorView.decreaseSelectedIndexWithViewPager();
//使IndicatorView指向任意的索引值
mIndicatorView.setIndexWithViewPager(int indexDest);
IndicatorView状态改变后的回调函数:
mIndicatorView.setOnIndicatorChangedListener(new IndicatorView.OnIndicatorChangedListener() {
@Override
public void onIndicatorChanged(int oldSelectedIndex, int newSelectedIndex) {
//如果已经和ViewPager关联了,那么不要在此处改变ViewPager的状态
}
});
注意事项
- IndicatorLengthExtra属性请暂时使用大于等于0的dimension值,因为我暂时没有对负值做限制,如果负值过小,可能显示会有问题;
- 不支持在Java代码中生成此view;
- IndicatorView只能水平方向显示,而SimpleIndicatorView可以竖直方向显示。
- IndicatorView能与ViewPager联动,而SimpleIndicatorView不能。
属性说明
IndicatorView的相关属性
<declare-styleable name="IndicatorView">
<attr name="iv_IndicatorEven" format="reference|boolean" /> //每个单元是否是等宽的
<attr name="iv_IndicatorColor" format="reference|color" /> //indicator的颜色
<attr name="iv_IndicatorColorStart" format="reference|color" /> //indicator的起始颜色,indicator的颜色随着滑动而进行改变,iv_IndicatorColorGradient属性开启后有效
<attr name="iv_IndicatorColorEnd" format="reference|color" /> //indicator的终止颜色,iv_IndicatorColorGradient属性开启后有效
<attr name="iv_IndicatorColorGradient" format="reference|boolean" />//是否允许indicator随着滑动而改变颜色
<attr name="iv_IndicatorTextGap" format="reference|dimension" /> //每个text之间的间距,在单元非等宽的条件下有效(iv_IndicatorEven="false")
<attr name="iv_IndicatorTextArray" format="reference" />//显示的tab标题
<attr name="iv_IndicatorTextSize" format="reference|dimension" />//显示的tab标题的文字大小
<attr name="iv_IndicatorTextColorNormal" format="reference|color" />//显示的tab标题的非选中状态文字颜色(iv_IndicatorColorGradient="false"条件下有效)
<attr name="iv_IndicatorTextColorSelected" format="reference|color" />//显示的tab标题的选中状态文字颜色(iv_IndicatorColorGradient="false"条件下有效)
<attr name="iv_IndicatorLengthExtra" format="reference|dimension" />//indicator长于每个tab标题的长度的一半
<attr name="iv_IndicatorDuration" format="reference|integer" />//indicator切换时的动画持续时间
<attr name="iv_IndicatorSelectedIndex" format="reference|integer" />//默认的选中索引
<attr name="iv_IndicatorHeight" format="reference|dimension" />//indicator的高度
<attr name="iv_IndicatorBgTouchedColor" format="reference|color" />//按下某个tab标题时的背景颜色
<attr name="iv_IndicatorViewPagerAnim" format="reference|boolean" />//按下tab后,与之联动的ViewPager是否需要有动画效果,默认true
</declare-styleable>
SimpleIndicatorView的相关属性
<declare-styleable name="SimpleIndicatorView">
<attr name="iv_SimpleIndicatorColor" format="reference|color" />//indicator的颜色
<attr name="iv_SimpleIndicatorColorStart" format="reference|color" />//indicator的起始颜色,indicator的颜色随着滑动而进行改变,iv_IndicatorColorGradient属性开启后有效
<attr name="iv_SimpleIndicatorColorEnd" format="reference|color" />//indicator的终止颜色,iv_IndicatorColorGradient属性开启后有效
<attr name="iv_SimpleIndicatorColorGradient" format="reference|boolean" />//是否允许indicator随着滑动而改变颜色
<attr name="iv_SimpleIndicatorCount" format="reference|integer" />//一共包含的单元数目
<attr name="iv_SimpleIndicatorWidthRation" format="reference|float" />//indicator宽度与均分的单元的宽度比值
<attr name="iv_SimpleIndicatorDuration" format="reference|integer" />//indicator切换时的动画持续时间
<attr name="iv_SimpleIndicatorDefaultIndex" format="reference|integer" />//默认的选中索引
<attr name="iv_SimpleIndicatorLineColor" format="reference|color" />//底部的线条的颜色
<attr name="iv_SimpleIndicatorLineShow" format="reference|boolean" />//底部线条是否显示
<attr name="iv_SimpleIndicatorLineThickness" format="reference|dimension" />//底部线条的高度
<attr name="iv_SimpleIndicatorOrientation" format="enum">//indicator水平显示还是竖直显示
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
<attr name="iv_SimpleIndicatorLinePosition" format="enum">//底部线条的位置:水平方向,可以在顶部,可以在底部。竖直方向,可以在左侧,可以在右侧。
<enum name="start" value="0" />
<enum name="end" value="1" />
</attr>
</declare-styleable>
项目地址
TODO
添加“点击item后,自动调整到合适位置,可显示超过一屏的tab”的功能
[原创]Android自定义View之IndicatorView,显示当前tab页所处位置的View的更多相关文章
- [原创]android自定义动画的一点感悟
android提供了一系列的动画处理api,包括animator以及animation等.由于动画效果是根据人眼视觉残留原理形成的,因此动画过程中android需要不断频繁的更新view的相关属性,由 ...
- 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 错误. 总结一下发生错误的原因,一般的 ...
- Android自定义组件系列【1】——自定义View及ViewGroup
View类是ViewGroup的父类,ViewGroup具有View的所有特性,ViewGroup主要用来充当View的容器,将其中的View作为自己孩子,并对其进行管理,当然孩子也可以是ViewGr ...
- 【转】ANDROID自定义视图——onLayout源码 流程 思路详解
转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...
- [翻译] MCProgressView 使用自定义图片做进度显示
MCProgressView 使用自定义图片做进度显示 https://github.com/Baglan/MCProgressView Progress bar view with custom i ...
- Android 自定义 View 圆形进度条总结
Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...
- 我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)
今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...
- 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能
前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...
- android自定义View绘制天气温度曲线
原文:android自定义View绘制天气温度曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012942410/article/detail ...
随机推荐
- cygwin下清屏的三种方法
1. 做一个clear脚本,放到/bin下去 $vim /bin/clear #!/bin/bash cmd /c cls 2. ctrl + L 3. 在cygwind中install ncurse ...
- 从RTSP协议SDP数据中获得二进制的SPS、PPS
在RTSP协议的交互过程中,第二步客户端发送DESCRIBE请求之后,服务端会返回SDP内容,该SDP内容中有关于媒体和会话的描述,本篇文章主要给出如何从SDP字符串中得到H264视频信息中的sps. ...
- SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)
开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...
- SQL Server 2012 列存储索引分析(翻译)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
- [外挂1] MFC 鼠标位置设置
a.取得窗口相对坐标 b.读出游戏窗口信息GetWindowRect c.移动鼠标指针SetCursorPos HWND gameh;//游戏窗口句柄 RECT r1;//RECT结构表示一个矩 ...
- Gradle的属性设置大全
Gradle作为一款项目构建工具,由于其强大.灵活.快速.完全兼容Ant等特性,越来越受到人们欢迎.Gradle的灵活有时候也会引起人们的困惑.比如在Gradle中设置变量和属性就有N种办法.由于Gr ...
- SpringMVC文件上传实现
SpringMVC(注解)上传文件需要注意的几个地方:1.form的enctype="multipart/form-data",这个是上传文件必须的2.applicationCon ...
- 通过实验窥探javascript的解析执行顺序
简介 javascript是一种解释型语言,它的执行是自上而下的.但是各浏览器对于[自上而下]的理解是有细微差别的,而代码的上下游也就是程序流对于程序正确运行又是至关重要的.所以我们有必要深入理解js ...
- ie下不显示图片
IE支持的图片是必须为RGB三原色的,保存图片时,必须“另存为web可用的格式...”
- java继承与多态-3个小题
1.(1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积.int getCircumference():获得图形的周长 (2)编写一个圆类Circl ...