on)
? ?{
? ? return mTabContents.get(position);
? ?}
? };
?}
?private void initView()
?{
? mViewPager = (ViewPager) findViewById(R.id.id_vp);
? mIndicator = (ViewPagerIndicator) findViewById(R.id.id_indicator);
?}
}
关于我们的ViewPagerIndicator的使用,就两行:
?
//设置Tab上的标题
mIndicator.setTabItemTitles(mDatas);
//设置关联的ViewPager
mIndicator.setViewPager(mViewPager,0);
其他代码都是初始化ViewPager神马的~~可见,我们的控件写好之后使用起来极其简单~~
好了,大家注意下,布局文件里面有个设置可见Tab个数的属性:zhy:item_count="3" ?;
比如:当item_count=3,而给的TabTitle的List的size也是3的话,就是效果图1的效果~~~
? ? ? ? ? ?当item_count=4,而给的TabTitle的List的size大于4的话,就是效果图2的效果~~~
其实,我们也支持直接在布局中书写我们的Tab,你完全可以不使用mIndicator.setTabItemTitles(mDatas);取而代之,你可以在布局中定义几个TextView,固定好文本,样式什么的~~其实别的控件我们也是支持的~~~
贴一下Fragment代码~
package com.example.demo_zhy_mms_miui;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class VpSimpleFragment extends Fragment
{
?public static final String BUNDLE_TITLE = "title";
?private String mTitle = "DefaultValue";
?@Override
?public View onCreateView(LayoutInflater inflater, ViewGroup container,
? ?Bundle savedInstanceState)
?{
? Bundle arguments = getArguments();
? if (arguments != null)
? {
? ?mTitle = arguments.getString(BUNDLE_TITLE);
? }
? TextView tv = new TextView(getActivity());
? tv.setText(mTitle);
? tv.setGravity(Gravity.CENTER);
? return tv;
?}
?public static VpSimpleFragment newInstance(String title)
?{
? Bundle bundle = new Bundle();
? bundle.putString(BUNDLE_TITLE, title);
? VpSimpleFragment fragment = new VpSimpleFragment();
? fragment.setArguments(bundle);
? return fragment;
?}
}
好了,看完使用方式,有木有一点小激动~~
其实可抽取为自定义的属性很多哈~这里我们就写了一个,就是tab的数量。你完全可以把指示器颜色,文本颜色神马可定制的属性全搞出来~~
我们的控件名称叫做:ViewPagerIndicator
所以我们在values/attr.xml中这么写:
? ?
? ?
? ? ? ?
? ?
定义好了,肯定得用,怎么用?在哪用?就不用说了吧。上面的用法已经贴过布局文件了~~记得自定义属性的命名空间要注意哈~~~?
首先看什么,肯定要有哪些成员变量,和构造里面做了些什么~
public class ViewPagerIndicator extends LinearLayout
{
?/**
? * 绘制三角形的画笔
? */
?private Paint mPaint;
?/**
? * path构成一个三角形
? */
?private Path mPath;
?/**
? * 三角形的宽度
? */
?private int mTriangleWidth;
?/**
? * 三角形的高度
? */
?private int mTriangleHeight;
?
?/**
? * 三角形的宽度为单个Tab的1/6
? */
?private static final float RADIO_TRIANGEL = 1.0f / 6;
?/**
? * 三角形的最大宽度
? */
?private final int DIMENSION_TRIANGEL_WIDTH = (int) (getScreenWidth() / 3 * RADIO_TRIANGEL);
?
?
?/**
? * 初始时,三角形指示器的偏移量
? */
?private int mInitTranslationX;
?/**
? * 手指滑动时的偏移量
? */
?private float mTranslationX;
?/**
? * 默认的Tab数量
? */
?private static final int COUNT_DEFAULT_TAB = 4;
?/**
? * tab数量
? */
?private int mTabVisibleCount = COUNT_DEFAULT_TAB;
?/**
? * tab上的内容
? */
?private List mTabTitles;
?/**
? * 与之绑定的ViewPager
? */
?public ViewPager mViewPager;
?
?/**
? * 标题正常时的颜色
? */
?private static final int COLOR_TEXT_NORMAL = 0x77FFFFFF;
?/**
? * 标题选中时的颜色
? */
?private static final int COLOR_TEXT_HIGHLIGHTCOLOR = 0xFFFFFFFF;
?public ViewPagerIndicator(Context context)
?{
? this(context, null);
?}
?public ViewPagerIndicator(Context context, AttributeSet attrs)
?{
? super(context, attrs);
? // 获得自定义属性,tab的数量
? TypedArray a = context.obtainStyledAttributes(attrs,
? ? R.styleable.ViewPagerIndicator);
? mTabVisibleCount = a.getInt(R.styleable.ViewPagerIndicator_item_count,
? ? COUNT_DEFAULT_TAB);
? if (mTabVisibleCount < 0)
? ?mTabVisibleCount