1.MyIndecator extends LinearLayout
2.构造方法:
1,假如有自定义属性则获取自定义属性
2,初始化画笔mPaint:
setStyle()
画笔样式分三种:
1.Paint.Style.STROKE:描边
2.Paint.Style.FILL_AND_STROKE:描边并填充
3.Paint.Style.FILL:填充
3.重写disPatchDraw(Canvas canvas),该方法为容器下的孩子绘制,onDraw()是为自己绘制
canvas.save();
canvas.translate(x,y) //移动要特定的位置开始绘制
canvas.drawPath(mPath,mPaint)//画图
canvas.restore(); 一定要加,不然会出现读取不了title的现象
4.重写onSizeChanged(intw,int h,int oldw,int oldh)只有View的大小发生变化才会调用
确定绘制的位置与指示器的宽度高度等
顺便调用initView();方法画出一个Indicator图形
5.initView();
初始化mPath,用moveTo(x,y),lineTo(x,y),close()方法画出一个指示器
6.重写onSroll(int position,float offset),其中offset为一个偏移百分比,取值在-1~0~1之间。
tabWidth=getWidth()/可以看到的tab的数量visibleCount;
tranlationX=tabWidth*position+tabWidth*offset;//计算出画板要移动的位置,没有算上指示器开始的偏移量
if(position>=(visibleCount-2)&&offset>0&&getChildCount()>visibleCount){
if(visibleCount!=1)
{
this.scrollTo((position - (visibleCount - 2)) * tabWidth + (int) (tabWidth * offset), 0);
}else
{
this.scrollTo(position*tabWidth+(int)(tabWidth*offset),0);
}
}
invalidate();
7.重写onFinishInflate()动态加载布局,在xml加载完成时回调方法
for(int i=0;iView view=getChildAt(i); LinearLayout.LayoutParams lp = (LayoutParams) view.getLayoutParams(); lp.width=getScreenWidth()/visibleCount; view.setLayoutParams(lp); }//根据可见的tab数量分配 子child 空间
setTabClickEvent();
8.写setTabClickEvent()方法令到点击tab时会跳转到tab对应的Fragment
循环为每个子View.setOnClickListener,设置view.setCurrentItem(i);
9.重写一个回调接口
public interface PageOnchangeListenr{ public void onPageScrolled(int i, float v, int i1); public void onPageSelected(int i); public void onPageScrollStateChanged(int i); }
public PageOnchangeListenr mListener;
public void addOnPageChangeListener(PageOnchangeListenr listenr){ this.mListener=listenr; }
//绑定mViewPager与实现接口回调 private ViewPager mViewPager; public void setViewPager(ViewPager viewPager,int pos){ mViewPager=viewPager; mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i2) { scroll(i,v); if(mListener!=null) mListener.onPageScrolled(i,v,i2); } @Override public void onPageSelected(int i) { if(mListener!=null) mListener.onPageSelected(i); } @Override public void onPageScrollStateChanged(int i) { if(mListener!=null) mListener.onPageScrollStateChanged(i); } }); mViewPager.setCurrentItem(pos); }