Android开发实战之ViewPager的轮播

在安卓开发的许多控件中,如果你没有使用过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其他相关,如果你觉得博主写的不错,可以推荐一波~,有什么写的不对和不好的地方

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

时间: 2024-12-19 06:53:37

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

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

最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面布局实现如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&

Android使用ViewPager做轮播

ViewPager.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin: 0 0 10px; padding: 8px 10px 0; font: 13.34px/1.4 helvetica, arial, freesans, clean, sans-serif; width: 452px; background-color: #fff } div.oembedall-git

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

背景 近期要做一个轮播图的效果.网上看了几篇文章.基本上都能找到实现,效果还挺不错,可是在写的时候感觉每次都要单独去又一次在Activity里写一堆代码.于是自己封装了一下.这里仅仅是做了下封装成一个控件,不必每次反复写代码了. 效果图 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还须要在以下加一个指示器来标示滑动到了第几张轮播图.指示器我们能够用一个线性布局来依据要展示的轮播图设置显示的View,我们要做这种一个控件没

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

Xamarin Android开发实战(上册)大学霸内部资料 试读文档下载地址:http://pan.baidu.com/s/1jGEHhhO 密码:vcfm 介绍: 本教程是国内唯一的Xamarin Android开发专向教程.本教程详细讲解如何基于Windows系统,在Visual Studio 2013开发环境中,使用Xamarin开发Android应用APP. 目  录 第1章  Xamarin开发Anroid应用介绍 1 1.1  Xamarin基本知识 1 1.1.1  Xamari

Android开发实战(十八):Android Studio 优秀插件:GsonFormat

原文:Android开发实战(十八):Android Studio 优秀插件:GsonFormat Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat ------------------------------------------------------------------------------------------------------- 这几天没有活,于是乎整理了一些代码,顺便把一些一直在使用的东西也整理下,然后学

我为什么要写《OpenCV Android 开发实战》这本书

我为什么要写<OpenCV Android 开发实战>这本书 2015年我出版了个人第一本关于图像处理方面的书籍<Java图像处理-编程技巧与应用实践>,这本书主要是从理论与编码上面详细阐述了图像处理基础算法以及它们在编码实现上的技巧.一转眼已经三年过去了,在这三年的时光里我无时无刻都在关注图像处理与计算机视觉技术发展与未来,同时渐渐萌发了再写一本图像处理相关技术书籍的念头,主要是因为<Java图像处理-编程技巧与应用实践>一书主要不是针对工程应用场景,读者在学完之后很

iOS开发项目实战——Swift实现图片轮播与浏览

最近开始开发一个新的iOS应用,自己决定使用Swift,进行了几天之后,发现了一个很严峻的问题,那就是不管是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是找到Swift的资源,一看,大概是半年前的代码,或是一年前的代码,一运行,全都报错.这是由于毕竟Swift还是在不断发展完善当中,随着Swift2.0的开源以来,包括发布Swift这一年多以来,Swift的改动还是很大的,很多的接口或是语法前后有较大差异.有些功能只能自己硬生生看官方文档或挤破脑子想,

viewpager实现轮播图效果

在很多app中我们都有轮播图的效果,特别是一些电商类的app,大部分都有此功能,今天就简单的模仿下,还有一个自动跳动的小功能,这个用定时器实现就行,话不多说直接上代码: import java.util.ArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import

Android事件分发学习应用-图片轮播实现

前一篇写到Android事件分发机制学习笔记,下面我们通过一个实例的应用来实践理解下Android事件分发的机制.我们这里来实现一个图片的轮播功能,最后顺便实现下图片的自动轮播. 我们的图片轮播是封装在一个ViewGroup里,当我们进行横向滑动的时候,我们需要阻止事件从ViewGroup往子控件分发,ViewGroup来消费我们当前的滑动图片何去何从.下面我们贴出我们的封装的ViewGroup的代码实现如下: public class ImageSwitcher extends ViewGro