Android ViewPager再探:增加滑动指示条
上一篇:《Android ViewPager初探:让页面滑动起来》
ViewPager只是左右滑动有些丑,也不知道当前位于第几页面。
可以在上方加入滑动指示条,来确定当前位置。
只需要修改activity_main.xml和MainActivity.java即可,Adapter没什么要更改的。
首先,在activity_main.xml这个主页面中,修改根布局为LinearLayout,并增加布局TAB:
- <LinearLayout
- android:id="@+id/ll_tab"
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:background="#FFFFFF" >
- <TextView
- android:id="@+id/tv_first"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center"
- android:text="First"
- android:textSize="20sp" />
- <TextView
- android:id="@+id/tv_second"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center"
- android:text="Second"
- android:textSize="20sp" />
- <TextView
- android:id="@+id/tv_third"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center"
- android:text="Third"
- android:textSize="20sp" />
- </LinearLayout>
TAB布局下,应该有滑动指示条。在网上找了个图片命名为slidebar,放在mipmap-hdpi文件夹下,对应的布局为:
- <ImageView
- android:id="@+id/cursor"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scaleType="matrix"
- android:src="@mipmap/slidebar"
- android:contentDescription="slidebar"/>
对于cursor这个滑动条指示器,首先定义需要的参数:
- /*滑动条相关定义*/
- private ImageView cursor;
- private int bmp_width = 0;//游标宽度
- private int offset = 0;//游标图片偏移量
- private int number = 0;//当前页面编号
其次应该初始化它的位置:
- //初始化指示器位置
- public void initCursorPos() {
- // 初始化动画
- cursor = (ImageView) findViewById(R.id.cursor);
- bmp_width = BitmapFactory.decodeResource(getResources(), R.mipmap.slidebar)
- .getWidth();// 获取图片宽度
- DisplayMetrics dm = new DisplayMetrics();//初始化DisplayMetrics对象
- getWindowManager().getDefaultDisplay().getMetrics(dm);//将当前窗口信息放入DisplayMetrics类中
- int s_width = dm.widthPixels;// 获取分辨率宽度
- offset = (s_width / viewList.size() - bmp_width) / 2;// 计算偏移量(保证滑动条在该tab下正中间)
- Matrix matrix = new Matrix();
- matrix.postTranslate(offset, 0);
- cursor.setImageMatrix(matrix);// 设置动画初始位置
- }
Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。
DisplayMetrics dm = new DisplayMetrics();这句初始化了DisplayMetrics对象,但并未保存信息。
getWindowManager().getDefaultDisplay().getMetrics(dm);这句是获取当前窗口信息,并放入dm中。
偏移量的计算参考了网上例子,让滑动条处于正下方中间。
滑动指示条的移动需要跟随viewpager页面改变,这意味着要设置监听:(此处代码参考自:http://blog.csdn.net/harvic880925/article/details/38557517)
- //页面改变监听器
- public class NewPageChangeListener implements ViewPager.OnPageChangeListener {
- int one = offset * 2 + bmp_width;// 页卡1 -> 页卡2 偏移量
- int two = one * 2;// 页卡1 -> 页卡3 偏移量
- @Override
- public void onPageSelected(int arg0) {
- Animation animation = null;
- switch (arg0) {
- case 0:
- if (number == 1) {
- animation = new TranslateAnimation(one, 0, 0, 0);
- } else if (number == 2) {
- animation = new TranslateAnimation(two, 0, 0, 0);
- }
- break;
- case 1:
- if (number == 0) {
- animation = new TranslateAnimation(offset, one, 0, 0);
- } else if (number == 2) {
- animation = new TranslateAnimation(two, one, 0, 0);
- }
- break;
- case 2:
- if (number == 0) {
- animation = new TranslateAnimation(offset, two, 0, 0);
- } else if (number == 1) {
- animation = new TranslateAnimation(one, two, 0, 0);
- }
- break;
- }
- number = arg0;
- animation.setFillAfter(true);// True:图片停在动画结束位置
- animation.setDuration(300);
- cursor.startAnimation(animation);
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- }
- @Override
- public void onPageScrollStateChanged(int arg0) {
- }
- }
最后,在onCreate()函数内,加上监听操作:
- viewPager.setCurrentItem(0);//设置当前页
- viewPager.setOnPageChangeListener(new NewPageChangeListener());//监听页面改变
到此,滑动条和viewpager就结合了。
如果希望点击tab块,能跳转到相应页面,则需要加上监听操作:
- /*Tab页面参数*/
- private TextView tv_first;
- private TextView tv_second;
- private TextView tv_third;
onCreate()里:
- /*TAB页初始化*/
- tv_first = (TextView)findViewById(R.id.tv_first);
- tv_second = (TextView)findViewById(R.id.tv_second);
- tv_third = (TextView)findViewById(R.id.tv_third);
- /*Tab页面监听*/
- tv_first.setOnClickListener(new TabOnClickListener(0));
- tv_second.setOnClickListener(new TabOnClickListener(1));
- tv_third.setOnClickListener(new TabOnClickListener(2));
对应的监听函数:
- /*Tab页面点击监听*/
- public class TabOnClickListener implements View.OnClickListener{
- private int num = 0;
- public TabOnClickListener(int index){
- num = index;
- }
- @Override
- public void onClick(View v){
- viewPager.setCurrentItem(num);
- }
- }
最后附上MainActivity的完整代码:
- package com.example.viewpager.myapplication;
- import android.app.Activity;
- import android.graphics.BitmapFactory;
- import android.graphics.Matrix;
- import android.os.Bundle;
- import android.support.v4.view.ViewPager;
- import android.util.DisplayMetrics;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.animation.Animation;
- import android.view.animation.TranslateAnimation;
- import android.widget.ImageView;
- import android.widget.TextView;
- import java.util.ArrayList;
- import java.util.List;
- public class MainActivity extends Activity {
- private View first,second,third;
- private ViewPager viewPager;//对应 <android.support.v4.view.ViewPager/>控件
- private List<View> viewList;//View数组
- /*滑动条相关定义*/
- private ImageView cursor;
- private int bmp_width = 0;//游标宽度
- private int offset = 0;//游标图片偏移量
- private int number = 0;//当前页面编号
- /*Tab页面参数*/
- private TextView tv_first;
- private TextView tv_second;
- private TextView tv_third;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- /*TAB页初始化*/
- tv_first = (TextView)findViewById(R.id.tv_first);
- tv_second = (TextView)findViewById(R.id.tv_second);
- tv_third = (TextView)findViewById(R.id.tv_third);
- /*初始化*/
- viewPager = (ViewPager)findViewById(R.id.viewpager);
- LayoutInflater inflater = getLayoutInflater();
- first = inflater.inflate(R.layout.first_page,null);
- second = inflater.inflate(R.layout.second_page,null);
- third = inflater.inflate(R.layout.third_page,null);
- viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
- viewList.add(first);
- viewList.add(second);
- viewList.add(third);
- //初始化指示器位置
- initCursorPos();
- /*适配器部分*/
- NewPagerAdapter pagerAdapter = new NewPagerAdapter(viewList);
- viewPager.setAdapter(pagerAdapter);
- viewPager.setCurrentItem(0);//设置当前页
- viewPager.setOnPageChangeListener(new NewPageChangeListener());//监听页面改变
- /*Tab页面监听*/
- tv_first.setOnClickListener(new TabOnClickListener(0));
- tv_second.setOnClickListener(new TabOnClickListener(1));
- tv_third.setOnClickListener(new TabOnClickListener(2));
- }
- //初始化指示器位置
- public void initCursorPos() {
- // 初始化动画
- cursor = (ImageView) findViewById(R.id.cursor);
- bmp_width = BitmapFactory.decodeResource(getResources(), R.mipmap.slidebar)
- .getWidth();// 获取图片宽度
- DisplayMetrics dm = new DisplayMetrics();//初始化DisplayMetrics对象
- getWindowManager().getDefaultDisplay().getMetrics(dm);//将当前窗口信息放入DisplayMetrics类中
- int s_width = dm.widthPixels;// 获取分辨率宽度
- offset = (s_width / viewList.size() - bmp_width) / 2;// 计算偏移量(保证滑动条在该tab下正中间)
- Matrix matrix = new Matrix();
- matrix.postTranslate(offset, 0);
- cursor.setImageMatrix(matrix);// 设置动画初始位置
- }
- //页面改变监听器
- public class NewPageChangeListener implements ViewPager.OnPageChangeListener {
- int one = offset * 2 + bmp_width;// 页卡1 -> 页卡2 偏移量
- int two = one * 2;// 页卡1 -> 页卡3 偏移量
- @Override
- public void onPageSelected(int arg0) {
- Animation animation = null;
- switch (arg0) {
- case 0:
- if (number == 1) {
- animation = new TranslateAnimation(one, 0, 0, 0);
- } else if (number == 2) {
- animation = new TranslateAnimation(two, 0, 0, 0);
- }
- break;
- case 1:
- if (number == 0) {
- animation = new TranslateAnimation(offset, one, 0, 0);
- } else if (number == 2) {
- animation = new TranslateAnimation(two, one, 0, 0);
- }
- break;
- case 2:
- if (number == 0) {
- animation = new TranslateAnimation(offset, two, 0, 0);
- } else if (number == 1) {
- animation = new TranslateAnimation(one, two, 0, 0);
- }
- break;
- }
- number = arg0;
- animation.setFillAfter(true);// True:图片停在动画结束位置
- animation.setDuration(300);
- cursor.startAnimation(animation);
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- }
- @Override
- public void onPageScrollStateChanged(int arg0) {
- }
- }
- /*Tab页面点击监听*/
- public class TabOnClickListener implements View.OnClickListener{
- private int num = 0;
- public TabOnClickListener(int index){
- num = index;
- }
- @Override
- public void onClick(View v){
- viewPager.setCurrentItem(num);
- }
- }
- }
MainActivity.java
Android ViewPager再探:增加滑动指示条的更多相关文章
- ViewPager 详解(四)----自主实现滑动指示条
前言:前面我们用了三篇的时间讲述了有关ViewPager的基础知识,到这篇就要进入点实际的了.在第三篇<ViewPager 详解(三)---PagerTabStrip与PagerTitleStr ...
- Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)
1) ViewPager提供了左右滑动切换页面的方法,但是它所提供的标题只是无语,估计没有真正的项目会照搬拿过来;并且它只能一页一页滑,我想直接查看最后一页要滑半天; 2) 看了腾讯新闻客户端感觉体验 ...
- ViewPager+Fragment再探:和TAB滑动条一起三者结合
Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...
- Android ViewPager初探:让页面滑动起来
下一篇:<Android ViewPager再探:增加滑动指示条> ViewPager需要用到适配器PagerAAdapter,以下四个函数需要重写: instantiateItem(Vi ...
- (转)Android SlidingTabLayout定制分割线和指示条颜色
本文转载与:http://blog.csdn.net/zhangphil/article/details/48863347 Android SlidingTabLayout默认的滑动指示条是系统默认的 ...
- Android Material Design:滑动指示选项卡android.support.design.widget.TabLayout的简单使用
该TabLayout的功用,简单的说,就是当用户在该TabLayout的选项卡子item中选择触摸时候,文字和下方的指示器横条滑动指示.这个功能就是以前APP开发常用的选项卡某一卡片被切换.选中时候的 ...
- Android 使用ViewPager实现左右循环滑动图片
ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一 ...
- android:改动PagerTabStrip中的背景颜色,标题字体的样式、颜色和图标以及指示条的颜色
1.改动PagerTabStrip中的背景颜色 我们在布局中直接设置background属性就可以: <android.support.v4.view.ViewPager android:id= ...
- android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色
1.更改PagerTabStrip背景颜色 我们直接在布局中设置background属性可以: <android.support.v4.view.ViewPager android:id=&qu ...
随机推荐
- linux kernel: possible SYN flooding on port 8080. Sending cookie
possible SYN flooding on port 7244. Sending cookie
- Subway Icon Set – 306个像素完美的特制图标
这个图标集是306个优化的像素完美,精雕细琢的图标.为这些设备进行了优化:iOS.Windows Phone.Windows 8 and BlackBerry 10,提供 PNG, SVG, XALM ...
- Sql Server Always On主库与附库遇到的问题
使用Always On的时候永远要记住只有一个主数据库可写,如果写的话要不在监听节点上做写的操作,要不只在主数据库上写的操作不然只读库无法读写
- 部署基于国际版Azure的SharePoint三层架构服务器场
前言 微软Azure国际版已经很普及了,这里没有用国内版(世纪互联),用的是国际版,当然是由于公司性质的缘故.这里一步步图文的方式,分享给大家创建Azure国际版的SharePoint三层架构的过程, ...
- MyEclipse 2015 CI 14发布(附下载)
支持Web和Node.jsd的JavaScript Debugger调试器,新版本功能更加强大,在MyEclipse调试web应用程序变得更方便.调试器支持断点.变量和表达式. 类的动态预加载用Hot ...
- 优化MySchool数据库(四)
关于“无法附件数据库”过程的遇到的问题: 1.数据文件本身,具有访问权限的限制 ---- 选中 数据库文件所在的文件夹---->右键菜单(属性)----> 安全 --->User用户 ...
- Java 线程通信
线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...
- 深入理解Objective-C Runtime
一.简介 主要特点: 在OC语言中,函数的调用是属于动态调用的,编译阶段并不确定要调用的函数,在真正的运行时才会根据函数名查找要调用哪个函数. 而在C语言中,函数的调用是在编译阶段就已经确定要调用哪个 ...
- 关于PHP的curl开启问题
今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢 ...
- 网站错误记录:A transport-level error has occurred when sending the request to the server.
今天查看公司项目的日志文件,发现有这个错误:A transport-level error has occurred when sending the request to the server. 感 ...