Android自定义ViewPager指示器
程序员文章站
2024-03-02 13:35:28
本文实例为大家分享了android viewpager指示器的制作方法,供大家参考,具体内容如下
1.概述
viewpageindicator这个开源框架大家都接触...
本文实例为大家分享了android viewpager指示器的制作方法,供大家参考,具体内容如下
1.概述
viewpageindicator这个开源框架大家都接触过,个人感觉还不错就是用起来比较麻烦,需要这里配置那里配置效果定制起来也不方便。我第一次使用的时候就一直出不来效果,后来找了很久发现是activity的主题没有配置好。今天我们自己来造个*实现一把,其中用到了adapter模式,如果不清楚这个模式的请看我的android源码设计模式分析:,下面看一下效果:
2.实现
1).实现基本效果自定义horizontalscrollview extends horizontalscrollview,设置viewpager根据个数不断遍历添加子view。
public class viewpagerindicator extends horizontalscrollview{ public viewpagerindicator(context context) { this(context, null); } public viewpagerindicator(context context, attributeset attrs) { this(context, attrs, 0); } public viewpagerindicator(context context, attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); this.mcontext = context; } @override public void setviewpager(viewpager viewpager) { if (viewpager == null) { throw new nullpointerexception("viewpager is null..."); } this.mviewpager = viewpager; int count = mviewpager.getadapter().getcount(); mcontaniergroup.removeallviews(); // 循环添加tabview(textview) for (int i = 0; i < count; i++) { final textview itemtv = new textview(mcontext); itemtv.settext(this.mviewpager.getadapter().getpagetitle(i)); setitemclickevent(itemtv, i); mcontaniergroup.addtabview(itemtv); setitemclickevent(itemtv, i); mcontaniergroup.addtabview(itemtv); } setitemparams(); madapter.highlighttabview(mcontaniergroup.gettabview(mcureentitem)); this.mviewpager.setonpagechangelistener(this); } private void setitemparams() { if (mvisibletabcount != 0) { final int childcount = mviewpager.getadapter().getcount(); mrunnable = new runnable() { @override public void run() { int tabwidth = getwidth() / mvisibletabcount; // 循环遍历设置tab宽度 for (int index = 0; index < childcount; index++) { linearlayout.layoutparams params = (linearlayout.layoutparams) mcontaniergroup .gettabview(index).getlayoutparams(); params.width = tabwidth; } // 设置宽度,高度,和角标指示器 mcontaniergroup.settabwidth(tabwidth); mcontaniergroup.getcontainer().getlayoutparams().height = getheight(); mcontaniergroup.setindicatorview(madapter.getindexview()); mrunnable = null; } }; post(mrunnable); } } }
2).设置viewpager的滚动监听,使viewpager和tabview一起联动
@override public void onpagescrollstatechanged(int position) { if (position == 0) { // 设置为不是点击 misclick = false; } if (mpagechangelistener != null) mpagechangelistener.onpagescrollstatechanged(position); } @override public void onpagescrolled(int position, float offset, int arg2) { scroll(position, offset); if (mpagechangelistener != null) mpagechangelistener.onpagescrolled(position, offset, arg2); } @override public void onpageselected(int position) { mcureentitem = position; if (mpagechangelistener != null) mpagechangelistener.onpageselected(position); } /** * 指示器跟随手指进行滚动 */ public void scroll(int position, float offset) { int tabwidth = mcontaniergroup.gettabview(0).getwidth(); // 让选中tab的一直在最中间 int total = (int) ((position + offset) * tabwidth); int green = (getwidth() - tabwidth) / 2; // 滚动的距离 int scroll = total - green; if (!misclick) { this.scrollto(scroll, 0); mcontaniergroup.scrollindicator(position, offset); } }
3).最后我们采用适配器adapter模式,完成高亮和下标指示器。
public abstract class indicatoradapter<t extends view> { /** * 获取tab view */ public abstract t gettabview(int position); /** * 获取角标view */ public view getindexview() { return null; } /** * 高亮当前tab */ public void highlighttabview(t tabview) { } /** * 恢复当前tab */ public void restoretabview(t tabview) { } }
4).最后我们来看在activity中怎么使用,在indicatoradapter有四个方法,我们只需要实现一个方法,其余三个方法如果不使用可以不复写。以adapter的形式暴露出来,那么用户可以自己去实现而不必受局限。
mindicator.setadapter(mviewpager, new indicatoradapter<textview>() { @override public textview gettabview(int position) { textview tabview = new textview(getbasecontext()); tabview.settextcolor(color.white); tabview.settext(mtitles.get(position)); tabview.setpadding(20, 20, 20, 20); tabview.setgravity(gravity.center); return tabview; } @override public view getindexview() { imageview view = new imageview(getbasecontext()); view.setimageresource(r.drawable.corners_login_nomral); view.setpadding(25, 0, 25, 0); relativelayout.layoutparams params = new relativelayout.layoutparams( layoutparams.wrap_content, 6); view.setlayoutparams(params); return view; } @override public void highlighttabview(textview tabview) { final textview itemview = (textview) tabview; itemview.settextcolor(color.red); } @override public void restoretabview(textview tabview) { final textview itemview = (textview) tabview; itemview.settextcolor(color.white); } });
不需配置的viewpagerindicator 的源码下载:http://xiazai.jb51.net/201611/yuanma/androidviewpager(jb51.net).rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读