轮播图(多个一起轮播)

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

class MainActivity : Activity(), Runnable {private lateinit var viewPager: ViewPagerprivate lateinit var bannerAdapter: BannerAdapterprivate val images = ArrayList<Int>() // 存储图片资源的列表private val handler = Handler() // 用于定时发送消息的Handlerprivate 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%3if (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) // 获取布局文件中的ImageViewval imageView2 = view.findViewById<ImageView>(R.id.image_view2) // 获取布局文件中的ImageViewval imageView3 = view.findViewById<ImageView>(R.id.image_view3) // 获取布局文件中的ImageViewval tv1 = view.findViewById<TextView>(R.id.tv1) // 获取布局文件中的ImageViewval tv2 = view.findViewById<TextView>(R.id.tv2) // 获取布局文件中的ImageViewval tv3 = view.findViewById<TextView>(R.id.tv3) // 获取布局文件中的ImageViewimageView1.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.titletv2.text=list[position % list.size].item2.titletv3.text=list[position % list.size].item3.titlecontainer.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 * widthval newY = it.x / width * heightit.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 transitionview.translationX = view.width * -position//set Y position to swipe in from topval yPosition = position * view.heightview.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.VerticalViewPagerandroid: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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_weight="1"android:gravity="center"><ImageViewandroid: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"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv1"android:text="hello"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_weight="1"android:gravity="center"><ImageViewandroid: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"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv2"android:text="hello"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_weight="1"android:gravity="center"><ImageViewandroid: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"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv3"android:text="hello"/></LinearLayout></LinearLayout>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 selenium 实现网站图片采集

写在前面 有小伙伴选题&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对…

基于SSM的学生疫情信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Ubuntu 22.04 LTS ffmpeg mp4 gif 添加图片水印

ffmpeg编译安装6.0.1&#xff0c;参考 Ubuntu 20.04 LTS ffmpeg gif mp4 互转 许编译安装ffmpeg &#xff1b;解决gif转mp4转换后无法播放问题-CSDN博客 准备一个logo MP4添加水印 ffmpeg -i 2.mp4 -vf "movielogo.png[watermark];[in][watermark]overlayx10:y10[out]&…

大功率电源芯片WD5030L

电源管理芯片作为现代电子设备中最关键的元件之一&#xff0c;直接影响着设备的性能和效率。而大功率电源芯片作为电源管理芯片中的一种&#xff0c;其性能和应用领域更加广泛。本文将介绍一款具有宽VIN输入范围、高效率和多种优良性能的大功率电源芯片WD5030L&#xff0c;并探…

通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件

与传统证券一样&#xff0c;基于区块链技术发展出来的虚拟资产交易所经历了快速发展而缺乏有效监管的行业早期。除了科技光环加持的各种区块链项目方、造富神话之外&#xff0c;交易所遭到黑客攻击、内部偷窃作恶、甚至经营主体异常而致使投资人血本无归的案例亦令人触目惊心。…

STM32 I2C详解

STM32 I2C详解 I2C简介 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 两根通信线&#xff1a; SCL&#xff08;Serial Clock&#xff09;串行时钟线&#xff0c;使用同步的时序&#xff0c;降低对硬件的依赖&#xff0c;同时同步的时序稳定…

udp多点通信-广播-组播

单播 每次只有两个实体相互通信&#xff0c;发送端和接收端都是唯一确定的。 广播 主机之间的一对多的通信所有的主机都可以接收到广播消息(不管你是否需要)广播禁止穿过路由器&#xff08;只能做局域网通信&#xff09;只有UDP可以广播广播地址 有效网络号全是1的主机号 192.1…

酷开系统 酷开科技,将家庭娱乐推向新高潮

在当今数字化时代&#xff0c;家庭娱乐已经成为人们日常生活中不可或缺的一部分。如果你厌倦了传统的家庭娱乐方式&#xff0c;想要一种全新的、充满惊喜的娱乐体验&#xff0c;那么&#xff0c;不妨进入到酷开科技的世界&#xff0c;作为智能电视行业领军企业&#xff0c;酷开…

Dubbo协议详解

前言特点应用场景Dubbo协议示例Dubbo协议的不足拓展 前言 Dubbo协议是一种高性能、轻量级的开源RPC框架&#xff0c;主要设计目的是解决分布式系统中服务调用的一些常见问题&#xff0c;例如服务负载均衡、服务注册中心、服务的远程调用等。它支持多种语言&#xff0c;例如Jav…

Day10—SQL那些事(特殊场景的查询)

文章目录 1、只想查一个字段却不得不左连接好多张表2、左连接的时候只想取最后一条数据 1、只想查一个字段却不得不左连接好多张表 只想查一个字段却不得不左连接好多张表&#xff0c;而且因为左连接的表太多还导致查出来的数据重复 原先的sql SELECTsph.po_num,chh.visa_ex…

向量以及矩阵

0.前言 好了那我们新的征程也即将开始&#xff0c;那么在此呢我也先啰嗦两句&#xff0c;本篇文章介绍数学基础的部分&#xff0c;因为个人精力有限我不可能没一字一句都讲得非常清楚明白&#xff0c;像矩阵乘法之类的一些基础知识我都是默认你会了&#xff08;还不会的同学推…

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器 文章目录 无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

认识Tomcat

文章目录 什么是tomcat&#xff1f;tomcat的使用tomcat的下载tomcat的目录结构tomcat的启动在tomcat上部署页面通过浏览器访问部署的页面 学习servlet的原因 什么是tomcat&#xff1f; 盖棺定论&#xff1a;Tomcat是一个HTTP服务器。 我们接下来要长期学习的东西都是关于前后…

Python框架篇(2):FastApi-参数接收和验证

提示: 如果想获取文章中具体的代码信息&#xff0c;可在微信搜索【猿码记】回复 【fastapi】即可。 1.参数接收 1.1 路径参数(不推荐) 1.代码清单 在app/router下&#xff0c;新增demo_router.py文件,内容如下: from fastapi import APIRouterrouter APIRouter( prefix&qu…

SpringCloud微服务:Nacos的集群、负载均衡、环境隔离

目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务&#xff0c;例如userservice 二级是集群&#xff0c;例如杭州或上海 …

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

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

设计基于STM32F103C8T6微控制器的巡线小车

巡线小车是一种能够在一条预定线追踪路径的小车&#xff0c;广泛应用于工业自动化、物流仓储、智能家居等领域。本设计将使用STM32F103C8T6微控制器来实现一个基础的巡线小车。 硬件组成&#xff1a;1. STM32F103C8T6微控制器开发板&#xff1a;作为巡线小车的核心控制器&…

开源与闭源:数字化时代的辩论与未来走向

在当今的数字化时代&#xff0c;关于开源和闭源软件的辩论一直是技术界的热门话题。 特斯拉CEO马斯克最近也加入了这场辩论&#xff0c;公开表示OpenAI不应该闭源&#xff0c;而他自己的首款聊天机器人将选择开源。 这引发了人们对开源与闭源软件的进一步思考&#xff1a;开源是…

关于数据mysql ->maxwell->kafka的数据传输

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大三在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展&#xff0c;各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分&#xff0c;对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…