轮播图(多个一起轮播)

news2024/12/25 0:15:29

效果图
在这里插入图片描述

class MainActivity : Activity(), Runnable {

    private lateinit var viewPager: ViewPager
    private lateinit var bannerAdapter: BannerAdapter
    private val images = ArrayList<Int>() // 存储图片资源的列表
    private val handler = Handler() // 用于定时发送消息的Handler
    private val DELAY_TIME = 3000L // 轮播的延迟时间,单位为毫秒

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var list= arrayListOf<Bean>()
        viewPager = findViewById(R.id.view_pager) // 获取ViewPager控件
        images.apply { // 初始化图片资源的列表
            add(R.mipmap.ic_launcher) // 添加图片资源
            add(R.mipmap.ic_launcher) // 添加图片资源
            add(R.mipmap.ic_launcher) // 添加图片资源
            add(R.mipmap.ic_launcher) // 添加图片资源
            add(R.mipmap.ic_launcher) // 添加图片资源
            add(R.mipmap.ic_launcher) // 添加图片资源
            add(R.mipmap.ic_launcher) // 添加图片资源
            add(R.mipmap.ic_launcher) // 添加图片资源
        }
        //处理数据
        //数据处理为3的倍数(加的方式)
        val value=images.size%3
        if (value==1){
            images.add(images[1])
            images.add(images[2])
        }else if (value==2){
            images.add(images[1])
        }
        for (i in 0 until images.size step 3){
            list.add(
                Bean(
                    BeanItem(images[i],"title$i"),
                    BeanItem(images[i+1],"title${i+1}"),
                    BeanItem(images[i+2],"title${i+2}")
                )
            )
        }

        bannerAdapter = BannerAdapter(this, list) // 创建适配器对象
        viewPager.adapter = bannerAdapter // 设置适配器
        viewPager.currentItem = images.size * 100 // 设置当前的位置,以保证可以向前滑动
//        viewPager.setPageTransformer(true, ZoomOutPageTransformer()) // 设置页面的转换效果,您可以自定义或使用第三方的库
        viewPager.pageMargin = 20 // 设置页面的间隔
        viewPager.offscreenPageLimit = 3 // 设置预加载的页面数
        handler.postDelayed({ // 发送一个延迟的Runnable对象
            val currentItem = viewPager.currentItem // 获取当前的位置
            viewPager.currentItem = currentItem + 1 // 设置下一个位置
            handler.postDelayed(this, DELAY_TIME) // 再次发送延迟的Runnable对象,实现循环
        }, DELAY_TIME)
    }

    override fun onDestroy() {
        super.onDestroy()
        handler.removeCallbacksAndMessages(null) // 移除所有的消息和回调,避免内存泄漏
    }
    private  val TAG = "MainActivity"
    override fun run() {
        handler.postDelayed({ // 发送一个延迟的Runnable对象
            val currentItem = viewPager.currentItem // 获取当前的位置
            viewPager.currentItem = currentItem + 1 // 设置下一个位置
            handler.postDelayed(this, DELAY_TIME) // 再次发送延迟的Runnable对象,实现循环
        }, DELAY_TIME)
    }
}



class BannerAdapter(private val context: Context, private val list: ArrayList<Bean>) : PagerAdapter() {

    override fun getCount(): Int {
        return Int.MAX_VALUE // 设置为一个很大的数,以实现无限循环
    }

    @SuppressLint("MissingInflatedId")
    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        val view = LayoutInflater.from(context).inflate(R.layout.item_banner, container, false) // 加载自定义的布局文件
        val imageView1 = view.findViewById<ImageView>(R.id.image_view1) // 获取布局文件中的ImageView
        val imageView2 = view.findViewById<ImageView>(R.id.image_view2) // 获取布局文件中的ImageView
        val imageView3 = view.findViewById<ImageView>(R.id.image_view3) // 获取布局文件中的ImageView
        val tv1 = view.findViewById<TextView>(R.id.tv1) // 获取布局文件中的ImageView
        val tv2 = view.findViewById<TextView>(R.id.tv2) // 获取布局文件中的ImageView
        val tv3 = view.findViewById<TextView>(R.id.tv3) // 获取布局文件中的ImageView
        imageView1.setImageResource(list[position % list.size].item1.img) // 设置图片资源
        imageView2.setImageResource(list[position % list.size].item2.img) // 设置图片资源
        imageView3.setImageResource(list[position % list.size].item3.img) // 设置图片资源
        tv1.text=list[position % list.size].item1.title
        tv2.text=list[position % list.size].item2.title
        tv3.text=list[position % list.size].item3.title
        container.addView(view) // 将视图添加到容器中
        return view // 返回视图对象
    }

    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
        container.removeView(`object` as View) // 移除视图
    }

    override fun isViewFromObject(view: View, `object`: Any): Boolean {
        return view == `object` // 判断视图是否和对象相同
    }
}

bean

class Bean(val item1:BeanItem,val item2:BeanItem,val item3:BeanItem)
class BeanItem(val img:Int,val title:String)

自定义垂直viewPager

class VerticalViewPager(context: Context, attrs: AttributeSet?) : ViewPager(context, attrs) {

    private val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
        override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
            return if (abs(distanceX) > abs(distanceY)) {
                false
            } else {
                super.onScroll(e1, e2, distanceX, distanceY)
            }
        }
    })

    init {
        setPageTransformer(true, VerticalPageTransformer())
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        val intercepted = super.onInterceptTouchEvent(swapXY(ev))
        swapXY(ev)
        return intercepted
    }

    override fun onTouchEvent(ev: MotionEvent): Boolean {
        return if (gestureDetector.onTouchEvent(ev)) {
            super.onTouchEvent(swapXY(ev))
        } else {
            false
        }
    }

    private fun swapXY(event: MotionEvent?): MotionEvent? {
        event?.let {
            val width = width.toFloat()
            val height = height.toFloat()

            val newX = it.y / height * width
            val newY = it.x / width * height

            it.setLocation(newX, newY)
        }
        return event
    }
}
class VerticalPageTransformer : PageTransformer {
    override fun transformPage(view: View, position: Float) {
        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.alpha = 0f
        } else if (position <= 1) { // [-1,1]
            view.alpha = 1f
            // Counteract the default slide transition
            view.translationX = view.width * -position
            //set Y position to swipe in from top
            val yPosition = position * view.height
            view.translationY = yPosition
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.alpha = 0f
        }
    }
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="200dp">

    <com.example.banner.view.VerticalViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clipToPadding="false"/>

</LinearLayout>

item_banner

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:paddingHorizontal="40dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_weight="1"
        android:gravity="center">
        <ImageView
            android:layout_marginHorizontal="10dp"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:id="@+id/image_view1"
            android:scaleType="fitXY"
            android:src="@mipmap/ic_launcher"
            android:layout_weight="1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv1"
            android:text="hello"/>
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_weight="1"
        android:gravity="center">
        <ImageView
            android:layout_marginHorizontal="10dp"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:id="@+id/image_view2"
            android:scaleType="fitXY"
            android:src="@mipmap/ic_launcher"
            android:layout_weight="1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv2"
            android:text="hello"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_weight="1"
        android:gravity="center">
        <ImageView
            android:layout_marginHorizontal="10dp"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:id="@+id/image_view3"
            android:scaleType="fitXY"
            android:src="@mipmap/ic_launcher"
            android:layout_weight="1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv3"
            android:text="hello"/>
    </LinearLayout>

</LinearLayout>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件工程理论与实践 (吕云翔) 第六章 面向对象分析课后习题及其解析

第六章 面向对象分析 知识点: 一个典型的软件系统通常包括的内容为&#xff1a;它使用数据结构&#xff08;对象模型&#xff09;&#xff0c;执行操作&#xff08;动态模型&#xff09;&#xff0c;并且完成数据值的变化&#xff08;功能模型&#xff09;。 3种模型之间的关…

机器视觉公司怎么可能养我这闲人,连软件加密狗都用不起,项目都用盗版,为什么​?

正版价值观我是认同的&#xff0c;但是同行也不用软件加密狗&#xff0c;你让我承担过多的设备成本&#xff0c;终端客户不愿意承担加密狗的成本&#xff0c;公司更不愿意去承担&#xff0c;许多机器视觉公司“零元购”&#xff0c;机器视觉软件加密狗都用不起&#xff0c;项目…

DVWA - 4

文章目录 JavaScriptlowmedium JavaScript 前端攻击。token 不能由前端生成&#xff0c;js 很容易被攻击者获取&#xff0c;从而伪造 token。同样其他重要的参数也不能由前端生成。 low 不修改输入&#xff0c;点击提交报错: 根据提示改成 success&#xff0c;还是报错&…

关于新版的Maven创建Maven项目的时候只有Maven Archetype,而找不到Maven的这个问题

问题情况 : 在最近的学习过程中&#xff0c;想要创建一个Maven模块用于分块设计&#xff0c;但是在idea里面创建Maven项目的时候&#xff0c;发现与maven相关的只有Maven Archetype这个模块&#xff0c;然后找不到单纯的Maven模块&#xff1b;就像下面这样 : 解决方案 : 其…

Skywalking流程分析_8(拦截器插件的加载)

前言 在之前的文章中我们将&#xff0c;静态方法、构造方法、实例方法的增强逻辑都分析完毕&#xff0c;但在增强前&#xff0c;对于拦截类的加载是至关重要的&#xff0c;下面我们就来详细的分析 增强插件的加载 静态方法增强前的加载 //clazz 要修改的字节码的原生类 Sta…

【自动化测试】基于Selenium + Python的web自动化框架!

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化工具&#xff0c;她提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid&#xff1a;  1、Selenium IDE&…

Kafka的重要组件,谈谈流处理引擎Kafka Stream

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

【flutter】使用getx下的GetMaterialApp创建路由和使用时间选择器国际化问题

GetMaterialApp是啥 网上解释说是 MaterialApp Getx properties GetMaterialApp 问题 在使用showDateRangePicker组件的时候&#xff0c; 一直报错 No MaterialLocalizations found 我就愁思是不是GetMaterialApp跟MaterialApp方法不一样的问题&#xff0c;结果不是&#…

OpenCV快速入门:初探

文章目录 一、什么是OpenCV二、安装OpenCV三、图像读取与显示读取图像显示图像等待按键与关闭窗口 四、视频加载与摄像头调用从视频文件中读取从摄像头中读取关闭窗口与释放资源 五、图像的基本存储方式RGB矩阵矩阵操作与像素访问使用矩阵来显示图像 六、图像保存读取图像保存图…

EasyCVR视频监控+AI智能分析网关如何助力木材厂安全生产?

旭帆科技有很多工厂的视频监管方案&#xff0c;小编也经常分享出来供大家参考。近期&#xff0c;又有伙伴后台私信我们想要关于木材厂的方案。针对木材厂的生产过程与特性以及安全风险等&#xff0c;我们来分享一下相关的监管方案&#xff1a; 1&#xff09;温湿度监测&#xf…

springboot-RedisTemplate

pom.xml: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

MySQL存储架构

连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程&#xff0c;这个连接的查询只会在这个线程中执行。MySQL5.5以后支持了一个API叫线程池插件&#xff0c;可以用少量线程服务大量连接&#xff0c;因此不用每次都新建连接然后销毁。 客户端连接MySQL服务器时候&…

深度学习YOLOv5车辆颜色识别检测 - python opencv 计算机竞赛

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

BMS中的绝缘电阻测量方法

使用场景 在GB/T 18384-2020中规定BMS需要对动力电池系统所有部件集成完毕的状态下进行绝缘检测&#xff0c;且采用绝缘电阻阻值来衡量绝缘状态。绝缘电阻可分为总正对地和总负对地。这时一般使用不平衡电桥法&#xff08;由于国标GB/T 18384-2020中推荐此种方法&#xff0c;因…

力扣刷题篇之数与位3

系列文章目录 目录 系列文章目录 前言 数学问题 总结 前言 本系列是个人力扣刷题汇总&#xff0c;本文是数与位。刷题顺序按照[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09; 数学问题 204. 计数质数 - 力扣&#xff08;Le…

如何让普通用户使用sudo?

一、sudo的作用 sudo就是可以让我们的普通用户以root身份去做一些事情&#xff0c;这相当于给普通用户提升了权限&#xff0c;但是并不是每个普通用户都可以随便拿到root的提权的&#xff0c;也就是sudo是要经过一定处理才可以给普通用户使用&#xff0c;那么如何处理呢&#x…

单机版-redis(手动部署)

单机版-redis部署 部署模式:单机版-redis部署 Redis版本&#xff1a;redis-4.0.1 部署redis方式&#xff1a;手动部署 在完成第三步时已完成配置&#xff0c;后续为操作命令以及注意事项&#xff1b; 在进行操作数据库时&#xff0c;需要关注第五步注意事项&#xff0c;会涉…

卷积神经网络(CNN)衣服图像分类的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.调整图片格式5. 可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU&#xff08;如果使用的是CPU可以…

【Electron】electron-builder打包失败问题记录

文章目录 yarn下载的包不支持require()winCodeSign-2.6.0.7z下载失败nsis-3.0.4.1.7z下载失败待补充... yarn下载的包不支持require() 报错内容&#xff1a; var stringWidth require(string-width)^ Error [ERR_REQUIRE_ESM]: require() of ES Module /stuff/node_modules/…

SpringBoot整合Quartz示例

数据表 加不加无所谓,如果需要重启服务器后重新执行所有JOB就把sql加上 如果不加表 将application.properties中的quartz数据库配置去掉 自己执行自己的逻辑来就好,大不了每次启动之后重新加载自己的逻辑 链接&#xff1a;https://pan.baidu.com/s/1KqOPYMfI4eHcEMxt5Bmt…