上一篇:《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再探:增加滑动指示条的更多相关文章

  1. ViewPager 详解(四)----自主实现滑动指示条

    前言:前面我们用了三篇的时间讲述了有关ViewPager的基础知识,到这篇就要进入点实际的了.在第三篇<ViewPager 详解(三)---PagerTabStrip与PagerTitleStr ...

  2. Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)

    1) ViewPager提供了左右滑动切换页面的方法,但是它所提供的标题只是无语,估计没有真正的项目会照搬拿过来;并且它只能一页一页滑,我想直接查看最后一页要滑半天; 2) 看了腾讯新闻客户端感觉体验 ...

  3. ViewPager+Fragment再探:和TAB滑动条一起三者结合

    Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...

  4. Android ViewPager初探:让页面滑动起来

    下一篇:<Android ViewPager再探:增加滑动指示条> ViewPager需要用到适配器PagerAAdapter,以下四个函数需要重写: instantiateItem(Vi ...

  5. (转)Android SlidingTabLayout定制分割线和指示条颜色

    本文转载与:http://blog.csdn.net/zhangphil/article/details/48863347 Android SlidingTabLayout默认的滑动指示条是系统默认的 ...

  6. Android Material Design:滑动指示选项卡android.support.design.widget.TabLayout的简单使用

    该TabLayout的功用,简单的说,就是当用户在该TabLayout的选项卡子item中选择触摸时候,文字和下方的指示器横条滑动指示.这个功能就是以前APP开发常用的选项卡某一卡片被切换.选中时候的 ...

  7. Android 使用ViewPager实现左右循环滑动图片

    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1.    首先看一 ...

  8. android:改动PagerTabStrip中的背景颜色,标题字体的样式、颜色和图标以及指示条的颜色

    1.改动PagerTabStrip中的背景颜色 我们在布局中直接设置background属性就可以: <android.support.v4.view.ViewPager android:id= ...

  9. android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色

    1.更改PagerTabStrip背景颜色 我们直接在布局中设置background属性可以: <android.support.v4.view.ViewPager android:id=&qu ...

随机推荐

  1. web桌面程序之图标拖动排序的分析

    在web桌面程序里,图标拖动并重新排序是个比较常见的功能.这个功能我之前反复修改了好几遍,现在终于整理出了比较理想的解决思路,决定拿出来分享下. 这一功能主要有哪些难点呢?我总结了一下一共有2处难点: ...

  2. php 过滤英文标点符号 过滤中文标点符号

    php 过滤英文标点符号 过滤中文标点符号 代码 function filter_mark($text){ if(trim($text)=='')return ''; $text=preg_repla ...

  3. easyui加载datagrid时随着窗体大小改变而改变

    function initTable() {     $('#tt').datagrid({         width: $(document).width() - 20,         heig ...

  4. HTML5夜空烟花绽放动画效果

    模板描述:HTML5夜空烟花绽放动画效果基于HTML5 canvas制作,模拟夜空烟花绽放动画效果,烟花会在夜空打出贺词,有新年快乐.合家幸福.万事如意.心想事成.财源广进等,文字可以自定义,做成各种 ...

  5. overflow 属性

    写在前面的话: 2016年5月4日青年节,作为一名正青春的学生党,开始了博客生涯,励志做个勤奋上进的好青年.幻想着毕业后月薪W+ .走上人生巅峰的职场生活...... 然而 然而 然而 ,自制力有限的 ...

  6. JavaScript + SVG实现Web前端WorkFlow工作流DAG有向无环图

    一.效果图展示及说明 (图一) (图二) 附注说明: 1. 图例都是DAG有向无环图的展现效果.两张图的区别为第二张图包含了多个分段关系.放置展示图片效果主要是为了说明该例子支持多段关系的展现(当前也 ...

  7. 传说中的AutoCAD公司 - 欧特克(Autodesk)招聘开发顾问-上海或北京

    如果您热衷新技术,垂涎科技前沿,对编程有狂热的热情,乐于帮助别人打造解决方案,喜爱分享和交流,英文沟通无障碍,来吧,把简历丢过来! 如果您刚毕业不久,那也不要因为工作经历尚浅而怯步,我们也非常欢迎您! ...

  8. linker command failed with exit code 1 (use -v to see invocation)解决办法

    [cpp] view plaincopy Undefined symbols for architecture i386:     "_OBJC_CLASS_$_FMDatabase&quo ...

  9. Android开发中遇到的小问题 一

    1)想要ListView活着Girdview左右留些空隙,但Scrollbar要在屏幕最右边 在xml中加入 android:paddingLeft="8dp" android:p ...

  10. iOS学习路线

    这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选 ...