
虽然在androID5.0中design中有了TabLayout来实现VIEwPager的Indicator,简单好用。但这个是我自己实现的,学习了很多,记录在这里。效果图:
第一步
新建一个类继承linearLayout,用来绘制指示器,及提供VIEwpager滑动时重绘指示器的方法:
public class VIEwPagerIndicator extends linearLayout{ //画笔 private Paint mPaint; //用来画一条线 private Path mPath; //绘制线的宽度 private int mlinewidth; //线的初始位置 private int mInitTranslationX; //移动位置 private int mTranslationX; //子控件 private VIEw mChildVIEw; public VIEwPagerIndicator(Context context) { super(context,null); } public VIEwPagerIndicator(Context context,AttributeSet attrs) { super(context,attrs); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setcolor(color.parsecolor("#ffba00")); mPaint.setstrokeWIDth(3); mPaint.setStyle(Paint.Style.stroke); } //完成布局后获取子控件 @OverrIDe protected voID onFinishInflate() { super.onFinishInflate(); mChildVIEw = getChildAt(0); }//在onSizeChanged中获取宽和初始位置,并根据位置初始化线 @OverrIDe protected voID onSizeChanged(int w,int h,int olDW,int oldh) { super.onSizeChanged(w,h,olDW,oldh); mTranslationX = 0; mlinewidth = mChildVIEw.getMeasureDWIDth(); mInitTranslationX = (w/getChildCount()-mlinewidth)/2; initline(); }//初始化线 private voID initline(){ mPath = new Path(); mPath.moveto(0,0); mPath.lineto(mlinewidth,0); }//绘制线 @OverrIDe protected voID dispatchDraw(Canvas canvas) { canvas.save(); //移动到该坐标后开始绘制 canvas.translate(mInitTranslationX + mTranslationX,getHeight()); canvas.drawPath(mPath,mPaint); canvas.restore(); super.dispatchDraw(canvas); } ////在vIEwpager的onPageScrolled监听方法中调用此方法。vIEwPager滑动时mTranslationX的距离跟着变化,实现线的滑动,position,offset由onPageScrolled传值 public voID scroll(int position,float offset){ int tabWIDth = getWIDth()/getChildCount(); mTranslationX =(int) (tabWIDth * offset +tabWIDth * position); //请求重绘,调用dispatchDraw方法 invalIDate(); }}第二步
在布局中使用该类:
layout\orderpicking
<com.hlw.stock.customlayout.VIEwPagerIndicator androID:ID="@+ID/indicator" androID:layout_wIDth="match_parent" androID:layout_height="@dimen/xhdpi_40" androID:gravity="center" androID:background="@color/white" androID:orIEntation="horizontal"> <TextVIEw androID:ID="@+ID/for_picking" androID:layout_wIDth="@dimen/xhdpi_60" androID:layout_height="match_parent" androID:layout_marginRight="@dimen/xhdpi_60" androID:clickable="true" androID:gravity="center" androID:onClick="onClick" androID:text="待拣货" androID:textcolor="@color/light_black" androID:textSize="@dimen/xhdpi_14" /> <TextVIEw androID:ID="@+ID/has_been_picking" androID:layout_wIDth="@dimen/xhdpi_60" androID:layout_height="match_parent" androID:layout_marginRight="@dimen/xhdpi_60" androID:clickable="true" androID:gravity="center" androID:onClick="onClick" androID:text="已拣货" androID:textcolor="@color/light_black" androID:textSize="@dimen/xhdpi_14" /> <TextVIEw androID:ID="@+ID/all" androID:layout_wIDth="@dimen/xhdpi_60" androID:layout_height="match_parent" androID:clickable="true" androID:gravity="center" androID:onClick="onClick" androID:text="全部" androID:textcolor="@color/light_black" androID:textSize="@dimen/xhdpi_14" /> </com.hlw.stock.customlayout.VIEwPagerIndicator> <androID.support.v4.vIEw.VIEwPager androID:ID="@+ID/orderpicking_date" androID:layout_wIDth="match_parent" androID:layout_height="0dp" androID:layout_weight="1" androID:background="@color/white"></androID.support.v4.vIEw.VIEwPager>
第三步
在activity中完成VIEwPagerIndicator与VIEwpager的关联
public class OrderPickingActivity extends FragmentActivity implements VIEw.OnClickListener { TextVIEw forPicking; TextVIEw hasBeenPicking; TextVIEw hasBeenPicking; VIEwPagerIndicator mIndicator; VIEwPager orderPickingDate; private List<Fragment> mFragmentList; private FragmentPagerAdapter orderPickingAdapter; private VIEwPager.OnPagechangelistener onPagechangelistener; //当前选中的indicator private TextVIEw currentItem; protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestwindowFeature(Window.FEATURE_NO_Title); setContentVIEw(R.layout.orderpicking); init(); orderPickingDate.setAdapter(orderPickingAdapter); orderPickingDate.addOnPagechangelistener(); orderPickingDate.setCurrentItem(0); currentItem = forPicking; currentItem.setTextcolor(color.parsecolor("#ffba00")); } private voID init(){ forPicking = (TextVIEw) findVIEwByID(R.ID.for_picking); hasBeenPicking = (TextVIEw) findVIEwByID(R.ID.has_been_picking); all = (TextVIEw) findVIEwByID(R.ID.all); mIndicator=(VIEwPagerIndicator)findVIEwByID(R.ID.indicator); orderPickingDate = (VIEwPager)findVIEwByID(R.ID.orderpicking_date); //初始化vIEwpager的item,并添加到List中 mFragmentList = new ArrayList<>(); OrderPickingFragmentForPicking orderPickingFragmentForPicking = new OrderPickingFragmentForPicking(); OrderPickingFragmentHasBeenPicking orderPickingFragmentHasBeenPicking = new OrderPickingFragmentHasBeenPicking(); OrderPickingFragmentAll orderPickingFragmentAll = new OrderPickingFragmentAll(); mFragmentList.add(orderPickingFragmentForPicking); mFragmentList.add(orderPickingFragmentHasBeenPicking); mFragmentList.add(orderPickingFragmentAll); //设置vIEwpager的适配器; orderPickingAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @OverrIDe public int getCount() { return mFragmentList.size(); } @OverrIDe public Fragment getItem(int i) { return mFragmentList.get(i); } }; //设置VIEwPager监听事件 onPagechangelistener = new VIEwPager.OnPagechangelistener(){ //滑动时,indicator下面的横线跟着滑动 @OverrIDe public voID onPageScrolled(int i,float v,int i1) { mIndicator.scroll(i,v); } //选中监听,改变indicator文字颜色 @OverrIDe public voID onPageSelected(int i) { switch (i) { case 0: if (currentItem == forPicking) return; forPicking.setTextcolor(color.parsecolor("#ffba00")); currentItem.setTextcolor(color.parsecolor("#646464")); currentItem = forPicking; break; case 1: if (currentItem == hasBeenPicking) return; hasBeenPicking.setTextcolor(color.parsecolor("#ffba00")); currentItem.setTextcolor(color.parsecolor("#646464")); currentItem = hasBeenPicking; break; case 2: if (currentItem == all) return; all.setTextcolor(color.parsecolor("#ffba00")); currentItem.setTextcolor(color.parsecolor("#646464")); currentItem = all; } } @OverrIDe public voID onPageScrollStateChanged(int i) {} }); } @OverrIDe public voID onClick(VIEw v) { switch (v.getID()) { case R.ID.for_picking: orderPickingDate.setCurrentItem(0); break; case R.ID.has_been_picking: orderPickingDate.setCurrentItem(1); break; case R.ID.all: orderPickingDate.setCurrentItem(2); break; default: break; }}这就完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的android实现ViewPager的Indicator的实例代码全部内容,希望文章能够帮你解决android实现ViewPager的Indicator的实例代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)