Android的banner(轮播图)的实现

Android Studio 中 Banner控件实现首页轮播图 打开banner -> res -> layout ->activity_main.xml。为了方便,这里我们把模块名命名为banner。 阅读详情

本文使用了ViewPager来实现轮播图的功能,轮播的图片资源来源于网上。

一、思路

我们想要实现一个轮播图的功能,首先能想到的是使用ViewPager来实现,根据上一篇文章的内容
http://blog.youkuaiyun.com/llayjun/article/details/51362905,我们能想到有一个区别如下:

1、就是使得ViewPager实现启动页来无限的轮播图片

2、启动一个定时器来完成自动的轮播效果。

二、写布局代码

1、我们先是来看一下效果图,如何,还是可以的吧。
这里写图片描述
这里写图片描述

注意点:这一节对于上一节,有几处是不相同的。相对于ViewPager来实现启动页
1、上一节的指示器是固定在xml文件中写的,此一节,我们动态来实现。

2、主界面布局准备。
先把布局文件画好。在layout文件中的activity.xml文件。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/viewpager"
        android:background="#33000000"
        android:orientation="vertical"
        android:padding="5dp">

        <TextView
            android:id="@+id/tv_bannertext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:padding="5dp"
            android:text="我是第一个广告语"
            android:textColor="@android:color/white" />

        <LinearLayout
            android:id="@+id/points"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal">


        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

注意点:
1、使用相对布局,可以是重叠效果更好的实现。
2、一共有三个部分,ViewPager,TextVeiw和指示器的LinearLayout
3、指示器动态生成

3、指示器布局代码
①实现点击效果布局代码drawable文件中point_selector.xml文件

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/v_point_up" android:state_enabled="true"></item>

    <item android:drawable="@drawable/v_point_down" android:state_enabled="false"></item>

</selector>

②点击效果文件drawable文件中v_point_down.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <corners android:radius="0.5dp" />

    <solid android:color="#55000000" />

</shape>

③未点击效果文件drawable文件中v_point_up.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <corners android:radius="0.5dp" />

    <solid android:color="#AAFFFFFF" />

</shape>

三、写Activity代码

思路:主要分为四个部分,我分别写在了四个方法里,
initView();初始化主布局中的控件,ViewPager,TextView,LinearLayout
initDate();初始化一些数据,包含:ViewPager的资源,根据轮播图的数量来动态生成指示器的数量
initAction();将ViewPager和指示器进行连接起来,这样子ViewPager滚动的时候才能带动指示器
initThread();开启一个线程来自动循环轮播图,在onDestory()方法中,关闭这个线程

我就直接上代码了,代码中注释也是非常清楚了。BannerActivity.java文件

public class BannerActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener, View.OnClickListener {
    //设置数据源集合
    private List<BannerBean> listBannerBean;
    //设置视图的集合
    private List<ImageView> listImageView;
    //ViewPager的声明
    private ViewPager viewPager;
    private TextView textView;
    private LinearLayout linearLayout;
    //设置圆点View
    private View view;
    LinearLayout.LayoutParams layoutParams;
    //圆圈标志位置
    private int pointIndex = 0;
    // 线程标志
    private boolean isStop = false;
    //设置ViewPager适配器
    private BannerAdapter bannerAdapter;

    //Volley加载网络图片
    private RequestQueue mQueue;
    private ImageLoader mImageLoader;
    private ImageLoader.ImageListener imageListener;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_banner);
        initView();
        initDate();
        initAction();
        initThread();
    }

    private void initThread() {
        // 开启新线程,2秒一次更新Banner
        new Thread(new Runnable() {

            @Override
            public void run() {
                while (!isStop) {
                    SystemClock.sleep(3000);
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                        }
                    });
                }
            }
        }).start();
    }


    private void initAction() {
        //取中间数来作为起始位置
        int index = (Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2 % listImageView.size());
        //用来出发监听器
        viewPager.setCurrentItem(index);
        linearLayout.getChildAt(pointIndex).setEnabled(true);
    }

    private void initView() {
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        textView = (TextView) findViewById(R.id.tv_bannertext);
        linearLayout = (LinearLayout) findViewById(R.id.points);
        mQueue = Volley.newRequestQueue(this);
    }


    private void initDate() {
        BannerBean bannerBean1 = new BannerBean("http://image.tianjimedia.com/uploadImages/2012/236/L1Q2D11EJEUR.jpg", "田野和蓝天");
        BannerBean bannerBean2 = new BannerBean("http://image.tianjimedia.com/uploadImages/2012/236/ZU667K72270N.jpg", "海洋和帆船");
        BannerBean bannerBean3 = new BannerBean("http://image.tianjimedia.com/uploadImages/2012/236/6477R0H2JBTU.jpg", "雪景");
        BannerBean bannerBean4 = new BannerBean("http://image.tianjimedia.com/uploadImages/2012/236/1327ORB0XR68.jpg", "古堡");
        BannerBean bannerBean5 = new BannerBean("http://image.tianjimedia.com/uploadImages/2012/236/2Q682OB9JGG8.jpg", "园林风景");
        BannerBean bannerBean6 = new BannerBean("http://image.tianjimedia.com/uploadImages/2012/236/2V5E4MEHVT8L.jpg", "春夏秋冬");
        listBannerBean = new ArrayList<>();
        listBannerBean.add(bannerBean1);
        listBannerBean.add(bannerBean2);
        listBannerBean.add(bannerBean3);
        listBannerBean.add(bannerBean4);
        listBannerBean.add(bannerBean5);
        listBannerBean.add(bannerBean6);
        listImageView = new ArrayList<>();
        for (int i = 0; i < listBannerBean.size(); i++) {
            //设置广告图
            ImageView imageView = new ImageView(this);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);//设置缩放样式
            mImageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
                @Override
                public Bitmap getBitmap(String s) {
                    return null;
                }

                @Override
                public void putBitmap(String s, Bitmap bitmap) {

                }
            });
            imageListener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
            mImageLoader.get(listBannerBean.get(i).getImageUrl(), imageListener);
            listImageView.add(imageView);

            //设置圆点
            view = new View(this);
            layoutParams = new LinearLayout.LayoutParams(20, 20);
            layoutParams.leftMargin = 10;
            view.setBackgroundResource(R.drawable.point_selector);
            view.setLayoutParams(layoutParams);
            view.setEnabled(false);
            linearLayout.addView(view);
        }
        bannerAdapter = new BannerAdapter(listImageView, this, listBannerBean);
        viewPager.setAdapter(bannerAdapter);
        viewPager.setOnPageChangeListener(this);
    }

    @Override
    public void onClick(View v) {
        //此处实现点击指示器,来显示第几个轮播图,但我觉得一般轮播图里的点太小,可能会产出误触,不建议
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        int newPosition = position % listBannerBean.size();
        textView.setText(listBannerBean.get(newPosition).getText());
        linearLayout.getChildAt(newPosition).setEnabled(true);
        linearLayout.getChildAt(pointIndex).setEnabled(false);
        pointIndex = newPosition;
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

    @Override
    protected void onDestroy() {
        // 关闭定时器
        isStop = true;
        super.onDestroy();
    }

注意点:

1、

private void initAction() {
//取中间数来作为起始位置
int index = (Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2 % listImageView.size());
//用来出发监听器
viewPager.setCurrentItem(index);
linearLayout.getChildAt(pointIndex).setEnabled(true);
}

这一段代码要好好注意,因为起始位置不能为0,为0的话,当滑动到第一张时,就不能再向左滑动了,所以我们选取一个中间值得位置作为起始位置,这样就不用担心两边会滑到头了。

四、ViewPager的适配器

直接上代码:BannerAdapter.java

public class BannerAdapter extends PagerAdapter {
    private List<ImageView> list;
    private Context context;
    private List<BannerBean> bannerBeanList;

    public BannerAdapter(List<ImageView> list, Context context, List<BannerBean> bannerBeanList) {
        this.list = list;
        this.context = context;
        this.bannerBeanList = bannerBeanList;
    }

    @Override
    public int getCount() {
        //取超大的数,实现无线循环效果
        return Integer.MAX_VALUE;
    }

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

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(list.get(position % list.size()));
    }

    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
        //这边有一个很大的问题待解决,当图片数量小于3的时候,不会调用destroyItem(ViewGroup container, int position, Object object)这个方法,则会出现问题。
        //如果是多余三张的时候,是会调用,然后进行移除。
        container.addView(list.get(position % list.size()));
        list.get(position % list.size()).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, bannerBeanList.get(position % list.size()).getText(), Toast.LENGTH_SHORT).show();
            }
        });
        return list.get(position % list.size());
    }

}

注意:
1、在getCount()方法中返回的是Integer.MAX_VALUE;因为想要实现无限次的轮播效果,所以不能返回轮播图的数量。
2、然后之前的position就要用position % list.size()来取代,这样就不会出现越界的现象。
3、这里还有一个问题没有解决,就是当轮播图的图片少于三张的时候,会出现空白的问题。因为少于3张图的时候,不会调用destroyItem()这个方法,就不会销毁之前的图。以后再解决吧!希望大家也能够给点意见。

Android---Banner轮播图 实现一个简单的轮播图效果,Banner框架已经帮我们做了一个适配器--能够帮助我们快速开发,完成首页轮播图效果的需求。 阅读详情

相关推荐

Android----banner使用详解

Android----banner使用详解 昨天10.31 ,斗破苍穹的三年之约终于出来了,自己也等了很久很久,敬师长,敬家人,敬朋友,敬每一个前行路上正在奋战的自己,星光不问赶路人,时间不负有心人。 效果图: 添加依赖 implementation 'com.youth.banner:banner:2.1.0' 添加权限到你的 AndroidManifest.xml <!-- if you want to load images from the internet -->

乐褀的博客 2万+

Android入门Banner轮播图的使用(详解)

Banner是Android一个轮播图的框架,使用Banner让我们实现轮播效果的代码更加简洁化。 先上效果图: 1.添加依赖 ---- com.youth.banner:banner:1.4.9 implementation 'com.youth.banner:banner:1.4.9' 2.在xml布局文件中添加Banner控件 <com.youth.banner.Banner android:id="@+id/banner" and...

m0_53223811的博客 1万+

【番外篇】Android Studio 中 Banner控件实现首页轮播图

打开banner -> res -> layout ->activity_main.xml。为了方便,这里我们把模块名命名为banner。

qq_73830179的博客 1387

Android——支持图片加视频无限轮播的banner

基于https://github.com/youth5201314/banner扩展,图片+视频无限轮播banner Demo地址 https://gitee.com/saqino/pic-video-banner-demo.git 说明 使用大佬的banner控件是很方便的,但是对视频+图片无限轮播的支持较弱,所以决定重写几个类实现功能。 不重写无法实现的原因如下: 无限轮播模式下,item大于1时, adapter会自动增加两个item,一个在最前,一个在最后,这样子做...

Saqino的博客 9886

【Android笔记90】Android之轮播图Banner的使用

​Banner是一个第三方的轮播图组件,它提供了非常简单的轮播图实现方式,之前的文章中,我有些过如何使用Android实现轮播图的效果,可以看下这篇文章【【Android笔记55】Android之如何使用ViewPager2实现自动轮播图的效果】,这种自己实现的轮播图有些复杂,如果项目中,有多个页面都需要轮播图,那就可想而知工作量得多大,所以这里介绍Banner轮播图组件,可以轻松的帮助我们实现轮播图效果。

✅ Java 开发工程师 2657

从数据校准到论文呈现:fsQCA与NCA方法融合的完整实证研究指南

本文详细介绍了fsQCA(模糊集定性比较分析)与NCA(必要条件分析)方法融合的完整实证研究流程,从数据校准到论文呈现。通过软件操作技巧、R语言NCA包高效使用及论文写作规范,帮助研究者避免常见误区,提升研究质量与可靠性。特别适合需要进行组态分析的研究生和学者参考。

weixin_29215391的博客 414

安卓首页界面:用Banner框架实现Android轮播图效果

1111

qq_68469751的博客 4066

目标检测数据集 第069期-基于yolo标注格式的玻璃清洁状态检测数据集(含免费分享)

但这类技术的落地,离不开大量标注规范、场景丰富的数据集作为算法训练的支撑,玻璃清洁状态检测数据集的出现,正是为了满足这一市场与技术需求。在高校与科研机构的计算机视觉研究中,该数据集可作为基础研究素材,用于探索物体状态识别的算法优化方向,比如针对玻璃这类透明物体的检测算法改进,或是小样本场景下的状态识别研究。通过摄像头采集车窗、挡风玻璃的图像,算法自动检测玻璃清洁度,若识别到脏污影响视线,及时提醒运维人员清洁,避免因玻璃脏污引发的安全事故,提升交通出行的安全性。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 128

安卓Banner轮播图框架实现

Banner轮播图实现

L73748196_的博客 1691

实战解析:如何用Python逆向破解FastMoss的TikTok数据加密签名(附完整代码)

本文详细解析了如何用Python逆向破解FastMoss平台的TikTok数据加密签名机制,包括MD5加密算法和JS逆向分析。通过完整的Python代码示例,帮助开发者理解签名生成原理并实现自动化请求,提升数据获取能力。

weixin_30955617的博客 557

Cobalt Strike4.0安装包(内附中文版)

1.什么是 Cobalt Strike Cobalt Strike 是一个为对手模拟和红队行动而设计的平台,主要用于执行有目标的攻击和模拟高级威胁 者的后渗透行动。 Cobalt Strike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、W...

梦之序章的博客 2万+

Android三方框架banner实现轮播图

Android三方框架banner实现轮播图关于效果图第一步,添加引用第二步,新增实体类及测试数据第三步,添加banner实例控件,修改主界面代码自定义图片+标题轮播图效果图你以为到这里就结束了?? 关于   本篇使用的是基于viewpager2的一个开源banner,性能、生命周期都有保障,就是有一点小的功能需要我们自己去修改。本篇也是作为简易音乐博客系列之一。 效果图 第一步,添加引用   在工程build下添加仓库maven: allprojects { repositories {

Tobey_r1的博客 5977

Silvaco TCAD | 从PIN到APD:高性能光电探测器的仿真设计与优化

本文详细介绍了使用Silvaco TCAD进行光电探测器仿真设计与优化的全过程,从基础的PIN结构到高性能APD的实现。通过实战案例和代码示例,展示了如何优化器件参数、实现雪崩效应以及进行高级仿真分析,帮助工程师提升光电探测器的量子效率和响应速度。

weixin_29218509的博客 426

安卓Banner实现轮播图

Banner 第一: 权限配置 第二: compile 'com.squareup.okio:okio:1.5.0' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okhttp3

qq_40317838的博客 582

从零开始:用Python搭建你的第一个加密货币量化交易机器人(附完整代码)

本文详细介绍了如何使用Python从零开始搭建一个加密货币量化交易机器人,涵盖环境准备、交易所API连接、基础交易策略实现、回测系统构建以及实盘部署等关键步骤。通过完整的代码示例,帮助读者快速掌握数字货币量化交易的核心技术,适合有一定编程基础的投资者入门。

weixin_30415113的博客 465

从零构建:Trinamic API在STM32上的深度移植与TMC-IDE通信实战

本文详细介绍了如何从零开始在STM32平台上深度移植Trinamic API,并实现与TMC-IDE工具的稳定通信。内容涵盖SPI底层驱动定制、寄存器配置、高级功能实现及调试技巧,重点解析了TMC5160芯片的集成实践,帮助开发者构建可靠的嵌入式运动控制系统。

w1x2y3的博客 254

Android使用banner实现自动手动轮播图

无图无真相 Banner Github地址:https://github.com/youth5201314/banner 首先添加依赖: //banner轮播框架 implementation 'com.youth.banner:banner:1.4.10' // Glide 图片加载 implementation 'com.github....

qq_38363506的博客 6354

ESP32-IDF开发之旅 基础篇⑨ ESP-IDF的FreeRTOS任务间通信和同步

本文介绍了FreeRTOS任务间通信中的队列机制,重点讲解了队列的创建、发送和接收数据的API使用方法。文章提供了详细的技术说明和示例代码,包括xQueueCreate、xQueueSend、xQueueReceive等核心函数的参数说明和返回值解释。通过一个2生产者+1消费者的实际案例,展示了如何在ESP-IDF环境下使用FreeRTOS队列实现任务间通信。示例中包含了数据发送失败处理和接收数据验证等实用技巧,为开发者提供了可参考的实现模式。

单片机菜鸟哥的博客 427

Android 轮播图Banner的简单实现

轮播图已经出来很长时间了,我也看了很多博客,看了很多的人代码,也有自己写原生的,也有用第三方框架的,学习安卓有一段时间了,决定写一写博客来记录自己的安卓学习生涯,不管以前有没有古人写过,反正我是这个来者哈哈哈;废话不多说了,进入正文吧。 Banner的简单使用步骤:第一步 添加依赖:compile 'com.youth.banner:banner:1.4.9'第二步 网络权限://如果你的图片源是从

qq_37990175的博客 2764

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

安卓Banner+Glide实现轮播图及数据缓存以离线加载

首先在app中的build.gradle中添加以下依赖,banner为轮播图框架,glide为图片加载框架。 implementation 'com.youth.banner:banner:1.4.9' implementation 'com.github.bumptech.glide:glide:4.7.1' annotationProcessor 'com.github.bumptech.gl...

Sol的博客 938

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android banner停止轮播,android如何实现banner轮播图无限轮播效果

android如何实现banner轮播图无限轮播效果发布时间:2021-04-16 12:47:03来源:亿速云阅读:106作者:小新小编给大家分享一下android如何实现banner轮播图无限轮播效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下效果展示第一步(权限配置)第二步(添加依赖)compile'com.squareup.okio:okio:1.5.0'...

weixin_42373103的博客 964

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最新kotlin android 轮播图的实现,超简单 - android banner

写在前面 本人android小白,刚学kotlinandroid ,所以这篇文章是给小白看的 由于项目中需要使用到轮播图,自己造轮子不太可能所以肯定是要用到第三方库的 但是我发现网上大部分都是java android的,或者又有一些都是太老旧 正文 此次采用的是youth5201314的banner库,这个项目在github上也是拥有超多的star 第一步 在gradle中添加banner 和 glide 依赖 (这里用到glide是需要用到他的图片加载,也可以不用具体请参考.....

qq_39909614的博客 5296

Android最便捷banner轮播图实现原理及代码

原理图: 代码实现public class CyclerViewPager extends ViewPager { public CyclerViewPager(Context context) { super(context); } public CyclerViewPager(Context context, AttributeSet attrs) {

Flutter|Android移动开发 3476

Android框架之路——Banner实现轮播图(RecyclerView添加Header)

一、简介 Banner能实现循环播放多个广告图片和手动滑动循环等功能。因为原生ViewPager并不支持循环翻页, 要实现循环还得需要自己去动手。Banner框架可以进行不同样式、不同动画设置, 以及完善的api方法能满足大部分软件首页轮播图效果的需求。 有一篇博客讲了一些,可以参考banner框架,一个比较齐全的框架; 此项目的Github地址:链接。 本篇教程依

等一杯咖啡的博客 2万+

Android:实现一个轮播图(Banner)

Android:实现一个轮播图(Banner) 前言 &amp;&amp; 需求 在Android App中,轮播图还是很常见的,如Splash闪屏页的引导图,电商App首页上的广告轮播图等等。其实github是有很多此类组件,但是实现起来也不难,不妨自己去尝试尝试。 思路 此博文是基于ViewPager实现的轮播图。 我们也知道,ViewPager是不能实现循环播放的,但我们可以巧妙的利用Vi...

wudongjiang333的博客 4057

Android使用Banner框架实现轮播图

该banner实现了自动轮播、圆角矩形等小功能,具体看下面代码吧!

qq_41915623的博客 1252
上一篇: Android中启动页ViewPager和ViewFlipper带指示器
下一篇: Service的理解和使用
llayjun
博客等级 码龄12年 73粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值