ViewPager轮播图

ViewPager: 轮播图

下面的ViewPager由LinearLayout,textView,点的容器组成;

ViewPager

页面切换,定时页面切换

VP技术点:

1、使用第三方UI类,只需要将完整包名加入就行
2、Timer和ScheduledExecutorService
3、Handler+Message或者runOnUiThread(runnable)更新界面ui
4、ViewPager的适配器类

VP步骤:

1、布局

##viewpager的使用方法

      注意:

1.首先在XML配置

<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewpager" />

2.把需要填充到ViewPager的View,先添加到ArrayList集合内(为了让PagerAdapter可以获取到需要填充的View)

思维形成:看到setAdapter就要想到List<数据类型>

ArrayList<View> list = new ArrayList<View>();

list.add(View.inflate(MainActivity.this, R.layout.layout1, null));

list.add(View.inflate(MainActivity.this, R.layout.layout2, null));

list.add(View.inflate(MainActivity.this, R.layout.layout3, null));

list.add(View.inflate(MainActivity.this, R.layout.layout4, null));

ViewPager的步骤

1. 实现一个PagerAdapter的子类MyPagerAdapter。

2. 实现里面的4个方法。

3. getCount()返回当前的viewpager里面有几页。

4. isViewFromObject()内部优化的逻辑

return view == object; //这个方法固定写法,其实可以不暴露出来的

5. 实现instantiateItem 实例化的逻辑,根据位置 返回view对象(否则报异常)

//为当前页面添加View

viewpager.addView(list.get(position));

return list.get(position);

6. 实现destroyItem ,销毁view对象的逻辑( 把super 删除,否则也报异常)

//注意集合的数据是不可以删除的

viewpager.removeView(list.get(position));

7. 生成apk的时候 记得配置 export 输入。

2、将要显示的图片,文字分别用int和String数组存起来
3、然后将布局中的显示的ImageView和显示的状态点分别存到一个ArrayList中去
4、设置viewpager的变化事件
5、在变化页面 onPageSelected中,将对应的文本标题和状态的点显示正确定时切换页面;

a)使用ScheduledExecutorService而不是Timer,
b)定时的切换,使用handler+Message更新界面

在Activity可见(onStart)时,开启定时,不可见时(onStop)时,关闭定时
可见时,将当前的item页面也增加1
@Override

protected void onStart() {

super.onStart();

scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length);

Runnable command = new Runnable() {

@Override

public void run() {

runOnUiThread(new Runnable() {

@Override

public void run() {

// 将当前页面增加1,然后取余,为了保证最后一页可以循环到第一页page

currentItem = (currentItem + 1) % imageIds.length;

viewPager.setCurrentItem(currentItem);

}

});

}

};

scheduledExecutorService.scheduleWithFixedDelay(command , 2, 2, TimeUnit.SECONDS);

}

@Override

protected void onStop() {

super.onStop();

if (scheduledExecutorService != null) {

scheduledExecutorService.shutdown();

}

}

核心代码:

public class MainActivity extends Activity {
 
    private int imageIds[];
    private String descs[];
 
    private List<ImageView> images;
    private List<View> dots;
 
    private ViewPager viewPager;
    private PagerAdapter pagerAdapter;
 
    private TextView tv_desc;// 图片描述
 
    private int oldPosition = 0;// 记录切换页面前一个页面的位置
    private int currentItem;// 当前page的位置
 
    private ScheduledExecutorService scheduledExecutorService;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // 1、图片资源id数组
        imageIds = new int[] {
            R.drawable.a,
            R.drawable.b,
            R.drawable.c,
            R.drawable.d,
            R.drawable.e
        };
 
        // 2、图片描述数组
        descs = new String[] {
            "巩俐不低俗,我就不能低俗",   
            "扑树又回来啦!再唱经典老歌引万人大合唱",   
            "揭秘北京电影如何升级",   
            "乐视网TV版大派送",   
            "热血屌丝的反杀"
        };
 
        // 3、要显示的ImageView集合
        images = new ArrayList<ImageView>();
        for (int imageId : imageIds) {
            ImageView iv = new ImageView(this);
            iv.setImageResource(imageId);
            images.add(iv);
        }
        // 4、要显示的状态点dot集合
        dots = new ArrayList<View>();
        dots.add(this.findViewById(R.id.dt1));
        dots.add(this.findViewById(R.id.dt2));
        dots.add(this.findViewById(R.id.dt3));
        dots.add(this.findViewById(R.id.dt4));
        dots.add(this.findViewById(R.id.dt5));
 
        // 初始化数据完毕----------------------
 
        tv_desc = (TextView) this.findViewById(R.id.tv_desc);
        tv_desc.setText(descs[0]);
 
        viewPager = (ViewPager) this.findViewById(R.id.view_pager);
        pagerAdapter = new MyPagerAdapter();
        viewPager.setAdapter(pagerAdapter);
        // viewPager.setCurrentItem(oldPosition);//设置当前显示的item
 
        // 设置viewPager的page改变事件
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
 
            // 另外一张page被完全展示的时候,调用,参数代表当前page的位置,从0开始
            @Override
            public void onPageSelected(int position) {
                // System.out.println("onPageSelected:" + i);
 
                // 文字title改变
                tv_desc.setText(descs[position]);
 
                // 点dot改变,前一个位置变成normal,当前变成enabled
                dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
                dots.get(position).setBackgroundResource(R.drawable.dot_enable);
 
                // 更新上一个位置为当前位置
                oldPosition = position;
                currentItem = position;
            }
 
            // page在拖动的过程中,调用该方法
            @Override
            public void onPageScrolled(int i, float f, int j) {
                // System.out.println("onPageScrolled:");
            }
 
            // 只要状态一变化就调用,page滚动开始和结束时会调用,状态变化:1-2-0
            @Override
            public void onPageScrollStateChanged(int i) {
                // System.out.println("onPageScrollStateChanged:" + i);
            }
        });
    }
 

 pageadapter适配器

    private class MyPagerAdapter extends PagerAdapter {
        /**
         * viewpager的长度
         */
        @Override
        public int getCount() {
            return imageIds.length;
        }
 
        // 判断是同一个view
        /**
         * 判断滑动的控件和将要显示的控件是否为同一个 true 直接复用 false 会调用instantiateItem() 得到一个新的对象
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
 
        /**
         * 移除ImageView对象
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // super.destroyItem(container, position, object);//这个要注释掉
            // View view = container.getChildAt(position);
            // container.removeView(view);
            // container.removeViewAt(position);
            container.removeView(images.get(position));
        }
 
        /**
         * 得到一个Object对象就是ImageView
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(images.get(position));
            return images.get(position);
        }
  }
 
    @Override
    protected void onStart() {
        super.onStart();
        scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length);
        Runnable command = new Runnable() {
 
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
 
                    @Override
                    public void run() {
                        // 将当前页面增加1,然后取余,为了保证最后一页可以循环到第一页page
                        currentItem = (currentItem + 1) % imageIds.length;
                        viewPager.setCurrentItem(currentItem);

                    }
                });
            }
        };
        scheduledExecutorService.scheduleWithFixedDelay(command , 2, 2, TimeUnit.SECONDS);
    }
 
    @Override

    protected void onStop() {
        super.onStop();
        if (scheduledExecutorService != null) {
            scheduledExecutorService.shutdown();
        }
    }
}


 

来自为知笔记(Wiz)

时间: 2024-12-20 14:55:07

ViewPager轮播图的相关文章

Android——ViewPager和内部view之间的事件分发及轮播图

viewpager 在滑动的过程中是如何触发view身上的事件的,换句话说,viewpager在滑动的过程中到底是滑动的它里面的view,还是滑动的viewpager本身? 一.示例代码: 1.自定义ViewPager:MyViewPager,重新dispatchTouchEvent方法,添加一些事件处理的log信息. package com.example.viewpagerdemo; import android.content.Context; import android.support

viewpager实现轮播图效果

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

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实现的轮播图广告自定义视图,网络获取图片和数据

public class SlideShowAdView extends FrameLayout { //轮播图图片数量    private static int IMAGE_COUNT = 3;    //自动轮播的时间间隔    private final static int TIME_INTERVAL = 5;    //自动轮播启用开关    private final static boolean isAutoPlay = false;       //自定义轮播图的资源ID   

自定义完美的ViewPager 真正无限循环的轮播图

网上80%的思路关于Android轮播图无限循环都是不正确的,不是真正意义上的无限循环, 其思路大多是将ViewPager的getCount方法返回值设置为Integer.MAX_VALUE, 然后呢将ViewPager的当前展示页设置为第1000页或者是10000页,这样用户一般情况下是滑不到边界的 例如有5张图片的轮播图,item的编号为(0,1,2,3,4)当前页的页号如果是5, 这时候就将编号设置为0,即 actPosition %= datas.size();这个公式就是这么来的 这种

Android ViewPager实现循环轮播图

一.原理 ViewPager是Android中使用频率相对较高的view组件,同时对滑动过程中的事件进行了处理,因此非常适合轮播图.关于轮播图的实现,有很多方法,使用HorizontalView或者RecylerView也可以实现,但是需要处理fling操作,这里我们用ViewPager避免这些工作. 网上有很多关于ViewPager轮播的轮播实现,其原理大多数给PagerAdapter的getCount 放大N倍,N大于100,1000等.这里我们使用另一种思路,数据映射. 数据映射方案:假设

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

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

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

背景 最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码.于是自己封装了一下.本篇轮播图实现原理原文出处:循环广告位组件的实现,这里只是做了下封装成一个控件,不必每次重复写代码了. 效果图 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还需要在下面加一个指示器来标示滑动到了第几张轮播图.指示器我们可以用一个线性布局来根据要展示的轮

android中广告轮播图总结

功能点:无限轮播.指示点跟随.点击响应.实现思路: 1.指示点跟随,指示点通过代码动态添加,数量由图片数量决定. 在viewpager的页面改变监听中,设置点的状态选择器enable,当前页时,setEnable(true),非当前页设置为false.由于图片是从网络获取,数量不定,所以此处不能使用switch写死,需要设置变量记录当前和前一个.代码如下: llAddPoint为添加指示点的线性布局 prePosition为前一个位置,初始化时设为0,newPosition为当前位置 int n