在安卓开发的许多控件中,如果你没有使用过ViewPager,就不能算是一个安卓开发工程师,在本篇博文中,我会总结ViewPager的使用方法,

以及一些开发中的拓展。希望本篇博文对你的学习和工作有所帮助。

**ViewPager的基本使用**

ViewPager的使用遵循MVC模式,M(模型),V(视图),C(控制器)。模型就是viewpager对象,视图就是xml视图,控制器就是适配器adapter。所以,

要实现一个完整的ViewPager这三个东西一个都不能少。

xml:

<?xml version="1.0" encoding="utf-8"?>
<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.yakir.myapplication.MainActivity">
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/vp"
android:background="#7c3535"></android.support.v4.view.ViewPager>
</RelativeLayout>

viewpager对象:

ViewPager viewPager= (ViewPager) findViewById(R.id.vp);

适配器adapter:

一般的需要我们重写四个方法:

getCount(),返回viewpager显示页数。

isViewFromObject(View view, Object object),返回view==object,这里其实是对viewpager起到了一个优化的作用,具体不细讲,本人比较懒,这里是一般的通用写法。

destroyItem,让viewgroup移除view。

instantiateItem,这个方法用于显示viewpager中的每个view的内容,返回的是object对象。

    private class MyAdapter extends PagerAdapter {

        @Override
public int getCount() {
//返回viewpager的可滑动页数
return 5;
} @Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
} @Override
public Object instantiateItem(ViewGroup container, int position) {
TextView textView=new TextView(getApplicationContext());
textView.setText("这是第"+(position+1)+"页");
textView.setTextSize(20);
//将这个view加都父容器中
container.addView(textView);
//返回view
return textView;
}
}

将viewpager和adapter关联起来:

viewPager.setAdapter(new MyAdapter());

好了一个简单的viewpager就写好了,让我们看看效果:

**ViewPager拓展实现自动轮播**

自动轮播的viewpager其实很常见了,淘宝手机版,网易新闻等等许多的app都有自动轮播。这就需要我们用到消息传递机制。

首先,让他跳转到下一个界面,我们可以通过viewpager的setCurrentItem设置让其跳转到下一个界面。通过handler的消息机制,

让其在固定的时间发送一条消息,让其更新UI。但是,如果单单只是休息固定时间是远远不够的,因为handler会不断处理消息,这样

我们所要的轮播时间会越来越快,需要在让他轮滑后,再休息一段时间,再进行轮换。具体代码如下:

 Handler handler=new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
viewPager.setCurrentItem((viewPager.getCurrentItem()+1)%viewPager.getAdapter().getCount());
handler.postDelayed(new Runnable() {
@Override
public void run() {
handler.obtainMessage().sendToTarget();
}
}, 1000);
}
};
 handler.postDelayed(new Runnable() {
@Override
public void run() {
handler.obtainMessage().sendToTarget();
}
},1000);

以下是效果图:

这就是轮播的核心代码思想,为了使用方便我将它封装了起来:

/**
* 对轮播的事件进行封装
*/
private class PagerTask extends Handler implements Runnable {
public void startTask() {
stopTask();
postDelayed(this, 2000);
} public void stopTask() {
removeCallbacksAndMessages(null);
} @Override
public void run() {
vp_carousel.setCurrentItem((vp_carousel.getCurrentItem() + 1) % vp_carousel.getAdapter().getCount());
postDelayed(this, 2000);
}
}

关于轮播,如果你够细心你会发现,当轮播到最后一张图的时候,它是重新跳转到最后一页,而类似于网易新闻,即时位于第一页往左滑动也能进入最后一页,

也就是viewpager的左右滑动,那么这又是如何出现的呢?其实实现方式也比较简单,首先要知道,当Viewpager处于第一页和最后一页的时候是不能滑动的,

那么,只有当viewpager的页数无限大的时候,才可以实现无限的滑动。也就是count为无穷,当你设置最大的时候如何保证显示页数不为无穷呢,我们就需要

对viewpager的位置取余,让他固定显示我们需要显示的viewpager页数。同时还要计算好默认显示的第一页,这样就可以实现无限循环的viewpager了。

viewPager.setCurrentItem(Integer.MAX_VALUE/2-Integer.MAX_VALUE/2%5);//设置当前位置,后面参数为偏差量
     @Override
public int getCount() {
//返回viewpager的可滑动页数
return Integer.MAX_VALUE;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position=position%5;//取余让他只显示5张
TextView textView=new TextView(getApplicationContext());
textView.setText("这是第"+(position+1)+"页");
textView.setTextSize(20);
container.addView(textView);
return textView;
}

以下是效果图:

好了,ViewPager的简单应用就先介绍到这,后面我还会接着介绍有关ViewPager其他相关,如果你觉得博主写的不错,可以推荐一波~,有什么写的不对和不好的地方

欢迎留言指正,互相交流与学习,最后希望这篇博文对各位有所帮助。

Android开发实战之ViewPager的轮播的更多相关文章

  1. Android 开发最牛的图片轮播控件,基本什么都包含了。

    Android图片轮播控件  源码下载地址: Android 图片轮播 现在的绝大数app都有banner界面,实现循环播放多个广告图片和手动滑动循环等功能.因为ViewPager并不支持循环翻页, ...

  2. Android开发案例 设置背景图片轮播

    点击按钮实现图片轮播效果 实践案例: xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  3. Android开发实战之ViewPager实现向导界面

    当我们更新应用,或者第一次进入应用时都会有一个向导界面,介绍这个app的内容和使用方式. 如果你细心你会发现其实这就是个viewpager,本篇博文将介绍应用的向导界面是如何制作的.希 望本篇博文对你 ...

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

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

  5. Android使用ViewPager做轮播

    ViewPager.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin: 0 ...

  6. Android真正意义上的无限轮播Banner

    在android开发的时候,经常会使用到轮播图,对于这种效果,一般情况下,我们都会使用一种叫做ViewPager的来实现. 传统的实现逻辑是自定义一个View继承ViewPager,在适配器中 将co ...

  7. Android自己定义控件之轮播图控件

    背景 近期要做一个轮播图的效果.网上看了几篇文章.基本上都能找到实现,效果还挺不错,可是在写的时候感觉每次都要单独去又一次在Activity里写一堆代码.于是自己封装了一下.这里仅仅是做了下封装成一个 ...

  8. Xamarin Android开发实战(上册)大学霸内部资料

    Xamarin Android开发实战(上册)大学霸内部资料   试读文档下载地址:http://pan.baidu.com/s/1jGEHhhO 密码:vcfm 介绍: 本教程是国内唯一的Xamar ...

  9. Android开发实战(申明:来源于网络)

    Android开发实战(申明:来源于网络) 地址:http://so.csdn.net/so/search/s.do?q=Android%E5%BC%80%E5%8F%91%E5%AE%9E%E6%8 ...

随机推荐

  1. 在MEF中实现延迟加载部件(转)

    在MEF的宿主中,当我们通过Import声明导入的对象时,组装(Compose)的时候会创建该对象.例如: interface ILogger    {        void Log(string  ...

  2. 解决ueditor中没法动态配置imageurlprefix的方法

    [建议使用右边文章中的方法,本篇文章没有真正的解决问题](新)解决php版本ueditor中动态配置图片URL前缀(imageurlprefix)的方法 修改背景,由于后台图片是上传到挂载的静态资源磁 ...

  3. Ubuntu上kubeadm安装Kubernetes集群

    一 创建VM 3台VM,其中一台为master节点,2台work node: 二 安装相关软件 在所有节点上运行: apt-get update apt-get install apt-transpo ...

  4. idea之jrebel热部署使用教程

    JRebel是一个J2EE热部署的工具.使用它可以减少浪费8-18%的开发时间在项目的构建和部署上.虽然Java也提供了HotSpot的JVM,但是如果你修改的类中有方法名称变动的话,HotSpot就 ...

  5. 干净的 js测试页面

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

  6. Nginx+jwPlay搭建流媒体服务器,记忆播放

    1.具体的流媒体服务器的搭建参考博客: http://blog.chinaunix.net/uid-20639775-id-154556.html 具体可能编译的时候有个地方报错 /root/ngin ...

  7. mac链接linux

    连接 : ssh 用户名@主机名   -- ssh -p 22 root@47.98.164.34 上传:  scp  要上传的文件名称    用户名@主机名:上传到的路径 下载: scp 用户名@主 ...

  8. Java-Runoob:Java 数组

    ylbtech-Java-Runoob:Java 数组 1.返回顶部 1. Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言 ...

  9. 第十三章 hadoop机架感知

    背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...

  10. 029:高可用之MHA

    高可用之MHA 一.MHA 简介 MHA(Master High Availability)是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能 ...