这篇算是自定义viewgroup的第一篇文章javascript
ViewPager有一个功能是添加标签,也就是PagerTitleStrip
.先来看一下官方文档:java
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.support.v4.view.PagerTitleStrip复制代码
PagerTitleStrip
是ViewPager的当前页面,下一个页面和前一页面的非交互式指示器。它在XML布局中做为ViewPager的子视图。Android:layout_gravity设置为TOP或BOTTOM,能够将标签固定到ViewPager的顶部或底部。 每一个页面的标题由提供给ViewPager的adapter中的getPageTitle(int)方法提供。android
PagerTabStrip
是PagerTitleStrip
的一个子类,它能够为用户提供交互式的体验。布局
返回一个int类型的值,表示两个title之间所需的距离,用像素做为单位.
在未设置setTextSpacing方法时,它会生成一个自动的值来平均分配三个标签,让每一个当前显示的标签的前一个和后一个都彻底显示在屏幕内.this
设置标签以前的间隔距离,此处应传入一个int值,单位为像素.
此方法对应getTextSpading方法.spa
Note:当你设置的数值小于当前自适应的数值时,将会忽略你设置的数值而采用显示三个彻底的标签.code
设置标签当中的文字在标签栏的位置,这个只能使用Gravity中的垂直方向的方法.orm
设置非当前显示的标签页的透明度.
传入的值是一个float类型,取值范围是0-1.cdn
PagerTabStrip是PagerTitleStrip的一个子类.xml
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.support.v4.view.PagerTitleStrip
↳ android.support.v4.view.PagerTabStrip复制代码
它的用法和PagerTitleStrip基本一致,只是它能够和用户产生交互,当你点击标签的前一页或者后一页时,能够跳到对应的页面.
前边方法返回后边方法的设置值.为设置的状况下默认返回true,会绘制这个下划线.
设置当前显示标签的指示器的颜色,是一个16进制数字.这个颜色UnderLine时一个颜色.
设置整个标签的背景颜色.
看一下结果:
这些方法都相对简单,可是官方提供的都只是入门的方法,如今咱们须要为它定制实现两个最简单那的功能:
这两个功能并无改变PagerTabStrip的结构,只是增长了一些特殊的设定.那咱们能够继续使用原来的一些属性,增长本身设置的属性来达到实现上述两个要求.
首先要分析PagerTitleStrip的结构.
一个PagerTitleStrip的显示部分被平均分为三个部分(不设置textspace的状况下),第一个指示前一页的页面(假如当前页时第一页,则显示为空),中间的一个指示当前页面(当前页面始终处在这个位置),最后一个显示为下一个页面(若没有下一个页面的时候则显示为空).
实际上咱们须要的是改变当前的标签的设置,而不须要改变其余,那么咱们就能够自定义一个类继承自PagerTabStrip,目的时增长交互效果,而后设置两个属性:currentColor
和currentSize
,就基本完成了咱们的项目.
在values文件下新增自定义属性,让用户能够经过xml布局文件来控制新的属性:
<declare-styleable name="TabView">
<attr name="currentColor" format="color|reference" />
<attr name="currentSize" format="dimension|reference" />
</declare-styleable>复制代码
currentColor表明当前标签文本的高亮颜色,currentSize表明当标签文字显示的大小.
新建自定义类TabView继承自PagerTabStript,继承构造方法.
public TabView(Context context) {
super(context);
init(context, null);
}
public TabView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}复制代码
而后获取自定义属性的值:
private void init(Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TabView);
currentTabSize = ta.getDimension(R.styleable.TabView_currentSize, 20);
currentTabColor = ta.getColor(R.styleable.TabView_currentColor, Color.RED);
ta.recycle();
}复制代码
最后别忘记回收ta.
经过前边的分析,我么能够知道,由于当前选中的标签始终处于中间一个,咱们首先获取这个控件中的第二个textview,也就是position=1的位置.而后将咱们的值赋给获取的textView.
private void setCurrentTab() {
viewPager = (ViewPager) getParent();
Log.d("tag", "currentIndex" + viewPager.getCurrentItem());
currentTab = (TextView) getChildAt(1);
currentTab.setTextSize(currentTabSize);
currentTab.setTextColor(currentTabColor);
}复制代码
更多的时候咱们既想能从XML布局文件设置,又想能在java代码中设置属性,咱们就能够暴露出这两个接口.
public void setCurrentTabColor(int currentTabColor) {
this.currentTabColor = currentTabColor;
}
public void setCurrentTabSize(float size) {
this.currentTabSize = size;
}复制代码
代码中的属性会覆盖XML布局文件中的属性.
下面看一下效果: