自定义Indicator步骤,笔记

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;i	View 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);
    }


你可能感兴趣的:(自定义Indicator步骤,笔记)