zoukankan      html  css  js  c++  java
  • 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其他相关,如果你觉得博主写的不错,可以推荐一波~,有什么写的不对和不好的地方

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

  • 相关阅读:
    Netty实现客户端和服务端通信简单例子
    上拉电阻的作用
    c语言常量指针赋值给变量指针导致警告
    修改ultisnips的默认键
    为debian8.2更换官方源
    linux下添加用户到sudo组
    用rfkill命令管理蓝牙和wifi
    用platformio编写arduino程序
    ubuntu下gcc-avr安装
    UNIX环境高级编程(第三版)关于apue.h的用法
  • 原文地址:https://www.cnblogs.com/lovelyYakir/p/5797153.html
Copyright © 2011-2022 走看看