资讯专栏INFORMATION COLUMN

Android项目实战(四十七):轮播图效果Viewpager

2shou / 2482人阅读

摘要:简易常用的轮播图效果,老技术了,记一笔留着以后需求如下不定张个数的轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最后一张图片自动切换后的为第一张图片,手指触摸可以滑动。

简易、常用的轮播图效果ViewPager ,老技术了,记一笔留着以后ctrl C + ctrl V 

 

需求如下:

不定张个数的ImagView轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最后一张图片自动切换后的为第一张图片,手指触摸可以滑动。

 

 

 

思路:

初始化Viewpager和轮播点之后  , 开启一个子线程,每隔3秒判断一次 当前位置是不是轮播图数据个数的最后一个位置,是的话切换到第一张图片,不是的话切换到下一张图片

 

一、先看布局文件,根容器为相对布局,里面放一个ViewPager控件,并在ViewPager 控件右下角位置放一个线性布局,用于动态添加轮播点




    
    
        
        
        
        

    

 

 

二、Activity 几个生命周期以及关键方法

 

1、initData()方法

 private void initData() {
        viewPagerData = new ArrayList<>();
        ImageView imageView = new ImageView(this);
        /*添加图片资源,实际开发中为for循环即可 ,这里demo麻烦了*/
        // 第一张图片
        imageView.setBackgroundResource(R.mipmap.aaa);
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        viewPagerData.add(imageView);

        // 第二张图片
        ImageView imageView2 = new ImageView(this);
        imageView2.setBackgroundResource(R.mipmap.bbb);
        imageView2.setScaleType(ImageView.ScaleType.FIT_XY);
        viewPagerData.add(imageView2);

        // 第三张图片
        ImageView imageView3 = new ImageView(this);
        imageView3.setBackgroundResource(R.mipmap.ccc);
        imageView3.setScaleType(ImageView.ScaleType.FIT_XY);
        viewPagerData.add(imageView3);
    }

 

  

 2、initDots()方法

   /**
     * 动态创建轮播图位置点显示
     */
    private void initDots() {
        // 动态添加轮播图位置点 , 默认第0个位置 为当前轮播图的颜色
        for (int i = 0; i < viewPagerData.size(); i++) {
            imageView = new ImageView(this);
            if (i==0) {
                imageView.setBackgroundColor(Color.parseColor(SelectColor));
            }else{
                imageView.setBackgroundColor(Color.parseColor(unSelectColor));
            }
            imageView.setLayoutParams(new LinearLayout.LayoutParams(dip2px(8), dip2px(8)));
            setMargins(imageView,dip2px(2),0,dip2px(2),0);
            lyDot.addView(imageView);
        }
    }

 

 

 3、initViewPager()方法

private void initViewpager() {
        //数据适配器
        viewPagerAdapter = new PagerAdapter() {
            private int mChildCount = 0;

            @Override
            public void notifyDataSetChanged() {
                mChildCount = getCount();
                super.notifyDataSetChanged();
            }

            @Override
            public int getItemPosition(Object object) {
                if (mChildCount > 0) {
                    mChildCount--;
                    return POSITION_NONE;
                }
                return super.getItemPosition(object);
            }

            @Override
            //获取当前窗体界面数
            public int getCount() {
                // TODO Auto-generated method stub
                return viewPagerData.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }

            //是从ViewGroup中移出当前View
            public void destroyItem(View arg0, int arg1, Object arg2) {
                ((ViewPager) arg0).removeView(viewPagerData.get(arg1));
            }

            //返回一个对象,这个对象表明了PagerAdapter适配器选择哪个对象放在当前的ViewPager中
            public Object instantiateItem(View arg0, int arg1) {
                ((ViewPager) arg0).addView(viewPagerData.get(arg1));
                return viewPagerData.get(arg1);
            }
        };

        viewpager.setAdapter(viewPagerAdapter);
        viewpager.setCurrentItem(0);
        viewpager.setOffscreenPageLimit(7);
        viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                currentPosition = position;
                for (int i = 0; i < lyDot.getChildCount(); i++) {
                    if (i == currentPosition) {
                        lyDot.getChildAt(i).setBackgroundColor(Color.parseColor("#1d2939"));
                    } else {
                        lyDot.getChildAt(i).setBackgroundColor(Color.parseColor("#476990"));
                    }
                }
            }
            @Override
            public void onPageScrollStateChanged(int state) {
                // 没有滑动的时候 切换页面
            }
        });
    }

 

 

 4、initHandler()方法

private void initHandler() {
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1) {
                    if (currentPosition==viewPagerData.size()-1){          // 如果当前位置是轮播图的最后一个位置,则调到轮播图数据源的第一张图片
                        currentPosition = 0 ;
                        viewpager.setCurrentItem(0,false);
                    }else{
                        currentPosition ++;                                // 否则切换到下一张图片
                        viewpager.setCurrentItem(currentPosition,true);
                    }
                }
            }
        };
    }

 

 

 5、autoViewPager()方法

     /**
     * 开启子线程,实现3000毫秒 切换一次 ,viewpager自动播放
     */
    private void autoViewPager() {
        new Thread() {
            @Override
            public void run() {
                super.run();
                while (actIsAlive) {
                    try {
                        sleep(3000);
                        handler.sendEmptyMessage(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

 

 

 

 

 -----------------------------------------------------------------------------------------------------------

 GitHub Demo 地址

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/3025.html

相关文章

  • android有趣 文章合集- 收藏集 - 掘金

    摘要:使用起来非常开发利器介绍掘金本文翻译自著名博客,原作者是,点击此处可查看原文。这时你的心里肯定有轮播图控件的实现详解附开源链接掘金轮播图在开发中是非常常见的控件,一般的首页广告和电商类的商品详情图片都会用轮播图来实现。 Android性能优化(六)之卡顿那些事 - 掘金1、 Introduction 对普通用户而言,类如内存占用高、耗流量、耗电量等性能问题可能不会轻易发现,但是卡顿问题...

    FingerLiu 评论0 收藏0
  • 关于android - 收藏集 - 掘金

    摘要:主要解决多类型问题,的掘金一背景随着的碎片化越来越严重,适配成为一个开发中一个痛点。价值虽然说瘦身对于对应用可分配内存的限制影响不大,但是还是有一数据存储方案掘金文件存储类中提供了一个方法,可以用于将数据存储到指定文件中。 LSettingView--- 让你更加快速的实现设置界面 - Android - 掘金设置界面条目封装,同时包含: 设置左侧图标 设置左侧文字 ... ProGu...

    he_xd 评论0 收藏0
  • 小程序实践(二):swiper组件实现播图效果

    摘要:组件类似于中的,实现类似轮播图的效果,相对于的实现起来更加方便,快捷。swiper组件类似于Android中的ViewPager,实现类似轮播图的效果,相对于Android的Viewpager,swiper实现起来更加方便,快捷。 效果图: 首先看下swiper支持的属性: --------------------------------------------------------...

    番茄西红柿 评论0 收藏0
  • Android自定义控件

    摘要:自定义之高仿支付宝芝麻信用分仪表盘效果最近写的一个自定义,仿了下支付宝新旧版的芝麻信用分的仪表盘效果。项目需求讨论自定义实现步骤及封装根据实际项目需求出发。来快速实现各种自定义界面的对话框。究其原因,目前只用到了最基础的一部分功能。 自定义 View 之高仿支付宝芝麻信用分仪表盘效果 最近写的一个自定义 View,仿了下支付宝新旧版的芝麻信用分的仪表盘效果。 项目需求讨论 - Andr...

    Tikitoo 评论0 收藏0
  • Android Studio

    摘要:应用程序响应速度最糟糕的是应用程序无响应对话框。然而,不幸的是,并不能获取所要的结果,宽高值均为。提供侧滑操作的控件这是一款提供侧滑功能的,可以设置它的滑动方向左右上下。 写给 Android 开发者的混淆使用手册 点击打开链接 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆。 首先,这里说的的混淆其实是包括了代码压缩、代码混淆以及资源...

    dunizb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<