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

        在安卓开发中,轮播图(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.rhkb.cn/news/450534.html

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

相关文章

k3s安装指定版本以及离线安装(docker)

首先下载你所需要版本的k3s安装包&#xff0c;目录结构如下所示&#xff0c;我这里是v1.19.15k3s2。 1.首先赋予可执行权限后进行安装。 # k3s 需要赋予可执行权限 sudo chmod x k3s sudo chmod x k3s-install.sh2.然后将k3s的二进制文件复制到/usr/local/bin/ cp k3s /us…

【Kafka】Kafka源码解析之producer过程解读

从本篇开始 打算用三篇文章 分别介绍下Producer生产消费&#xff0c;Consumer消费消息 以及Spring是如何集成Kafka 三部分&#xff0c;致于对于Broker的源码解析&#xff0c;因为是scala语言写的&#xff0c;暂时不打算进行学习分享。 总体介绍 clients : 保存的是Kafka客户端…

华为携手竹云发布海外一网通办解决方案,助力海外政务数智化发展

10月14日&#xff0c;第44届GITEX GLOBAL展会&#xff08;GITEX GLOBAL 2024&#xff09;在迪拜世界贸易中心盛大开幕。作为全球最具影响力的科技和创业盛会之一&#xff0c;本届活动吸引180多个国家的6500余家全球知名企业集聚迪拜&#xff0c;展示涵盖人工智能、网络安全、移…

【Linux】解答:为什么创建目录文件,硬链接数是2;创建普通文件时,硬链接数是1?(超详细图文)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

spring boot热部署

使用热部署解决了每次都需要重新启动的问题&#xff0c;但不过热部署的在对于改动比较小时速度可能快一些&#xff0c;改动大的话尽量停止 1.使用热部署之前需要在pom.xml文件中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifa…

DS链式二叉树的遍历(11)

文章目录 前言一、链式二叉树的结构结构定义手动搭建 二、二叉树的遍历三种常见遍历(前序、中序、后序)层序遍历 总结 前言 堆是特殊的二叉树&#xff0c;可二叉树本身也很值得研究~   正文开始&#xff01; 一、链式二叉树的结构 前文也提到了二叉树一共有两种&#xff0c;空…

人工智能创造出大量新型蛋白质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【线性回归分析】:基于实验数据的模型构建与可视化

目录 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 1. 数据准备 2. 构建线性回归模型 3. 可视化 数据分析的核心 构建预测模型 应用场景 预测模型中的挑战 结论 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 在数据分析领域&#xff0c;线性…

《拿下奇怪的前端报错》:1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点

问题背景 在一个使用MongoDB GridFS实现文件存储和分片读取的项目中&#xff0c;同事遇到了一个令人困惑的问题&#xff1a;音频文件总是丢失最后几秒&#xff0c;视频文件也出现类似情况。更奇怪的是&#xff0c;播放器显示的总时长为无限大。这个问题困扰了团队成员几天&…

wps安装教程

WPS office完整版是一款由金山推出的免费办公软件&#xff0c;软件小巧安装快&#xff0c;占用内存极小&#xff0c;启动速度快。WPS office完整版包含WPS文字、WPS表格、WPS演示三大功能模块&#xff0c;让我们轻松办公。WPS的功能是依据OFFICE用户的使用习惯而设计&#xff0…

Java5.--继承-重写-多态

笔记暂未整理&#xff1a; 一、面向对象的第二大特征&#xff1a;继承 1.分类&#xff1a;业务封装 功能封装 2.作用 封装-->属性的安全&#xff01; 继承-->重用----重用代码&#xff08;属性方法&#xff09; 多态-->扩展 3.实现继承的步骤 ①从多个相似的类中…

OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇

《OpenShift 4.x HOL教程汇总》 说明&#xff1a; 本文主要说明能够云原生备份容灾的开源项目 Velero 及其红帽扩展项目 OADP 的概念和架构篇。操作篇见《OpenShift 4 - 使用 OADP 对容器应用进行备份和恢复&#xff08;附视频&#xff09; 》 Velero 和 OADP 包含的功能和模…

精品!“缠论分笔预测”,缠论分笔波段空间预测指标!

精品&#xff01;“缠论分笔预测”&#xff0c;缠论分笔波段空间预测指标&#xff01; 使用技巧该指标属于缠论相关指标&#xff0c;可结合缠论使用。使用缠论分笔方法来确定波段的高低点&#xff0c;相比使用“ZIG”算法&#xff0c;似乎更为准确。它能有效减少某些股票高点和…

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

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

Unity 山水树木

本章节内容 1. Unity对3D游戏物体的简单操作&#xff1b; 2. 构建山水树木的场景 1. Unity 简易操作 1.1 新建3D游戏场景 1. 打开Unity Hub&#xff0c;点击 New Project &#xff08;新建项目&#xff09;按键&#xff0c;选择第二项 3D(Built-In Render Pipeline)&#xf…

harmonyOS next之实现时间打卡定时器

需求&#xff1a;实现一个时间打卡签到按钮。 实现方法&#xff1a;每隔一秒钟获取一下当前时间。 实现代码如下&#xff1a; Column(){Text(this.curTime).fontColor(#FFFFFF).fontWeight(600).fontSize(32vp)Text(上班打卡).fontColor(#FFFFFF) } .width(170vp) .height(170…

【 香格里拉酒店-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

[0633].第3-3节:@SentinueResource注解

我的后端学习大纲 SpringCloud学习大纲 是什么&#xff1a; SentinueResource是一个流量防卫防护组件注解 用于指定防护资源&#xff0c;&#xff0c;对配置的资源进行流量控制、熔断降级等功能 SentinueResource注解说明&#xff1a; Target({ElementType.METHOD, ElementTy…

选择合适的SSL证书

随着我们在线业务的增长&#xff0c;确保网站安全变得越来越重要。对于许多人来说&#xff0c;保护网站安全的想法似乎令人望而生畏&#xff0c;尤其是在有各种SSL证书可用的情况下。您可能想知道哪一个最适合您的业务需求或如何浏览这些选项。 除了SSL证书之外&#xff0c;使…

SQL Injection | SQL 注入 —— 时间盲注

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;时间盲注 —— 理论篇 时间盲注&#xff08;Time-Based Blind SQL Injection&#xff09;是一种常见的 SQL 注入技术&#xff0c;适用于那些页面不会返回错误信息&#xff0c;只会回…