ViewPager也算是Android自带的常用控件之一,但是有可能会无法直接调用,所以只需要将工程目录里/libs/android-support-v4.jar该jarAdd to Build Path就可以了。

先来看看效果图吧:

                                                          

一、首先完成布局文件:

从效果图可以分析出,整体的布局为一个RelativeLayout布局,上面是一个ViewPager,下面是一个LinearLayout,在LinearLayout里面,有一个TextView 和 几个小圆点,所以可以很容易的写出布局文件了。

<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=".MainActivity" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="200dip" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical" > <TextView
android:id="@+id/image_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@android:color/white"
android:textSize="18sp" /> <LinearLayout
android:id="@+id/point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal" /> </LinearLayout> </RelativeLayout>

二、在MainActivity中加载布局文件

1.通过ID查找出各个控件。

                ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
LinearLayout pointGroup = (LinearLayout) findViewById(R.id.point_group);
TextView imageDesc = (TextView) findViewById(R.id.image_desc);

2.初始化图片资源和指示点。

		ArrayList<ImageView> imageList = new ArrayList<ImageView>();
for(int i = 0; i<imageIds.length;i++) { // 初始化图片资源
ImageView image = new ImageView(this);
image.setBackgroundResource(imageIds[i]);
imageList.add(image); // 添加指示点
ImageView point = new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(5, 5);
params.rightMargin = 20;
point.setLayoutParams(params); point.setBackgroundResource(R.drawable.point_bg);
if(i==0) {
point.setEnabled(true);
} else {
point.setEnabled(false);
}
pointGroup.addView(point);
}

这个代码,先是创建了一个ArrayList来保存图片资源,然后通过一个循环,将每一张图片加载进入imageList,在加载图片的同时,也将指示点添加进入pointGroup指示点的资源ID--R.drawable.point_bg,是通过自己在/res/drawable中自己创建得来的,在drawable文件夹中,创建了三个XML文件,分别用来绘制不同状态的指示点。

其中point_bg.xml文件代码为:

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

point_nomal.xml文件代码为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> <size android:width="5dip"
android:height="5dip"/>
<solid android:color="#55000000"/> </shape>

point_focured.xml文件代码为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> <size android:width="5dip"
android:height="5dip"/>
<solid android:color="#aaFFFFFF"/> </shape>

3.将资源添加进入viewPager。

		viewPager.setAdapter(new MyPagerAdapter());
private class MyPagerAdapter extends PagerAdapter { /**
* 获得页面的总数
*/
@Override
public int getCount() {
return Integer.MAX_VALUE; // 因为需要无限循环,所以这里就不写imageList.size()
} /**
* 获得相应位置上的view
* container view的容器,其实就是viewpager自身
* position 相应的位置
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 给container添加内容
container.addView(imageList.get(position%imageList.size())); return imageList.get(position%imageList.size());
} /**
* 判断view和object的对应关系
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} /**
* 销毁对应位置上的object
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
object = null;
}
}

现在就完成了基本的设置了,可以运行程序看一下效果了,现在已经可以循环的左右切换了。

三、增加自动切换

想要实现自动切换的方法比较多,大概分为:使用定时器;开启子线程;使用ColckManager;用handler发送延时信息。在此我们采用比较简单的方式--用handler发送延时信息。

	// 判断是否执行动画
private boolean isRunning = false;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
// 滑动到下一页
viewPager.setCurrentItem(viewPager.getCurrentItem()+1); if(isRunning) {
handler.sendEmptyMessageDelayed(0, 2000);
}
};
};

以上代码建立在onCreate()外,用于判断是否接收到了handler发送来的信息,如果接收到了,就将viewpager的显示后移一位延时2000毫秒后再发送出去。

然后在onCreate()方法中添加:

		isRunning = true;
handler.sendEmptyMessageDelayed(0, 2000);

这样就完成了viewPager中图片的自动切换,但是在运行程序后发现,图片下面的Text和指示点并没有跟着切换,所以还需要添加一下代码:

		viewPager.setOnPageChangeListener(new OnPageChangeListener() {

			/**
* 页面切换后调用
* postion 新的页面位置
*/
@Override
public void onPageSelected(int position) { position = position%imageList.size(); // 设置文字描述内容
imageDesc.setText(imageDescriptions[position]);
// 改变指示点的状态
pointGroup.getChildAt(position).setEnabled(true);
pointGroup.getChildAt(lastPointPosition).setEnabled(false);
lastPointPosition = position;
} /**
* 当页面正在滚动的时候
*/
@Override
public void onPageScrolled(int position, float positionOffset, int arg2) { } /**
* 当页面状态发生变化的时候
*/
@Override
public void onPageScrollStateChanged(int arg0) { }
});

setOnPageChangeListener()是一个监听ViewPager页面变化的方法,其实的onPageSelected()是 当页面切换后调用的,在此我们重写了该方法。当切换到新的一页的时候,Text 和 指示点也跟着变换。

四、Demo下载

点我下载Demo          o(︶︿︶)o

ViewPager的基本使用--可左右循环切换也可自动切换的更多相关文章

  1. JavaScript、tabel切换完整版—自动切换—鼠标移入停止-移开运行

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. ViewPager,实现真正的无限循环(定时+手动)

    利用定时器,实现循环轮播,很简单:只需在定时器的消息里加如下代码即可: int count = adapter.getCount(); if (count > 1) { // 多于1个,才循环 ...

  3. Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。

    实现真正的ViewPager[平滑过渡]+[循环滚动]!!!顺带还有[末页跳转]. 首先呢, 我要对网上常见的3种ViewPager的循环滚动方法做个概述.急需看真正实现方法的同志请选择性忽略下面这一 ...

  4. 封装一个ViewPager真正的实现图片无限循环滚动带导航点

    效果图: 大家在写项目的过程中常常会碰到须要实现Viewpager里面载入几张图片来循环自己主动轮播的效果,假设不封装一下的话代码分散在activity里面会显得非常乱.并且也不利于我们下次复用,所以 ...

  5. swiper轮播图(逆向自动切换类似于无限循环)

    swiper插件轮播图,默认的轮播循序是会从右向左,第一张,第二张,第三张,然后肉眼可见是的从第三张从左到右倒回第一张,这样就会有些视觉体验不高, ,不过还是能够用swiper本身的特性更改成无限循环 ...

  6. Android借助Handler,实现ViewPager中页面的自动切换(转)

    在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图:           实现一个自动 ...

  7. 广告banner:手动滑动切换,自动切换,点击跳转,异步加载网络图片

    效果图: 该banner功能有自动切换图片,点击图片可以自定义事件,手动滑动切换,异步加载图片 代码说话: 布局文件: <!-- 广告位 --> <FrameLayout andro ...

  8. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  9. ios基础篇(二十三)—— 定时器NSTimer与图片的自动切换

    一.NSTimer NSTimer是一个能在从现在开始到后面的某一个时刻或者周期性的执行我们指定的方法的对象.可以按照一定的时间间隔,将制定的信息发送给目标对象.并更新某个对象的行为.你可以选择在未来 ...

随机推荐

  1. 如何开发原生的 JavaScript 插件(知识点+写法)

    一.前言 通过 "WWW" 原则我们来了解 JavaScript 插件这个东西 第一个 W "What" -- 是什么?什么是插件,我就不照搬书本上的抽象概念了 ...

  2. 多浏览器兼容flv视频播放HTML

    HTML: <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http: ...

  3. TestDriven.NET – 快速入门

    TestDriven.NET – 快速入门[译文] 介绍 这部分将提供一个快速的入门向导,在vs.NET的任何一个版本上面使用TestDriven.NET TDD(测试驱动开发)在你写你的代码之前,写 ...

  4. static关键字修饰类

    今天继续研究公司的新项目,据说是京东的架构,研究看了一番,果然很牛逼,大致是Maven+spingmvc+spring+mybatis+ehcache+velocity来搭建的,数据库用的是mysql ...

  5. Oracle新建用户、角色,授权,建表空间

    oracle数据库的权限系统分为系统权限与对象权限.系统权限( database system privilege )可以让用户执行特定的命令集.例如,create table权限允许用户创建表,gr ...

  6. cocos2d-x 多线程以及线程同步

    转自:http://blog.csdn.net/zhy_cheng/article/details/9116479 cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作 ...

  7. C++的XML编程经验――LIBXML2库使用指南[转]

    C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML ...

  8. 如何防止ListView控件闪烁

    如何防止ListView控件闪烁 beginupdate()和endupdate()之间写代码   ListView1.Items.BeginUpdate;ListView1.Items.Add('A ...

  9. xcode 左边导航栏中,类文件后面的标记“A”,&quot;M&quot;,&quot;?&quot;……等符号的含义???

    "M" = Locally modified    "U" = Updated in repository  "A" = Locally a ...

  10. mysql索引需要了解的几个注意

    板子之前做过2年web开发培训(入门?),获得挺多学生好评,这是蛮有成就感的一件事,准备花点时间根据当时的一些备课内容整理出一系列文章出来,希望能给更多人带来帮助,这是系列文章的第一篇 注:科普文章一 ...