自定义Indicator步骤,笔记

来源:互联网 发布:杭州淘宝培训机构 编辑:程序博客网 时间:2024/05/16 02:08

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,inth,intoldw,intoldh)只有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<cCount;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);    }


0 0