Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高(3)

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<String> 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 = COUNT_DEFAULT_TAB;
  a.recycle();

// 初始化画笔
  mPaint = new Paint();
  mPaint.setAntiAlias(true);
  mPaint.setColor(Color.parseColor("#ffffffff"));
  mPaint.setStyle(Style.FILL);
  mPaint.setPathEffect(new CornerPathEffect(3));

}

看起来成员变量挺多的,其实主要就几类: 

最前面的6个都是和绘制那个三角形相关的,画笔决定了三角形的样式(颜色等),Path用于构造这个三角形(其实就是3条线的封闭合),然后就是三角形的宽度什么的。

接下来的两个:都带Translation,肯定是和三角形的位置相关的了~

剩下的就是Tab内容、数量神马的~~

看看我们构造方法里面:获得了自定义属性,即可见的Tab的数量,初始化了我们的画笔,这里设置了setPathEffect,就是为了画的线的连接处,有点圆角~~

3、onFinishInflate和onSizeChanged

我们的一些初始化工作,会在这两个方法里面做~~尺寸相关的,会在onSizeChanged回调里面进行设置~

/**
  * 设置布局中view的一些必要属性;如果设置了setTabTitles,布局中view则无效
  */
 @Override
 protected void onFinishInflate()
 {
  Log.e("TAG", "onFinishInflate");
  super.onFinishInflate();

int cCount = getChildCount();

if (cCount == 0)
   return;

for (int i = 0; i < cCount; i++)
  {
   View view = getChildAt(i);
   LinearLayout.LayoutParams lp = (LayoutParams) view
     .getLayoutParams();
   lp.weight = 0;
   lp.width = getScreenWidth() / mTabVisibleCount;
   view.setLayoutParams(lp);
  }
  // 设置点击事件
  setItemClickEvent();

}

这个其实是获取在布局文件中直接写好Tab的~~如果你在这写好了,就不需要去调用mIndicator.setTabItemTitles(mDatas);了~~ 

大家可以下载文末的代码后,把mIndicator.setTabItemTitles(mDatas);这行代码注释进行测试~~不过注意下定义的Tab和ViewPager的页面数量最好一致。

代码很简单,就是获取ChildView,然后显示的重置一个宽度为getScreenWidth() / mTabVisibleCount;接下来设置一下点击事件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/222f759a6ae386cedcb36c8bdc618a39.html