当前位置: 代码迷 >> Android >> Android ViewPager又探:增加滑动指示条
  详细解决方案

Android ViewPager又探:增加滑动指示条

热度:90   发布时间:2016-04-27 23:46:10.0
Android ViewPager再探:增加滑动指示条

上一篇:《Android ViewPager初探:让页面滑动起来》

 

ViewPager只是左右滑动有些丑,也不知道当前位于第几页面。

可以在上方加入滑动指示条,来确定当前位置。

只需要修改activity_main.xml和MainActivity.java即可,Adapter没什么要更改的。

 

首先,在activity_main.xml这个主页面中,修改根布局为LinearLayout,并增加布局TAB:

 1 <LinearLayout 2         android:id="@+id/ll_tab" 3         android:layout_width="match_parent" 4         android:layout_height="45dp" 5         android:background="#FFFFFF" > 6  7         <TextView 8             android:id="@+id/tv_first" 9             android:layout_width="match_parent"10             android:layout_height="match_parent"11             android:layout_weight="1"12             android:gravity="center"13             android:text="First"14             android:textSize="20sp" />15 16         <TextView17             android:id="@+id/tv_second"18             android:layout_width="match_parent"19             android:layout_height="match_parent"20             android:layout_weight="1"21             android:gravity="center"22             android:text="Second"23             android:textSize="20sp" />24 25         <TextView26             android:id="@+id/tv_third"27             android:layout_width="match_parent"28             android:layout_height="match_parent"29             android:layout_weight="1"30             android:gravity="center"31             android:text="Third"32             android:textSize="20sp" />33     </LinearLayout>

 

TAB布局下,应该有滑动指示条。在网上找了个图片命名为slidebar,放在mipmap-hdpi文件夹下,对应的布局为:

1 <ImageView2         android:id="@+id/cursor"3         android:layout_width="match_parent"4         android:layout_height="wrap_content"5         android:scaleType="matrix"6         android:src="@mipmap/slidebar"7         android:contentDescription="slidebar"/>

 

对于cursor这个滑动条指示器,首先定义需要的参数:

1 /*滑动条相关定义*/2 private ImageView cursor;3 private int bmp_width = 0;//游标宽度4 private int offset = 0;//游标图片偏移量5 private int number = 0;//当前页面编号

 

其次应该初始化它的位置:

 1 //初始化指示器位置 2     public void initCursorPos() { 3         // 初始化动画 4         cursor = (ImageView) findViewById(R.id.cursor); 5         bmp_width = BitmapFactory.decodeResource(getResources(), R.mipmap.slidebar) 6                 .getWidth();// 获取图片宽度 7  8         DisplayMetrics dm = new DisplayMetrics();//初始化DisplayMetrics对象 9         getWindowManager().getDefaultDisplay().getMetrics(dm);//将当前窗口信息放入DisplayMetrics类中10         int s_width = dm.widthPixels;// 获取分辨率宽度11         offset = (s_width / viewList.size() - bmp_width) / 2;// 计算偏移量(保证滑动条在该tab下正中间)12 13         Matrix matrix = new Matrix();14         matrix.postTranslate(offset, 0);15         cursor.setImageMatrix(matrix);// 设置动画初始位置16     }

Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

DisplayMetrics dm = new DisplayMetrics();这句初始化了DisplayMetrics对象,但并未保存信息。

getWindowManager().getDefaultDisplay().getMetrics(dm);这句是获取当前窗口信息,并放入dm中。

偏移量的计算参考了网上例子,让滑动条处于正下方中间。

 

滑动指示条的移动需要跟随viewpager页面改变,这意味着要设置监听:(此处代码参考自:http://blog.csdn.net/harvic880925/article/details/38557517)

 1 //页面改变监听器 2     public class NewPageChangeListener implements ViewPager.OnPageChangeListener { 3  4         int one = offset * 2 + bmp_width;// 页卡1 -> 页卡2 偏移量 5         int two = one * 2;// 页卡1 -> 页卡3 偏移量 6  7         @Override 8         public void onPageSelected(int arg0) { 9             Animation animation = null;10             switch (arg0) {11                 case 0:12                     if (number == 1) {13                         animation = new TranslateAnimation(one, 0, 0, 0);14                     } else if (number == 2) {15                         animation = new TranslateAnimation(two, 0, 0, 0);16                     }17                     break;18                 case 1:19                     if (number == 0) {20                         animation = new TranslateAnimation(offset, one, 0, 0);21                     } else if (number == 2) {22                         animation = new TranslateAnimation(two, one, 0, 0);23                     }24                     break;25                 case 2:26                     if (number == 0) {27                         animation = new TranslateAnimation(offset, two, 0, 0);28                     } else if (number == 1) {29                         animation = new TranslateAnimation(one, two, 0, 0);30                     }31                     break;32             }33             number = arg0;34             animation.setFillAfter(true);// True:图片停在动画结束位置35             animation.setDuration(300);36             cursor.startAnimation(animation);37         }38 39         @Override40         public void onPageScrolled(int arg0, float arg1, int arg2) {41         }42 43         @Override44         public void onPageScrollStateChanged(int arg0) {45         }46     }

 

最后,在onCreate()函数内,加上监听操作:

1 viewPager.setCurrentItem(0);//设置当前页2 viewPager.setOnPageChangeListener(new NewPageChangeListener());//监听页面改变

 

到此,滑动条和viewpager就结合了。

 

如果希望点击tab块,能跳转到相应页面,则需要加上监听操作:

1 /*Tab页面参数*/2 private TextView tv_first;3 private TextView tv_second;4 private TextView tv_third;

onCreate()里:

 1 /*TAB页初始化*/ 2 tv_first = (TextView)findViewById(R.id.tv_first); 3 tv_second = (TextView)findViewById(R.id.tv_second); 4 tv_third = (TextView)findViewById(R.id.tv_third); 5  6  7 /*Tab页面监听*/ 8 tv_first.setOnClickListener(new TabOnClickListener(0)); 9 tv_second.setOnClickListener(new TabOnClickListener(1));10 tv_third.setOnClickListener(new TabOnClickListener(2));

对应的监听函数:

 1 /*Tab页面点击监听*/ 2     public class TabOnClickListener implements View.OnClickListener{ 3         private int num = 0; 4  5         public TabOnClickListener(int index){ 6             num = index; 7         } 8  9         @Override10         public void onClick(View v){11             viewPager.setCurrentItem(num);12         }13     }

 

 

最后附上MainActivity的完整代码:

  1 package com.example.viewpager.myapplication;  2   3 import android.app.Activity;  4 import android.graphics.BitmapFactory;  5 import android.graphics.Matrix;  6 import android.os.Bundle;  7 import android.support.v4.view.ViewPager;  8 import android.util.DisplayMetrics;  9 import android.view.LayoutInflater; 10 import android.view.View; 11 import android.view.animation.Animation; 12 import android.view.animation.TranslateAnimation; 13 import android.widget.ImageView; 14 import android.widget.TextView; 15  16 import java.util.ArrayList; 17 import java.util.List; 18  19  20 public class MainActivity extends Activity { 21     private View first,second,third; 22     private ViewPager viewPager;//对应 <android.support.v4.view.ViewPager/>控件 23     private List<View> viewList;//View数组 24  25     /*滑动条相关定义*/ 26     private ImageView cursor; 27     private int bmp_width = 0;//游标宽度 28     private int offset = 0;//游标图片偏移量 29     private int number = 0;//当前页面编号 30  31     /*Tab页面参数*/ 32     private TextView tv_first; 33     private TextView tv_second; 34     private TextView tv_third; 35  36     @Override 37     protected void onCreate(Bundle savedInstanceState) { 38         super.onCreate(savedInstanceState); 39         setContentView(R.layout.activity_main); 40  41         /*TAB页初始化*/ 42         tv_first = (TextView)findViewById(R.id.tv_first); 43         tv_second = (TextView)findViewById(R.id.tv_second); 44         tv_third = (TextView)findViewById(R.id.tv_third); 45  46         /*初始化*/ 47         viewPager = (ViewPager)findViewById(R.id.viewpager); 48         LayoutInflater inflater = getLayoutInflater(); 49         first = inflater.inflate(R.layout.first_page,null); 50         second = inflater.inflate(R.layout.second_page,null); 51         third = inflater.inflate(R.layout.third_page,null); 52  53         viewList = new ArrayList<View>();// 将要分页显示的View装入数组中 54         viewList.add(first); 55         viewList.add(second); 56         viewList.add(third); 57  58         //初始化指示器位置 59         initCursorPos(); 60  61         /*适配器部分*/ 62         NewPagerAdapter pagerAdapter = new NewPagerAdapter(viewList); 63         viewPager.setAdapter(pagerAdapter); 64  65         viewPager.setCurrentItem(0);//设置当前页 66         viewPager.setOnPageChangeListener(new NewPageChangeListener());//监听页面改变 67  68         /*Tab页面监听*/ 69         tv_first.setOnClickListener(new TabOnClickListener(0)); 70         tv_second.setOnClickListener(new TabOnClickListener(1)); 71         tv_third.setOnClickListener(new TabOnClickListener(2)); 72     } 73  74     //初始化指示器位置 75     public void initCursorPos() { 76         // 初始化动画 77         cursor = (ImageView) findViewById(R.id.cursor); 78         bmp_width = BitmapFactory.decodeResource(getResources(), R.mipmap.slidebar) 79                 .getWidth();// 获取图片宽度 80  81         DisplayMetrics dm = new DisplayMetrics();//初始化DisplayMetrics对象 82         getWindowManager().getDefaultDisplay().getMetrics(dm);//将当前窗口信息放入DisplayMetrics类中 83         int s_width = dm.widthPixels;// 获取分辨率宽度 84         offset = (s_width / viewList.size() - bmp_width) / 2;// 计算偏移量(保证滑动条在该tab下正中间) 85  86         Matrix matrix = new Matrix(); 87         matrix.postTranslate(offset, 0); 88         cursor.setImageMatrix(matrix);// 设置动画初始位置 89     } 90  91  92     //页面改变监听器 93     public class NewPageChangeListener implements ViewPager.OnPageChangeListener { 94  95         int one = offset * 2 + bmp_width;// 页卡1 -> 页卡2 偏移量 96         int two = one * 2;// 页卡1 -> 页卡3 偏移量 97  98         @Override 99         public void onPageSelected(int arg0) {100             Animation animation = null;101             switch (arg0) {102                 case 0:103                     if (number == 1) {104                         animation = new TranslateAnimation(one, 0, 0, 0);105                     } else if (number == 2) {106                         animation = new TranslateAnimation(two, 0, 0, 0);107                     }108                     break;109                 case 1:110                     if (number == 0) {111                         animation = new TranslateAnimation(offset, one, 0, 0);112                     } else if (number == 2) {113                         animation = new TranslateAnimation(two, one, 0, 0);114                     }115                     break;116                 case 2:117                     if (number == 0) {118                         animation = new TranslateAnimation(offset, two, 0, 0);119                     } else if (number == 1) {120                         animation = new TranslateAnimation(one, two, 0, 0);121                     }122                     break;123             }124             number = arg0;125             animation.setFillAfter(true);// True:图片停在动画结束位置126             animation.setDuration(300);127             cursor.startAnimation(animation);128         }129 130         @Override131         public void onPageScrolled(int arg0, float arg1, int arg2) {132         }133 134         @Override135         public void onPageScrollStateChanged(int arg0) {136         }137     }138 139 140     /*Tab页面点击监听*/141     public class TabOnClickListener implements View.OnClickListener{142         private int num = 0;143 144         public TabOnClickListener(int index){145             num = index;146         }147 148         @Override149         public void onClick(View v){150             viewPager.setCurrentItem(num);151         }152     }153 154 }
MainActivity.java

 

  相关解决方案