一、概述:

ViewPager 是android扩展包v4包中的类,这个类可以实现左右切换当前的view。

下面是API对它的描述:
Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows.
Note this class is currently under early design and development. The API will likely change in later updates of the compatibility library, requiring changes to the source code of apps when they are compiled against the newer version.
ViewPager is most often used in conjunction with Fragment, which is a convenient way to supply and manage the lifecycle of each page. There are standard adapters implemented for using fragments with the ViewPager, which cover the most common use cases. These are FragmentPagerAdapter andFragmentStatePagerAdapter; each of these classes have simple code showing how to build a full user interface with them.

由文档得知:

  • 1)ViewPager类直接继承了ViewGroup类,显然它也是一个容器控件。
  • 2)类似于ListView的三要素(布局,数据,适配器),ViewPager类也需要一个PagerAdapter适配器类给它提供数据。
  • 3)ViewPager经常和Fragment一起使用。并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
  • 此外,还需要使用两个组件类,分别是PagerTitleStrip类和PagerTabStrip类。PagerTitleStrip类直接继承自ViewGroup类,而PagerTabStrip类继承PagerTitleStrip类,所以这两个类也是容器类。但是有一点需要注意,在定义XML的layout的时候,这两个类必须是ViewPager标签的子标签,不然会出错。

二、PageAdapter 必须重写的四个函数:

  • boolean isViewFromObject(View arg0, Object arg1)
  • int getCount()
  • void destroyItem(ViewGroup container, int position,Object object)
  • Object instantiateItem(ViewGroup container, int position)

三、代码:

此处简单介绍一下上面不带title,下面带点的用法:

xml布局文件:

<?xml version="1.0" encoding="utf-8"?><FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="200dp" tools:context="com.myapplication.viewpagerdemo.MainActivity" >    <android.support.v4.view.ViewPager  android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" />    <LinearLayout  android:id="@+id/linearLayout_points" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:gravity="center" android:orientation="horizontal" /></FrameLayout>

MainActivity中代码:

package com.myapplication.viewpagerdemo;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;/** * viewPager动态添加圆点,选中该pager时候对应圆点变色 */public class MainActivity extends AppCompatActivity {    private ViewPager viewPager;    private LinearLayout linearLayout;    private List<ImageView> list = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();        addPoints();        setPagerListener();        autoBanner();    }    //自动播放    private void autoBanner() {        Timer timer = new Timer();        TimerTask timerTask = new TimerTask() {            @Override            public void run() {                if (list.size() > 1) {//多于1个,才循环                    //子线程不能更新Ui,把主线程请到子线程家里来                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            int index = viewPager.getCurrentItem();                            index = (index + 1) % list.size();                            viewPager.setCurrentItem(index, true);                            //第二个参数布尔值:True to smoothly scroll to the new item, false to transition immediately                        }                    });                }            }        };        //开始一个定时任务,首次执行延迟3000毫秒调用run方法,执行后每2500毫秒执行一次        timer.schedule(timerTask, 3000, 2500);    }    //注册监听,当pager变化,切换圆点颜色    private void setPagerListener() {        switchPoint(0);        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            }            @Override            public void onPageSelected(int position) {                switchPoint(position);            }            @Override            public void onPageScrollStateChanged(int state) {            }        });    }    //遍历圆点,如果id为选中位置就切换颜色    private void switchPoint(int position) {        ImageView imageView;        for (int i = 0; i < linearLayout.getChildCount(); i++) {            imageView = (ImageView) linearLayout.getChildAt(i);            if (i == position) {                imageView.setImageResource(R.drawable.point);            } else {                imageView.setImageResource(R.drawable.point_f);            }        }    }    private void addPoints() {        for (int i = 0; i < list.size(); i++) {            ImageView imgPoint = new ImageView(this);            imgPoint.setImageResource(R.drawable.point_f);            //设置布局属性            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(                    LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);            lp.setMargins(5, 0, 0, 0);            imgPoint.setLayoutParams(lp);            //将添加的小圆点,加到布局中            linearLayout.addView(imgPoint);        }    }    private void init() {        viewPager = (ViewPager) findViewById(R.id.viewPager);        linearLayout = (LinearLayout) findViewById(R.id.linearLayout_points);        //为每个pager添加布局,此处布局是一张图片        ImageView slide1 = new ImageView(this);        slide1.setImageResource(R.drawable.picture1);        ImageView slide2 = new ImageView(this);        slide2.setImageResource(R.drawable.picture2);        ImageView slide3 = new ImageView(this);        slide3.setImageResource(R.drawable.picture3);        list.add(slide1);        list.add(slide2);        list.add(slide3);        viewPager.setAdapter(adapter);    }    //适配器,重写四方法,也可以单独写一个类,    private PagerAdapter adapter = new PagerAdapter() {        //getCount():返回要滑动的VIew的个数        @Override        public int getCount() {            return list.size();        }        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        //做了两件事,第一:将当前视图添加到container中,第二:返回当前View        @Override        public Object instantiateItem(ViewGroup container, int position) {            container.addView(list.get(position));            return list.get(position);        }        //从当前container中删除指定位置(position)的View;        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            //super.destroyItem(container, position, object);            container.removeView(list.get(position));        }    };}

说明:

1,关于timer.schedule():

  • 第一个参数,是 TimerTask 类,在包:import java.util.TimerTask .使用者要继承该类,并实现public
    void run() 方法,因为 TimerTask 类 实现了 Runnable 接口。
  • 第二个参数的意思是,当你调用该方法后,该方法必然会调用 TimerTask 类 TimerTask 类 中的
    run()方法,这个参数就是这两者之间的差值,转换成汉语的意思就是说,用户调用 schedule()
    方法后,要等待这么长的时间才可以第一次执行run() 方法。
  • 第三个参数的意思就是,第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法。

2、自动播放:

除了使用计时器,还可以使用Thread.sleep方法。
参考我的另一篇博客:
《Handler弱引用举例(ViewPager的自动播放)》

如果不是简单图片那么ImageView还可以用一个布局代替,对应的写三个布局文件,然后代码修改一下即可:

viewPager = (ViewPager) findViewById(R.id.viewpager); LayoutInflater inflater=getLayoutInflater(); view1 = inflater.inflate(R.layout.layout1, null); view2 = inflater.inflate(R.layout.layout2,null); view3 = inflater.inflate(R.layout.layout3, null); viewList = new ArrayList<View>();// 将要分页显示的View装入数组中 viewList.add(view1); viewList.add(view2); viewList.add(view3); 

更多相关文章

  1. 关于greenDao函数报错
  2. RelativeLayout布局属性详解
  3. ANDROID NDK makefile 链接静态库的方法
  4. Android两种 旋转Bitmap方法
  5. Android(安卓)开发中的  AsyncTask 的用法记录
  6. Android(安卓)GPS学习 (二) :GPS 服务启动以及初始化流程
  7. Android(安卓)studio新建activity运行出错解决方法
  8. android gpuimage显示的缩放和剪裁模式
  9. Android学习之保持屏幕常亮的几种方法

随机推荐

  1. Android的近场通信---NFC概要
  2. Android(安卓)Dev Guide 中文版二 (原创,请
  3. 图像模糊处理RenderScript
  4. Android(安卓)WebView 输入框键盘不弹出
  5. Android中Toast的常用使用方式总结
  6. android Logcat报错 CLEARTEXT communica
  7. Android中通过反射来设置Toast的显示时间
  8. Android中图片的三级缓存策略
  9. 如何在App中实现IM功能之三快速实现离线
  10. Android(安卓)11正式发布:小米、OPPO等手