基于XPopup实现的弹窗效果

基于XPopup实现的弹窗效果:

implementation 'com.github.li-xiaojun:XPopup:2.9.19'

1、底部弹窗(BottomPopupView)

在这里插入图片描述

class OutlinkDealDialog(
    context: Context,
    private val selectClickCallback: ((index: Int) -> Unit)? = null,
) : BottomPopupView(context) {


    override fun getImplLayoutId(): Int {
        return R.layout.dialog_outlink_deal
    }

    override fun onCreate() {
        super.onCreate()
        initListener()
    }

    fun initListener() {

        val clYjcp = findViewById<ConstraintLayout>(R.id.cl_yjcp)
        val clZyjj = findViewById<ConstraintLayout>(R.id.cl_zyjj)

        com.jr.libbase.extension.setOnClickListener(clYjcp, clZyjj) {
            when (this) {
                clYjcp -> {
                    selectClickCallback?.invoke(1)
                }
                clZyjj -> {
                    selectClickCallback?.invoke(2)
                }
            }
            dismiss()
        }
    }
}

调用弹窗:

    private fun showOutlinkDealDialog() {
        XPopup.Builder(this)
            .isDestroyOnDismiss(true)
//            .dismissOnBackPressed(false)
//            .dismissOnTouchOutside(false)
            .popupPosition(PopupPosition.Bottom)
            .setPopupCallback(object : SimpleCallback() {
                override fun onDismiss(popupView: BasePopupView?) {
                }
            })
            .asCustom(OutlinkDealDialog(this, selectClickCallback = { index ->
                if (index == 1) {
                } else {
                }
                finish()
            })).show()
    }

2、局部阴影弹窗

在这里插入图片描述

class AlbumFilterPop(context: Context,
                     private val typeCallback: (mediaFolder: MediaFolder) -> Unit) : PartShadowPopupView(
    context) {
    private lateinit var rvAlbum: RecyclerView
    private var filterAdapter: AlbumFilterAdapter? = null
    private var dataList: MutableList<MediaFolder>? = null

    override fun getImplLayoutId(): Int {
        return R.layout.pop_album_filter
    }

    override fun onCreate() {
        super.onCreate()
        initView()
        initData()
    }

    private fun initView() {
        rvAlbum = findViewById(R.id.rv_album)

        rvAlbum.apply {
            layoutManager = LinearLayoutManager(activity)
            filterAdapter = AlbumFilterAdapter().apply {
                setOnItemClickListener { adapter, _, position ->
                    val itemData = adapter.data[position] as MediaFolder
                    typeCallback.invoke(itemData)
                    dismiss()
                }
                setEmptyView(LayoutInflater.from(activity).inflate(R.layout.view_empty_white, null))
            }
            adapter = filterAdapter
        }
        dataList?.let {
            filterAdapter?.setNewInstance(it.toMutableList())
        }
    }

    private fun initData() {
        if (dataList.isNullOrEmpty()) {
            MediaUtils.getFolderList { list ->
                filterAdapter?.setNewInstance(list.toMutableList())
            }
        }
    }

    fun setNewData(list: MutableList<MediaFolder>) {
        this.dataList = list
        filterAdapter?.setNewInstance(list.toMutableList())
    }
}
    private fun showFilterPop() {
        if (albumFilterPop == null) {
            albumFilterPop = XPopup.Builder(this) // .offsetX(-offsetX)
                .popupPosition(PopupPosition.Bottom)
                .setPopupCallback(object : SimpleCallback() {
                    override fun onDismiss(popupView: BasePopupView?) {
                        binding.ivLocalAlbumFilter.setImageResource(R.mipmap.ic_grey_arrow_down)
                    }
                })
                .atView(binding.tvLocalAlbum)
                .hasShadowBg(true)
                .asCustom(AlbumFilterPop(this) { mediaFolder ->
                    binding.tvLocalAlbum.text = mediaFolder.name
                }) as AlbumFilterPop
        }
        albumFilterPop?.setNewData(list = folderList)
        if (!albumFilterPop!!.isShow) {
            albumFilterPop?.show()
            binding.ivLocalAlbumFilter.setImageResource(R.mipmap.ic_grey_arrow_up)
        }
    }

3、居中显示

在这里插入图片描述

class CustomTipDialog(context: Context,
                      private val title: String = "提示",
                      private val content: String? = "",
                      private val cancelText: String? = "取消",
                      private val sureText: String? = "确定",
                      private val cancelCallback: (() -> Unit)? = null,
                      private val sureCallback: (() -> Unit)? = null,
) : CenterPopupView(context) {

    override fun getImplLayoutId(): Int {
        return R.layout.dialog_custom_tip
    }

    override fun onCreate() {
        super.onCreate()
        initView()
        initListener()
    }

    private fun initView() {
        findViewById<TextView>(R.id.tv_title).text = title ?: ""
        findViewById<TextView>(R.id.tv_content).text = content ?: ""
        findViewById<TextView>(R.id.tv_cancel).text = cancelText
        findViewById<TextView>(R.id.tv_sure).text = sureText

    }

    private fun initListener() {
        val tvCancel = findViewById<TextView>(R.id.tv_cancel)
        val tvSure = findViewById<TextView>(R.id.tv_sure)
        com.jr.libbase.extension.setOnClickListener(tvCancel, tvSure) {
            when(this) {
                tvCancel -> {
                    cancelCallback?.invoke()
                }
                tvSure -> {
                    sureCallback?.invoke()
                }
            }
            dismiss()
        }
    }

}
XPopup.Builder(context)
    .isDestroyOnDismiss(true)
     .popupPosition(PopupPosition.Bottom)
     .asCustom(
         CustomTipDialog(
             context,
             context.resources.getString(R.string.tip),
             context.resources.getString(R.string.sure_delete),
             sureCallback = {
                 userInfoModel.removeThirdAuth(itemData.id) {
                     //重新刷新 授权列表
                     loadThirdAuthList()
                 }
             })
     ).show()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【岛屿最大面积】BJ某IT厂笔试题

该题在LeetCode上能找到原题&#xff0c;大致意思是&#xff0c;给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&…

浅谈一下企业IT运维痛点以及好用的运维软件推荐

随着IT建设的不断深入和完善&#xff0c;IT资产越来越多&#xff0c;IT运维管理越发显得重要。但不少企业不知道如何有效进行IT运维&#xff0c;不知道如何更好进行IT运维&#xff0c;今天我们就来一起浅谈一下企业IT运维痛点&#xff0c;以及给大家推荐一款好用的运维管理软件…

visual studio配置调用c++ dll opencv为例

1&#xff0c;配置VC目录&#xff0c;包含目录和库目录。 2&#xff0c;链接器->输入->包含目录 3&#xff0c;生成目录下包含对应的dll文件 4&#xff0c;需注意对应的Debug&#xff0c;Release及X86&#xff0c;X64选项

IP库新增多种颜色转换空间IP

颜色空间转换是图像及视频中常用的解决方案&#xff0c;涉及hsv-rgb、rgb-ycrcb等一些常见的颜色空间互相转换&#xff0c;今天带来几种常见的颜色空间转换IP&#xff0c;主要如下&#xff1a; IP库简介 一直想做一个可以供大家学习、使用的开源IP库&#xff0c;类似OpenCores&…

利用鸿鹄优化共享储能的SCADA 系统功能,赋能用户数据自助分析

摘要 本文主要介绍了共享储能的 SCADA 系统大数据架构&#xff0c;以及如何利用鸿鹄来更好的优化 SCADA 系统功能&#xff0c;如何为用户进行数据自助分析赋能。 1、共享储能介绍 说到共享储能&#xff0c;可能不少朋友比较陌生&#xff0c;下面我们简单介绍一下共享储能的价值…

行为型模式 - 模板方法模式

概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。 例如&#…

Docker 基本管理与应用

目录 一、Docker介绍 1、docker概述 2、容器优势 3、Docker与虚拟机的区别 4、Docker核心概念 二&#xff1a; 安装 Docker 1、环境准备、安装依赖包 2、 设置阿里云镜像源&#xff0c;安装 Docker-CE并设置为开机自动启动 3、信息查看 ​三&#xff1a;Docker 镜像操作…

XSS简介

OWASP TOP 10 OWASP(开放式Web应用程序安全项目)的工具&#xff0c;文档&#xff0c;论坛额全球各地分会都是开放的&#xff0c;对所有致力于改进应用程序安全的人士开放&#xff0c;最具权威的就是10项目最严重的Web应用程序安全风险列表 Cross Site Scripting&#xff08;X…

使用Vue的插件clipboard使用复制功能

1.安装clipboard插件 npm install clipboard 2.使用 clipboard <template><div style"margin-right: auto;margin-left: auto; 800px"><el-table :data"list"><el-table-column label"搜索引擎" prop"name"&g…

cesium实战(1)、cesium 加载本地json、GeoJson数据

1、cesium加载本地图层json图层数据 并设置样式 添加图层 // 加载路网数据 wms数据服务let addRoadLayer () > {Cesium.GeoJsonDataSource.load(/cesium/layers/road_84.json, {stroke: Cesium.Color.YELLOW,//多边形或线的颜色 strokeWidth: 3,//多边形或线 宽度clampToG…

【优选算法题练习】day6

文章目录 一、76. 最小覆盖子串1.题目简介2.解题思路3.代码4.运行结果 二、704. 二分查找1.题目简介2.解题思路3.代码4.运行结果 三、34. 在排序数组中查找元素的第一个和最后一个位置1.题目简介2.解题思路3.代码4.运行结果 总结 一、76. 最小覆盖子串 1.题目简介 76. 最小覆…

Selenium(3 + 4 超级详细笔记)

文章目录 selenium&#xff08;web自动化测试&#xff09;1. selenium初始化&#xff08;2种&#xff09;2. chrome 启动参数&#xff08;3种&#xff09;3. 八大定位方式3.1 css 定位3.2 xpath 定位3.3 link_text 定位3.4 partial_link_text 定位3.5 relative 相对定位 4. 添加…

OpenCv之图像轮廓

目录 一、图像轮廓定义 二、绘制轮廓 三、计算轮廓面积与周长 一、图像轮廓定义 图像轮廓是具有相同颜色或灰度的连续带你的曲线.轮廓在形状分析和物体的检测和识别中很有用 轮廓的作用: 用于图形分析物体的识别与检测 注意点: 为了检测的准确性&#xff0c;需要先对图像…

采集传感器的物联网网关怎么采集数据?

随着工业4.0和智能制造的快速发展&#xff0c;物联网&#xff08;IoT&#xff09;技术的应用越来越广泛&#xff0c;传感器在整个物联网系统中使用非常普遍&#xff0c;如温度传感器、湿度传感器、光照传感器等&#xff0c;对于大部分物联网应用来说&#xff0c;采集传感器都非…

JVM系统优化实践(20):GC生产环境案例(三)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 某新手开发工程师接到了一个保存Elasticsearch日志的任务&#xff0c;以供后续分析之用。但写代码的时候&#xff0c;误将保存日志的代码段弄成了无限循环&#xff0c;程序…

C#盯盘小工具,“监”

也是一个小工具&#xff0c;用来看大A股票和主要指数行情的。 如果你是一个上班族&#xff0c;同时你也是一颗小韭菜&#xff0c;a股在开市交易盘中时刻惦记着股票是涨了还是跌了&#xff0c;却不能时刻盯着手机看行情&#xff0c;也不能在电脑上开着同花顺来回切窗口&#xff…

数据可视化自助式分析工具:jvs-bi数据扩展及函数配置说明

jvs-bi数据拓展节点 数据拓展是数据可视化加工过程中的重要工具&#xff0c;它核心的作用是对原有数据表进行加工扩展&#xff0c;实现功能如下图所示 函数配置操作过程 操作说明 1、拖动数据拓展字段&#xff0c;并将字段拓展与之前的历史节点连接起来&#xff0c;点击数据拓…

全面深入理解MySQL自增锁

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

在 3ds Max 中对链模型进行摆放姿势处理

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 建模和“摆姿势”3D链可能看起来是一项繁琐的工作&#xff0c;但实际上可以通过使用阵列工具并将链中的链接视为骨骼来轻松完成。在本教程中&#xff0c;我将向您展示如何对链条进行建模&#xff0c;并通过…

16. 存储过程和存储函数

文章目录 1.存储过程和存储函数2.创建和使用存储过程2.1 语法&#xff1a;2.2 第一个存储过程&#xff0c;打印hello world2.3 调用语法2.4 带参数的存储过程2.5 调试存储过程 3.创建和使用存储函数3.1 存储函数定义3.2 存储函数语法&#xff1a;3.3 存储函数案例&#xff1a; …