博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 中 viewpager 滑动的指示器
阅读量:5834 次
发布时间:2019-06-18

本文共 6037 字,大约阅读时间需要 20 分钟。

先看下效果图:

 

这个需要用到1个开源的 库,这个后面也会说下的。

 

工程目录:

 

1. MainActivity.java

  1. public class MainActivity extends FragmentActivity {  
  2.   
  3.     private ViewPagerFrameAdapter adapter;        //适配器(标题和内容)  
  4.     private ViewPager mPager;                             
  5.   
  6.     private TabPageIndicator         tabbPageIndicator;         //  
  7.     private UnderlinePageIndicatorEx underlinePageIndicator;  
  8.   
  9.     private  int COUNT = 0;  
  10.     private List<String>   titles = new ArrayList<String>(); //标题  
  11.       
  12.       
  13.     @Override  
  14.     protected void onCreate(Bundle bundle) {  
  15.              super.onCreate(bundle);  
  16.              requestWindowFeature(Window.FEATURE_NO_TITLE);   
  17.              setContentView(R.layout.activity_main);  
  18.                
  19.              //标题,这里自己造的假数据  
  20.              for (int j = 0; j < 3 ; j++){  
  21.                    titles.add( "第"+ j +"标签卡");  
  22.               }  
  23.                
  24.              mPager = (ViewPager)findViewById(R.id.pager);  
  25.              adapter = new ViewPagerFrameAdapter(getSupportFragmentManager(),titles);  
  26.              mPager.setAdapter(adapter);   
  27.               
  28.              //得到指示器  
  29.              tabbPageIndicator = (TabPageIndicator) findViewById(R.id.tab_indicator);     
  30.              tabbPageIndicator.setViewPager(mPager);  
  31.              //下标  
  32.              underlinePageIndicator = (UnderlinePageIndicatorEx)findViewById(R.id.underline_indicator);  
  33.              underlinePageIndicator.setViewPager(mPager);  
  34.              underlinePageIndicator.setFades(false);  
  35.              //设置指示器  
  36.              tabbPageIndicator.setOnPageChangeListener(underlinePageIndicator);  
  37.     }  
  38.   
  39.     //adapter 没啥好说的 跟前面的一样    
  40.     private class ViewPagerFrameAdapter extends FragmentStatePagerAdapter{  
  41.           
  42.         private List<String> title; //页面标题头部数据  
  43.   
  44.         public ViewPagerFrameAdapter(FragmentManager fm, List<String> title) {  
  45.             super(fm);  
  46.             this.title = title;  
  47.         }  
  48.           
  49.         //根据position 返回 fragment  
  50.         @Override  
  51.         public Fragment getItem(int position) {  
  52.             return ArrayFragment.newInstance(position);  
  53.         }  
  54.         //size  
  55.         @Override  
  56.         public int getCount() {  
  57.              return title.size();  
  58.         }  
  59.   
  60.         //顶部的title  
  61.         @Override  
  62.         public CharSequence getPageTitle(int position) {  
  63.             if (titles != null){  
  64.                 return titles.get(position).toString();  
  65.             }  
  66.             return super.getPageTitle(position);  
  67.         }     
  68.     }  
  69.       
  70. }  

UnderlinePageIndicatorEx.java

 
  1. //继承这个然后重写  
  2. public class UnderlinePageIndicatorEx extends UnderlinePageIndicator{  
  3.   
  4.         public UnderlinePageIndicatorEx(Context context) {  
  5.            super(context, null);         
  6.         }  
  7.   
  8.         public UnderlinePageIndicatorEx(Context context, AttributeSet attrs) {  
  9.             super(context, attrs, R.attr.vpiUnderlinePageIndicatorStyle);     
  10.         }  
  11.   
  12.         public UnderlinePageIndicatorEx(Context context, AttributeSet attrs, int defStyle) {  
  13.             super(context, attrs, defStyle);          
  14.         }  
  15.          
  16.         //自身的 ViewPage传递过去  
  17.         @Override  
  18.         public void setViewPager(ViewPager viewPager) {  
  19.             if (mViewPager == viewPager){  
  20.                 return;  
  21.             }  
  22.                
  23. //          if (mViewPager != null) {
      
  24. //              mViewPager.setOnPageChangeListener(null);  
  25. //          }  
  26.               
  27.             if (viewPager.getAdapter() == null) {  
  28.                 throw new IllegalStateException(" pager 没有 加入 adapter");  
  29.             }  
  30.               
  31.             mViewPager = viewPager;  
  32. //          mViewPager.setOnPageChangeListener(this);  
  33.             invalidate();  
  34.               
  35.             post(new Runnable(){  
  36.                 @Override public void run() {  
  37.                     if (mFades) {  
  38.                         post(mFadeRunnable);  
  39.                     }  
  40.                 }        
  41.             });   
  42.         }  
  43.           
  44. }  

ArrayFragment.java

 
  1. public class ArrayFragment extends Fragment{  
  2.   
  3.     private int position;  
  4.       
  5.     public ArrayFragment(int position){  
  6.         this.position = position;  
  7.     }  
  8.       
  9.      // 返回   viwePager 下面滑动的页面  
  10.     public static ArrayFragment newInstance(int position){  
  11.         return new ArrayFragment(position);  
  12.     }  
  13.       
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.     }  
  18.       
  19.     @Override  
  20.     public void onDestroy() {  
  21.         super.onDestroy();  
  22.     }  
  23.       
  24.     // 根据position 返回不同的view  
  25.     @Override  
  26.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  27.             Bundle savedInstanceState) {  
  28.   
  29.         View view = inflater.inflate(R.layout.layoutaa, null);        
  30.         return view;  
  31.     }  
  32. }  

好了接下来是 布局xml了。

 
  1. <LinearLayout  
  2.         xmlns:android="http://schemas.android.com/apk/res/android"  
  3.         android:layout_width="fill_parent"  
  4.         android:layout_height="fill_parent"  
  5.         android:orientation="vertical"  
  6.       >  
  7.   
  8.    <!--  标题      和      标题下面的  指示器  -->  
  9.      <LinearLayout  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="35dp"  
  12.         android:orientation="vertical"  
  13.         android:background="@drawable/main_header_background">  
  14.           
  15.                 <com.viewpagerindicator.TabPageIndicator  
  16.                     android:id="@+id/tab_indicator"  
  17.                     android:layout_height="wrap_content"  
  18.                     android:layout_width="fill_parent"/>  
  19.               
  20.                 <com.test.linepagerindictor.widget.UnderlinePageIndicatorEx  
  21.                     android:id="@+id/underline_indicator"  
  22.                     android:layout_height="3dip"  
  23.                     android:layout_width="fill_parent"  
  24.                     android:layout_alignParentBottom="true"/>  
  25.           
  26.        </LinearLayout>       
  27.   
  28.        <android.support.v4.view.ViewPager  
  29.         android:id="@+id/pager"  
  30.         android:layout_width="fill_parent"  
  31.         android:layout_height="fill_parent"/>  
  32.       
  33. </LinearLayout>  

接下来设置 滑动指示器的style

 
  1. <!-- 总 style  直接引用  这个   由  tab style  和    Indicator style 组成 -->  
  2.   <style name="StyledAllIndicators" parent="@android:style/Theme.Light">  
  3.       <item name="vpiTabPageIndicatorStyle">@style/CustomTabPageIndicator</item>  
  4.       <item name="vpiUnderlinePageIndicatorStyle">@style/CustomUnderlinePageIndicator</item>  
  5.   </style>  
  6.     
  7.   <!-- tab的 style -->  
  8.   <style name="CustomTabPageIndicator" parent="Widget.TabPageIndicator">  
  9.       <item name="android:background">#00000000</item>  
  10.       <item name="android:textAppearance">@style/CustomTabPageIndicator_text</item>  
  11.       <item name="android:textColor">@color/selector_tab</item>  
  12.       <item name="android:textSize">20sp</item>  
  13.         
  14.       <!-- 分割线,可有可无的 -->  
  15.       <item name="android:divider">@drawable/custom_tab_indicator_divider</item>  
  16.       <item name="android:dividerPadding">10dip</item>  
  17.       <item name="android:showDividers">middle</item>  
  18.       
  19.       <item name="android:paddingTop">4dp</item>  
  20.       <item name="android:paddingLeft">8dp</item>  
  21.       <item name="android:paddingBottom">4dp</item>  
  22.       <item name="android:paddingRight">8dp</item>  
  23.         
  24.       <item name="android:fadingEdge">horizontal</item>  
  25.       <item name="android:fadingEdgeLength">8dp</item>  
  26.   </style>  
  27.     
  28.   <style name="CustomTabPageIndicator_text" parent="android:TextAppearance.Medium">  
  29.       <item name="android:typeface">monospace</item>  
  30.   </style>  
  31.     
  32.     
  33.   <!--  下标的指示器的颜色 -->  
  34.   <style name="CustomUnderlinePageIndicator">  
  35.       <item name="selectedColor">#EB5548</item>  
  36.       <item name="android:background">#00000000</item>  
  37.       <item name="fadeLength">1000</item>  
  38.       <item name="fadeDelay">1000</item>  
  39.   </style>  

 

 

selector_tab.xml     这个是 选择器 在style中引用的,是用来切换 被选中的背景色的

 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  4.     <item android:state_selected="true" android:color="#91D228" />  
  5.     <item android:state_focused="true" android:color="#91D228" />  
  6.     <item android:color="#dddddd" />  
  7. </selector>   

好了 ,基本就这些了   fragment的的那个xml  自己随意画吧, 那个开源库随后上传。

你可能感兴趣的文章
Linux安装Java JDK 1.7
查看>>
7月11日我国垃圾邮件报告:广东湖北河南再居前三
查看>>
JSON辅助格式化
查看>>
widows8消费者预览版发布啦
查看>>
三天熟练掌握HTML5和CSS3
查看>>
[复习] grep、sed、awk练习题(二)
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
ES6 系列之 Babel 将 Generator 编译成了什么样子
查看>>
Apache错误日志详解
查看>>
动态查看对Memcache的使用
查看>>
整理时下流行的浏览器User-Agent大全
查看>>
linux下设置最大文件打开数nofile及nr_open、file-max说明
查看>>
Oracle中的Sql语句
查看>>
把Nginx注册成Windows的系统服
查看>>
每天一个linux命令(2):cd命令
查看>>
Python网页抓取urllib,urllib2,httplib
查看>>
Kubernetes删除资源后持续terminating状态
查看>>
【资料整理】下载和分析cdn节点汇总日志
查看>>
委托与事件(个人的一点理解)
查看>>
程序员的八种级别
查看>>