ViewPager的基本使用--可左右循环切换也可自动切换

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

时间: 2024-10-13 01:24:46

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

网络请求UI自动切换框架

1. 概述与分析 在实际项目中,我们不可避免的需要网络请求数据,由于网络或请求方式等主观或客观原因,导致我们请求的结果有时会出现一些偏差,从而导致我们UI界面显示也会有所不同.一般情况下,网络请求后我们的界面一般呈现三种页面状态:"正在加载中"."加载失败"和"加载成功".那么就可以通过网络请求后结果让UI界面自动切换, 2. 设计思路 通常情况下,正在加载和加载失败的界面都是相同的,只有加载成功后的界面不同.为了能让UI界面随着网络请求结果自动

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

利用定时器,实现循环轮播,很简单:只需在定时器的消息里加如下代码即可: [java] view plaincopy int count = adapter.getCount(); if (count > 1) { // 多于1个,才循环 int index = viewPager.getCurrentItem(); index = (index + 1) % count; viewPager.setCurrentItem(index, true); } 但如何在手指拨动时,也支持左右无限循环的功

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

在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图:           实现一个自动播放功能的ViewPager,要做的主要有以下的几个部分: 实现一个ViewPagerAdapter,用于为ViewPager提供展示内容(例如上面的两张小猫图片) public class ViewPagerAdapter extends PagerAdapter { private List<V

ViewPager之多页面滑动切换+游标滑动+ 自动无限轮转+触摸停止

我们先看下效果图 上图是我们需要实现的效果图,功能有如下三个: 1. 手势滑动可以切换界面,点击上面的引导一到引导四也可以切换到相应的画面. 2. 切换界面时,引导一到引导四下面的横线会相应的移动到对应的地方. 3. 没有手势时,界面会自动轮转,有种广告轮转的效果:有手势是,会停止轮转. 这次要实现的是第三个功能,实现第三个功能主要用到Handler和ViewPager的触摸监听器. Handler是为了实现隔一段时间自动切换页卡,因此需要定义一个Handler的对象,来处理自动切换,具体思想是

[Android UI]可自动切换、无限滑动的图片广告展示栏的实现分享(续1)

本文非技术类文章,博主只是想分享这样的一种实现方法,帮助有需要的开发人员减少工作量.我是学java出身的,做开发2年了,很理解一句话:工欲善其事必先利其器. 继另一篇博文:[Android初级]可自动切换.无限滑动的广告栏的实现  ,我觉得还有更好的方式来展示,这个比较合适更多开发人员. 本次实现的demo,用到了第三方的开源框架:1.JazzyViewPager https://github.com/jfeinstein10/JazzyViewPager(主要用它,效果比较多) 2.unive

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

效果图: 该banner功能有自动切换图片,点击图片可以自定义事件,手动滑动切换,异步加载图片 代码说话: 布局文件: <!-- 广告位 --> <FrameLayout android:id="@+id/new_recommend" android:layout_width="fill_parent" android:layout_height="wrap_content" > <com.cyou.cmall.ui

js自动切换轮播图

思路:左右切换--左右切换(加上小圆点)--小圆点点击--动画效果--自动切换 html: <div id="container"> <div id="list" style="left: -600px;"> <img src="images/55.jpg" alt="1"> <img src="images/11.jpg" alt="

千兆/万兆网络自动切换脚本

需求:现在IDC需要改造万兆网络,由于是单链路,前期需要利用现有的千兆网络来做冗余,当万兆网络出问题以后自动切换到千兆环境,确保网络自动恢复: #!/bin/bash # * ******************************************************************************************************* # * Date: 2015-10-16 # * Author: Created by Ctry # * Email

Linux使用shell自动切换网关

编写名为auto_change_gw.sh的脚本,用来自动切换主机网关,相关说明如下: 1)有2个可用的网关地址,分别是主网关192.168.10.254和备用网关192.168.10.253,当前使用的默认网关是192.168.10.254: 2)若当前使用的网关地址192.168.10.254出现问题,自动把网关地址切换为192.168.10.253: 3)当网关地址192.168.10.254能正常工作后,当前主机再把网关地址切换到192.168.10.254. 讲下思路: 1.先用whi