zoukankan      html  css  js  c++  java
  • android 中 viewpager 滑动的指示器

    先看下效果图:

    这个需要用到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  自己随意画吧, 那个开源库随后上传。

  • 相关阅读:
    P1219 [USACO1.5]八皇后 Checker Challenge 深度搜索 标记 回溯
    P2036 [COCI2008-2009#2] PERKET 深度搜索 暴力
    20201122 赛事纪录
    P4447 [AHOI2018初中组]分组 贪心
    P4995 跳跳! 贪心
    P1434 [SHOI2002]滑雪 记忆化搜索,深度搜索,动态规划
    leetcode(42)接雨水
    数据结构与算法的总纲
    leetcode(84)柱状图中最大的矩形
    leetcode(45)跳跃游戏
  • 原文地址:https://www.cnblogs.com/android100/p/android-viewpager.html
Copyright © 2011-2022 走看看