安卓开发中轮播图和其指示器的设置

        在安卓开发中,轮播图(Carousel)是一种常见的UI组件,用于展示一系列图片或内容,用户可以左右滑动来切换不同的视图。轮播图通常用于展示广告、新闻、产品图片等。

        轮播图的指示器(Indicator)则是用于告诉用户当前展示的是轮播图中的哪一项,以及总共有多少项。

一、定义布局

1、定义轮播图和指示器载体

  • 一个ViewPager2组件用于显示轮播图。
  • LinearLayout组件用于显示圆点指示器。
                    <androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/sc_vip_content_cl"android:layout_width="match_parent"android:layout_height="wrap_content"><!--          轮播图          --><androidx.viewpager2.widget.ViewPager2android:id="@+id/sc_vip_slideshow_vp"android:layout_width="match_parent"android:layout_height="@dimen/dp_216"app:layout_constraintBottom_toTopOf="@+id/sc_vip_content_ll"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><!-- 圆点指示器 --><LinearLayoutandroid:id="@+id/sc_vip_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="@dimen/dp_30"android:gravity="center"android:orientation="horizontal"app:layout_constraintBottom_toBottomOf="@id/sc_vip_slideshow_vp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

2、定义ViewPager2的布局页面

定义ViewPager2的布局页面来放轮播图需要展示的内容

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><data></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/dp_218"><androidx.appcompat.widget.AppCompatImageViewandroid:id="@+id/sc_vip_vp_iv"android:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/sc_png_vip_banner1"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout></layout>

二、定义Fragment作为轮播图的载体

这个Fragment布局文件用的是上面定义ViewPager2的布局页面,作为轮播图的展示载体

定义了一个名为 ScVipSlideshowVpFrag 的 Fragment 类,它继承自 BaseFragmentX 类,并且使用了 ScFragVipVpBinding 作为数据绑定类。这个 Fragment 用于展示单个图片,通常用在轮播图中。

以下是代码的详细解释:

1、类定义:定义了一个名为 ScVipSlideshowVpFrag 的类,它继承自 BaseFragmentX(封装过的),并且使用了 ScFragVipVpBinding 作为数据绑定类。

2、Companion Object:定义了一个伴生对象(Companion Object),它包含了一个常量 IMAGE_ID 和一个静态方法 getInstance()。 IMAGE_ID:用于在 Bundle 中存储图片资源ID。

3、getInstance():这是一个静态方法,用于创建 ScVipSlideshowVpFrag 实例,并设置图片资源ID。

4、setLayoutId():重写了 BaseFragmentX 中的 setLayoutId() 方法,返回布局文件的资源ID R.layout.sc_frag_vip_vp。

5、onLazyLoad():重写了 BaseFragmentX 中的 onLazyLoad() 方法,这个方法在 Fragment 可见时被调用。在这个方法中,从 arguments 中获取图片资源ID,并将其设置到布局中的图片视图 scVipVpIv 上。 这个 Fragment 类可以用于轮播图中的每个页面,展示单个图片。通过 getInstance() 方法,可以创建 ScVipSlideshowVpFrag 实例,并传递图片资源ID。在 onLazyLoad() 方法中,根据传递的图片资源ID设置图片视图。

import android.os.Bundle
import com.mango.base.base.BaseFragmentX
import com.mango.sc.R
import com.mango.sc.databinding.ScFragVipVpBinding/*** * 顶部轮播图* */
class ScVipSlideshowVpFrag : BaseFragmentX<ScFragVipVpBinding>() {companion object {const val IMAGE_ID = "image_id"fun getInstance(imageResId: Int): ScVipSlideshowVpFrag {return ScVipSlideshowVpFrag().apply {arguments = Bundle().apply {putInt(IMAGE_ID, imageResId)}}}}override fun setLayoutId(): Int {return R.layout.sc_frag_vip_vp}override fun onLazyLoad() {val imageResId = arguments?.getInt(IMAGE_ID) ?: 0mDatabind.scVipVpIv.apply {setImageResource(imageResId)}}}

三、定义ViewPager2的适配器

        使用 FragmentStateAdapter 来创建一个适配器,用于在 ViewPager2 中展示一系列的图片。FragmentStateAdapter 是 ViewPager2 的适配器,用于管理与页面相关的 Fragment。这个适配器在 ViewPager2 中非常实用,因为它可以有效地处理页面的生命周期,并且只在用户滑动到的页面上创建 Fragment。

类定义:定义了一个名为 ScVipSlideshowVpAdapter 的类,它继承自 FragmentStateAdapter。

1、构造函数:接收三个参数: fragmentManager:用于管理 Fragment 的生命周期。 lifecycle:用于确保适配器与 Fragment 的生命周期同步。 images:一个 IntArray,包含了要展示的图片资源的ID。

2、getItemCount():重写了 FragmentStateAdapter 的 getItemCount() 方法,返回图片数组 images 的大小,即轮播图中页面的数量。

3、createFragment(position: Int):重写了 FragmentStateAdapter 的 createFragment() 方法,根据传入的位置 position 创建并返回一个 Fragment。 调用ScVipSlideshowVpFrag 的 Fragment 类,有一个静态方法 getInstance(),用于创建并初始化 Fragment 实例。 这个适配器可以与 ViewPager2 一起使用,来实现顶部轮播图的功能,然后在 Activity 或 Fragment 中设置这个适配器。

/*** 顶部轮播图适配器* */
class ScVipSlideshowVpAdapter(fragmentManager: FragmentManager,lifecycle:Lifecycle,private val images:IntArray) : FragmentStateAdapter(fragmentManager,lifecycle) {override fun getItemCount(): Int = images.sizeoverride fun createFragment(position: Int): Fragment {return ScVipSlideshowVpFrag.getInstance(images[position])}}

四、在fragment/activity中使用ViewPager2

1、初始化数据

先初始化轮播图需要展示的图片数据列表、和ViewPager2的适配器,传入images

   //设置轮播图内容private val images = intArrayOf(R.drawable.sc_png_vip_banner1,R.drawable.sc_png_vip_banner2,R.drawable.sc_png_vip_banner3,R.drawable.sc_png_vip_banner4)//轮播图Vp适配器private val slideshowVpAdapter: ScVipSlideshowVpAdapter by lazy {ScVipSlideshowVpAdapter(childFragmentManager,viewLifecycleOwner.lifecycle,images)}

 设置xml中定义的ViewPager2的适配器

        mDatabind.scVipSlideshowVp.adapter = slideshowVpAdapter

到此为止就已经可以正常在页面中滑动ViewPager2看到所设置的四张banner图片了,但是还没有设置轮播图的指示器

五、设置指示器

1、导入指示器的图片

导入资源文件作为指示器的图片显示,这里导入的就是最常见的小圆点,选中和非选中的两个图标

 2、设置指示器

initDotIndicator是一个初始化圆点指示器的方法,用于配合 ViewPager2 使用,显示当前页面的位置。

以下是代码的详细解释:

1、获取 ViewPager2 和指示器视图:通过 mDatabind 获取 ViewPager2 和指示器 LinearLayout 的实例。这里因为项目使用的MVVM框架,所以可以直接获取控件的实例。

2、获取页面总数:通过 viewPager.adapter?.itemCount 获取 ViewPager2 中的页面总数,并将其存储在 pageCount 变量中。

3、记录日志:使用 AppLogTask 类记录页面总数的日志,直接忽略就好了,调试用的(封装过的)。

4、创建并添加指示器圆点:

  1. 使用循环创建与页面总数相等的 ImageView 实例,每个 ImageView 代表一个圆点。
  2. 设置每个圆点的大小和间距。
  3. 根据圆点的位置设置选中和未选中的图片资源。第一个圆点(i == 0)设置为选中状态的图片,其他圆点设置为未选中状态的图片。
  4. 将每个圆点添加到指示器 LinearLayout 中。

5、记录日志:为每个添加的圆点记录日志。直接忽略就好了,调试用的(封装过的)。

6、监听 ViewPager2 页面变化:

  1. 注册 ViewPager2.OnPageChangeCallback 监听器,以便在页面变化时更新指示器状态。
  2. 在 onPageSelected 方法中,根据当前页面的位置更新每个圆点的图片资源,将当前页面对应的圆点设置为选中状态,其他圆点设置为未选中状态。

这段代码实现了一个基本的圆点指示器功能,当用户滑动 ViewPager2 时,指示器会相应地更新,显示当前页面的位置。这是轮播图组件中常用的一种指示器样式,能够直观地告诉用户当前查看的是哪一个页面。

    // 初始化圆点指示器private fun initDotIndicator() {val viewPager = mDatabind.scVipSlideshowVpval indicator = mDatabind.scVipIndicator// 获取页面总数val pageCount = viewPager.adapter?.itemCount ?: 0AppLogTask.get().pushEventLog("pageCount","$pageCount")// 创建并添加指示器圆点for (i in 0 until pageCount) {val dot = ImageView(requireContext())val size = resources.getDimensionPixelSize(R.dimen.dp_6)val params = LinearLayout.LayoutParams(size, size)if (i != 0) {params.leftMargin = resources.getDimensionPixelSize(R.dimen.dp_6)}dot.layoutParams = paramsdot.setImageResource(if (i == 0) R.drawable.sc_vip_indicator_selected else R.drawable.sc_vip_indicator_unselected)indicator.addView(dot)AppLogTask.get().pushEventLog("ScVipFrag", "Added dot at position $i")}// 监听 ViewPager2 页面变化viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {override fun onPageSelected(position: Int) {super.onPageSelected(position)// 更新指示器状态for (i in 0 until indicator.childCount) {(indicator.getChildAt(i) as ImageView).setImageResource(if (i == position) R.drawable.sc_vip_indicator_selected else R.drawable.sc_vip_indicator_unselected)}}})}

到此就设置完了,注意一下在xml页面中的布局,有可能会覆盖住指示器,导致设置成功之后却显示不了的情况(因为我第一次设置就遇到了,所以加入了调试代码 )(0_0)

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

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

相关文章

大模型生图安全疫苗注入赛题解析(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月实践赛的大模型生图安全疫苗注入赛道&#xff1b;本文主要整理本次赛事的基本流程和优化方法。&#x1f495;&#x1f495;&#x1f60a; 一…

IEC104规约的秘密之九----链路层和应用层

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…

好用,易用,高效,稳定 基于opencv 的 图像模板匹配 - python 实现

在定位、搜索固定界面图块时&#xff0c;经常用到模板匹配&#xff0c;opencv自带的图像模板匹配好用&#xff0c;易用&#xff0c;高效&#xff0c;稳定&#xff0c;且有多种匹配计算方式。 具体示例如下&#xff1a; 模板图&#xff1a; 待搜索图&#xff1a; 具体实现代码…

FreeRTOS - 任务管理

在学习FreeRTOS过程中&#xff0c;结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源&#xff0c;整理了该篇文章。如有内容理解不正确之处&#xff0c;欢迎大家指出&#xff0c;共同进步。 参考&#xff1a;https://rtos.100ask.net/zh/…

SpringColoud GateWay 核心组件

优质博文&#xff1a;IT-BLOG-CN 【1】Route路由&#xff1a; Gateway的基本构建模块&#xff0c;它由ID、目标URL、断言集合和过滤器集合组成。如果聚合断言结果为真&#xff0c;则匹配到该路由。 Route路由-动态路由实现原理&#xff1a; 配置变化Apollo 服务地址实例变化…

H3C设备连接方式

Console线本地连接 协议Serial&#xff0c;接口com口&#xff0c;波特率9600&#xff08;设备管理器中查看com口&#xff09; 适用于设备初次调试 使用Telnet远程访问 适用于设备上架配置好后的维护管理 使用SSH远程访问 数据传输过程加密&#xff0c;安全的远程访问

洞察数字化营销的本质

数字化营销&#xff0c;即借助互联网、移动互联网、社交媒体等数字技术与渠道实现营销目标。涵盖市场调研、品牌推广、产品销售到客户服务全过程。 其特点显著。精准定位是一大优势&#xff0c;利用大数据分析和人工智能&#xff0c;深入了解客户需求、兴趣和行为&#xff0c;精…

AdmX_new

0x00前言 因为环境问题&#xff0c;此次靶场都放在vm上。都为NAT模式。 靶机地址: https://download.vulnhub.com/admx/AdmX_new.7z 需要找到两个flag文件。 0x01信息搜集 搜集IP 确认目标IP为172.16.8.131&#xff0c;进一步信息搜集 获取端口开放情况&#xff0c;版本信…

多模态大语言模型(MLLM)-Blip3/xGen-MM

论文链接&#xff1a;https://www.arxiv.org/abs/2408.08872 代码链接&#xff1a;https://github.com/salesforce/LAVIS/tree/xgen-mm 本次解读xGen-MM (BLIP-3): A Family of Open Large Multimodal Models 可以看作是 [1] Blip: Bootstrapping language-image pre-training…

stm32 bootloader写法

bootloader写法&#xff1a; 假设app的起始地址&#xff1a;0x08020000&#xff0c;则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义 typedef void (*APP_FUNC)(void); // 函数指针类型定义 /*main函数中调用rum_app&#x…

【从零开始的LeetCode-算法】504. 七进制数

给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: "202"示例 2: 输入: num -7 输出: "-10"提示&#xff1a; -107 < num < 107 我的解答 class Solution {public String convertT…

大数据存储计算平台EasyMR:大数据集群动态扩缩容,快速提升集群服务能力

在当今的数据驱动时代&#xff0c;组织面临着数据量的爆炸性增长。为了有效管理和存储这些数据&#xff0c;许多组织依赖于 Hadoop 这样的分布式存储系统。Hadoop 集群通过在多个节点上存储数据的冗余副本&#xff0c;提供了高可靠性和可扩展性。然而&#xff0c;随着数据量的不…

ChatGPT国内中文版镜像网站整理合集(2024/10/06)

一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1&#xff0c;支持MJ绘画 ② chat.lify.vip 支持通用全模型&#xff0c;支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4&#xff0c;4o以及MJ绘画 1. 什么是镜像站 镜像站&#xff08;Mirror Site&#xff…

Spring Boot在线考试系统:JavaWeb技术的应用案例

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

概率 随机变量以及分布

一、基础定义及分类 1、随机变量 随机变量是一个从样本空间&#xff08;所有可能结果的集合&#xff09;到实数集的函数。&#xff08;随机变量的值可以是离散的&#xff0c;也可以是连续的。 &#xff09; 事件可以定义为随机变量取特定值的集合。 2、离散型随机变量 随机变…

OpenCV高级图形用户界面(17)设置一个已经创建的滚动条的最小值函数setTrackbarMin()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::setTrackbarMin 这个函数的作用就是设置指定窗口中轨迹条的最小位置。这使得开发者能够在程序运行时动态地调整轨迹条的范围&#xff0c;而不…

Leetcode—1242. 多线程网页爬虫【中等】Plus(多线程)

2024每日刷题&#xff08;187&#xff09; Leetcode—1242. 多线程网页爬虫 实现代码 /*** // This is the HtmlParsers API interface.* // You should not implement it, or speculate about its implementation* class HtmlParser {* public:* vector<string>…

Go程序的一生——Go如何跑起来的?

引入编译链接概述 编译过程 词法分析语法分析语义分析中间代码生成目标代码生成与优化链接过程Go 程序启动GoRoot 和 GoPathGo 命令详解 go buildgo installgo run总结参考资料 引入 我们从一个 Hello World 的例子开始&#xff1a; package mainimport "fmt"func…

PROFINET开发EtherNet/IP开发Vline板卡在称重设备行业的应用

本次分享的&#xff0c;是我们VlinePROFINET开发EtherNet/IP开发嵌入式板卡在称重行业的典型应用。 应用背景 在现代科技高度发达的时代&#xff0c;无论是科学研究、医疗诊断、制药生产还是工业制造&#xff0c;准确的测量和称重都是保证质量和效率的关键。 随着新项目实施…