什么是ViewPager?

ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果。

如果想向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包。

通俗点来讲,就是现在市面上大多数app,安装完第一次打开软件会出现的一个左右滑动的引导界面。

布局代码:

要点1、页面的小圆点的控制,当在当前页时小圆点不可点。

所以有多少个页面就需要添加多少的圆点图片。

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.viewpager.MainActivity" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <LinearLayout
android:id="@+id/ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:orientation="horizontal" > <ImageView
android:id="@+id/iv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="25dp"
android:src="@drawable/point_selector" />
<ImageView
android:id="@+id/iv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="25dp"
android:src="@drawable/point_selector" />
<ImageView
android:id="@+id/iv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="25dp"
android:src="@drawable/point_selector" />
<ImageView
android:id="@+id/iv4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="25dp"
android:src="@drawable/point_selector" />
</LinearLayout> </RelativeLayout>

小圆点是否可点,则需要一个选择器,当当前页面可触碰,则小圆点为灰色,否则为白色

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="true" android:drawable="@drawable/page_now"></item>
<item android:state_enabled="false" android:drawable="@drawable/page"></item> </selector>

pege_now和page为准备好的图片,分别是灰色小圆点和白色小圆点。

ViewPager和ListView都需要一个适配器,ViewPager需要适配器来提供要显示页面的页数、判断是否是view对象、实例化一个页面、删除一个页面等等。。

适配器代码:

 package com.example.viewpager;

 import java.util.List;

 import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup; public class ImageAdapter extends PagerAdapter { private List<View> viewlist;
public ImageAdapter(List<View> viewlist)
{
this.viewlist=viewlist;
}
@Override
public int getCount() {//返回页面数
// TODO Auto-generated method stub
if (viewlist.size()!=0)
{
return viewlist.size();
}
return 0;
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {//判断是否为view对象
// TODO Auto-generated method stub
return arg0==arg1;
}
public Object instantiateItem(ViewGroup container,int position)//实例化一个页面
{
container.addView(viewlist.get(position));
return viewlist.get(position);
}
public void destroyItem(ViewGroup container, int position, Object object) {//销毁一个页卡
container.removeView(viewlist.get(position));
} }

MainActivity代码:

 package com.example.viewpager;

 import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout; public class MainActivity extends Activity implements OnClickListener, OnPageChangeListener{ private ViewPager viewpager=null;
private List<View> viewlist=null;
//private View view1, view2, view3, view4;
private int images[]=new int[]{R.drawable.p01,R.drawable.w07,R.drawable.w08,R.drawable.welcome};
private ImageView points[];//存放小圆圈数组
private int currentIndex=0;//当前页面,默认首页
private static final String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViewPager();
initPoint();
}
public void initPoint()//初始化小圆点
{
LinearLayout ll=(LinearLayout)findViewById(R.id.ll);
points=new ImageView[4];
for (int i=0;i<points.length;i++)
{
points[i]=(ImageView)ll.getChildAt(i);
points[i].setEnabled(true);
points[i].setOnClickListener(this);
points[i].setTag(i);//标识符与圆点顺序一致
}
currentIndex=0;
points[currentIndex].setEnabled(false); }
private void initViewPager()
{
viewpager=(ViewPager)findViewById(R.id.viewpager);
viewlist=new ArrayList<View>();
for (int i = 0; i < images.length; i++) {
ImageView imageView = new ImageView(MainActivity.this);
imageView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
imageView.setScaleType(ScaleType.FIT_XY);// 设置缩放样式
imageView.setImageResource(images[i]);
viewlist.add(imageView);
}
ImageAdapter adapter=new ImageAdapter(viewlist);//构造一个适配器
viewpager.setAdapter(adapter);//给viewpager添加一个适配器
viewpager.setOnPageChangeListener(this);//设置监听 }
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Log.i("tuzi",arg0.getTag()+"");
// viewpager.setCurrentItem(Integer.parseInt((String) arg0.getTag()));//需要直接跳转的某个页面的时候
}
@Override
public void onPageScrollStateChanged(int arg0) {
//此方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。
// TODO Auto-generated method stub }
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
// 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。其中三个参数的含义分别为:
// arg0 :当前页面,及你点击滑动的页面
// arg1:当前页面偏移的百分比
// arg2:当前页面偏移的像素位置 }
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
points[arg0].setEnabled(false);
points[currentIndex].setEnabled(true);
currentIndex=arg0; }
}

添加标题栏

PagerTabStrip与PagerTitleStrip的区别

其实这两个实现的效果基本差不多,但有两点不同:

1、PagerTabStrip在当前页面下,会有一个下划线条来提示当前页面的Tab是哪个。

2、PagerTabStrip的Tab是可以点击的,当用户点击某一个Tab时,当前页面就会跳转到这个页面,而PagerTitleStrip则没这个功能。

首先是PagerTitleStrip的用法

1、在布局文件添加上

<android.support.v4.view.PagerTitleStrip
android:id="@+id/pagetitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"/>

2、声明一个存放标题名称的数组

private ArrayList<String> titlelist=null;

并实例化

titlelist = new ArrayList<String>();// 每个页面的Title数据
titlelist.add("页面一");
titlelist.add("页面二");
titlelist.add("页面三");

3、在适配器中重写getPageTitle()函数

public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titlelist.get(position);
}

注意点:要改适配器的构造函数

public ImageAdapter(List<View> viewlist,ArrayList<String> titlelist)
{
this.viewlist=viewlist;
this.titlelist=titlelist;
}

PagerTabStrip的用法和PagerTitleStrip相同

修改布局代码为:

<android.support.v4.view.PagerTabStrip
android:id="@+id/pagertab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"/>

Android开发之ViewPager的更多相关文章

  1. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  2. Android开发之ViewPager的简单使用

    ViewPager是V4包中的,如果你的编译器敲不出ViewPager,那么你就需要添加,看下面: 第一步:点击+号 第二步:选择第一个Library 第三步:添加这个包: 然后点击ok-->o ...

  3. Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View

    最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面 ...

  4. Android开发之ViewPager实现多页面切换及动画效果(仿Android的Launcher效果)

    Android开发中经常会有引导页或者切换页面等效果,本文采用ViewPager结合动画效果来实现仿Launcher以及页面切换的效果.源码地址在文章最后给出下载. 效果图如下:       1.Vi ...

  5. Android开发之ViewPager做新手引导界面

    先看一下我们要开发的界面(三张图片,滑到最后一个会出现开始体验的Button,下面的小红点会跟着一起滑动): 首先看一下布局文件: <?xml version="1.0" e ...

  6. Android开发之viewpager导报错误解决方法:错误代码 Caused by: java.lang.ClassNotFoundException: Didn't find class

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Caused by: java.lang.ClassNotFoundException: Didn't ...

  7. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  8. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  9. Android开发之Git配置

    Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...

随机推荐

  1. 关于ButterKnife 8.1.0使用遇到的问题

    ButterKnife注解方式 和eventbus 差不多 都很好用 @OnClick(R.id.button) void onButtonClick() { //TODO implement Toa ...

  2. spring3 mvc使用注解方式时,不能扫描jar包里面的类

    使用eclipse export工具时选中Add directory entries可以解决.

  3. OAuth 的权限问题与信息隐忧

    核心提示:以 QQ 登陆和微博登陆为代表的“一键登陆”背后不仅仅是登陆这么简单,它还默认获取了你的其他隐私资料和账号的部分使用权限,我们在享受便利的同时一定不要忘记保护好我们的个人信息安全. 去年3Q ...

  4. C#调用C++的DLL函数另一则(delegate) z

    使用DLLImport进行导入函数的事. C#调用C++的函数其实不止这一种方法, 还有一种方法是用delegate申明函数委托进行调用,这种方法略显麻烦,但是可以进行回调并应用指针. 在C#中,首先 ...

  5. HDU-5414 CRB and String

    http://acm.hdu.edu.cn/showproblem.php?pid=5414 题意:给定字符串s和t,可以在s里面选一个字符c,然后任选一个字符d(d!=c)将d插入到c的后面,问能不 ...

  6. ThinkPadTablet如何恢复出厂状态

    ThinkPad Tablet恢复出厂操作教程: 第一步:开机看到“LENOVO”图标后不停按机器侧面音量增大键,直到出现“Booting recovery kernel image”字样. 第二步: ...

  7. [codevs2230]黑白棋子

    题目链接 http://www.luogu.org/problem/show?pid=1259# http://codevs.cn/problem/2230/ 题目描述 有2n个棋子(n≥4)排成一行 ...

  8. oracle 日志学习(转载)

    一,重做日志概念 重做日志文件(redo log file)对于Oracle数据库至关重要.它们是数据库的事务日志.通常只用于恢复,不过也可以用于以下工作: q 系统崩溃后的实例恢复 q 通过备份恢复 ...

  9. 洛谷P1126 机器人搬重物

    洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...

  10. ambari安装过程中的问题汇总

    今天重新安装ambari过程中,遇到了几个问题,耗费了我很长时间,在此记录一下 ambari重新安装可参考我之前的一篇随笔 http://www.cnblogs.com/6tian/p/4097401 ...