最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
android实现ViewPager的Indicator的实例代码
时间:2017-03-15 编辑:简简单单 来源:一聚教程网
虽然在android5.0中design中有了TabLayout来实现ViewPager的Indicator,简单好用。但这个是我自己实现的,学习了很多,记录在这里。效果图:
第一步
新建一个类继承LinearLayout,用来绘制指示器,及提供Viewpager滑动时重绘指示器的方法:
代码如下 | 复制代码 |
publicclassViewPagerIndicatorextendsLinearLayout{
//画笔 privatePaint mPaint; //用来画一条线 privatePath mPath; //绘制线的宽度 privateintmLineWidth; //线的初始位置 privateintmInitTranslationX; //移动位置 privateintmTranslationX; //子控件 privateView mChildView;
publicViewPagerIndicator(Context context) { super(context,null); }
publicViewPagerIndicator(Context context, AttributeSet attrs) {
super(context, attrs); mPaint =newPaint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.parseColor("#ffba00")); mPaint.setStrokeWidth(3); mPaint.setStyle(Paint.Style.STROKE); }
//完成布局后获取子控件 @Override protectedvoidonFinishInflate() { super.onFinishInflate(); mChildView = getChildAt(0); } //在onSizeChanged中获取宽和初始位置,并根据位置初始化线 @Override protectedvoidonSizeChanged(intw,inth,intoldw,intoldh) { super.onSizeChanged(w, h, oldw, oldh); mTranslationX =0; mLineWidth = mChildView.getMeasuredWidth(); mInitTranslationX = (w/getChildCount()-mLineWidth)/2;
initLine(); } //初始化线 privatevoidinitLine(){ mPath =newPath(); mPath.moveTo(0,0); mPath.lineTo(mLineWidth,0);
} //绘制线 @Override protectedvoiddispatchDraw(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传值 publicvoidscroll(intposition ,floatoffset){ inttabWidth = getWidth()/getChildCount(); mTranslationX =(int) (tabWidth * offset +tabWidth * position); //请求重绘,调用dispatchDraw方法 invalidate(); } } |
第二步
在布局中使用该类:
代码如下 | 复制代码 |
layout\orderpicking 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"> 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"/> 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" /> 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"/> android:id="@+id/orderpicking_date" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@color/white"> |
第三步
代码如下 | 复制代码 |
在activity中完成ViewPagerIndicator与Viewpager的关联 publicclassOrderPickingActivityextendsFragmentActivityimplementsView.OnClickListener { TextView forPicking; TextView hasBeenPicking; TextView hasBeenPicking; ViewPagerIndicator mIndicator; ViewPager orderPickingDate; privateList privateFragmentPagerAdapter orderPickingAdapter; privateViewPager.OnPageChangeListener onPageChangeListener; //当前选中的indicator privateTextView currentItem;
protectedvoidonCreate(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")); } privatevoidinit(){ 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 =newArrayList<>(); OrderPickingFragmentForPicking orderPickingFragmentForPicking = newOrderPickingFragmentForPicking(); OrderPickingFragmentHasBeenPicking orderPickingFragmentHasBeenPicking = newOrderPickingFragmentHasBeenPicking(); OrderPickingFragmentAll orderPickingFragmentAll = newOrderPickingFragmentAll(); mFragmentList.add(orderPickingFragmentForPicking); mFragmentList.add(orderPickingFragmentHasBeenPicking); mFragmentList.add(orderPickingFragmentAll); //设置viewpager的适配器; orderPickingAdapter =newFragmentPagerAdapter(getSupportFragmentManager()) { @Override publicintgetCount() { returnmFragmentList.size(); } @Override publicFragment getItem(inti) { returnmFragmentList.get(i); } }; //设置ViewPager监听事件 onPageChangeListener =newViewPager.OnPageChangeListener(){ //滑动时,indicator下面的横线跟着滑动 @Override publicvoidonPageScrolled(inti,floatv,inti1) { mIndicator.scroll(i, v); } //选中监听,改变indicator文字颜色 @Override publicvoidonPageSelected(inti) { switch(i) { case0: if(currentItem == forPicking) return; forPicking.setTextColor(Color.parseColor("#ffba00")); currentItem.setTextColor(Color.parseColor("#646464")); currentItem = forPicking; break; case1: if(currentItem == hasBeenPicking) return; hasBeenPicking.setTextColor(Color.parseColor("#ffba00")); currentItem.setTextColor(Color.parseColor("#646464")); currentItem = hasBeenPicking; break; case2: if(currentItem == all) return; all.setTextColor(Color.parseColor("#ffba00")); currentItem.setTextColor(Color.parseColor("#646464")); currentItem = all; } } @Override publicvoidonPageScrollStateChanged(inti) {} }); } @Override publicvoidonClick(View v) { switch(v.getId()) { caseR.id.for_picking: orderPickingDate.setCurrentItem(0); break; caseR.id.has_been_picking: orderPickingDate.setCurrentItem(1); break; caseR.id.all: orderPickingDate.setCurrentItem(2); break; default: break; } } |
这就完成了。
-
上一个: 钉钉红包怎么提现 钉钉APP红包提取教程
相关文章
- Android编程之交互对话框实例浅析 06-26
- android判断设备是否有相机的实例代码 06-14
- Android清空编辑框内容功能的实现实例代码 06-12
- android ViewPager实现滑动翻页效果实例代码 06-10
- Android 广播监听网络状态详解及实例代码 05-03
- Android ToolBar整合实例使用方法详解 04-11