Android 实现账号诊断动画效果,逐条检测对应的项目

news2024/12/24 20:29:54

Dialog中的项目 逐条检测效果:
在这里插入图片描述

依赖库:

implementation 'com.github.li-xiaojun:XPopup:2.9.19'
implementation 'com.blankj:utilcodex:1.31.1'
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.10'

1、item_account_check.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_marginTop="@dimen/dp_10"
    android:layout_height="@dimen/dp_52">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginEnd="@dimen/dp_10"
        android:layout_toStartOf="@id/iv_state"
        android:layout_alignParentStart="true"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@color/gray_333"
        android:textSize="@dimen/sp_28"
        tools:text="@string/app_name" />

    <ImageView
        android:id="@+id/iv_state"
        android:layout_width="@dimen/dp_40"
        android:layout_height="@dimen/dp_40"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        tools:src="@mipmap/ic_launcher" />
</RelativeLayout>

2、实体类

data class CheckResultInfo(
        val text: String,
        val value: String,
        var checkState: Int = -1// 检测状态:0 未检测;1检测中;2已检测
)

3、AccountCheckAdapter .kt

open class AccountCheckAdapter : BaseQuickAdapter<CheckResultInfo, BaseViewHolder?>(R.layout.item_account_check) {

    override fun convert(helper: BaseViewHolder, item: CheckResultInfo) {
        try {
            val tvWord = helper.getView<TextView>(R.id.tv_title)
            tvWord.text = item.text
            val ivState = helper.getView<ImageView>(R.id.iv_state)
            if (item.checkState < 1) {
                // 未诊断
                ivState.isVisible = false
            } else if (item.checkState == 1) {
                // 正在诊断
                ivState.isVisible = true
                ImageLoader.loadUrl(mContext, R.mipmap.ic_item_checking, ivState)
                tvWord.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
                tvWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, mContext.resources.getDimension(R.dimen.sp_32))
            } else if (item.checkState == 2) {
                // 已诊断
                ivState.isVisible = true
                ImageLoader.loadUrl(mContext, R.mipmap.ic_item_checked, ivState)
                tvWord.typeface = Typeface.DEFAULT_BOLD
                tvWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, mContext.resources.getDimension(R.dimen.sp_28))
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

4、dialog_account_check.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/transparent"
    android:gravity="center"
    android:orientation="vertical">

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_white_radius_24"
        android:orientation="vertical">

        <ImageView
            android:layout_width="@dimen/dp_220"
            android:layout_height="@dimen/dp_220"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="@dimen/dp_40"
            android:scaleType="centerCrop"
            android:src="@mipmap/ic_account_checking" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/dp_115"
            android:layout_marginTop="@dimen/dp_24"
            android:layout_marginBottom="@dimen/dp_60"
            tools:listitem="@layout/item_account_check" />

    </androidx.appcompat.widget.LinearLayoutCompat>

    <ImageView
        android:id="@+id/iv_close"
        android:layout_width="@dimen/dp_72"
        android:layout_height="@dimen/dp_72"
        android:layout_marginTop="@dimen/dp_35"
        android:src="@mipmap/ic_close_dialog" />

</androidx.appcompat.widget.LinearLayoutCompat>

5、AccountCheckDialog.kt

/**
 * 账号诊断
 */
class AccountCheckDialog(
        mContext: Context,
        private val dataList: List<CheckResultInfo>,
        private val checkedCallback: (() -> Unit)? = null,
) : CenterPopupView(mContext) {
    private lateinit var checkAdapter: AccountCheckAdapter
    private val checkTime = 1500L
    private val MSG_WHAT = 1000

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

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

    private fun initListener() {
        val rvList = findViewById<RecyclerView>(R.id.rv_list)
        val ivClose = findViewById<ImageView>(R.id.iv_close)

        with(rvList) {
            layoutManager = LinearLayoutManager(context)
            checkAdapter = AccountCheckAdapter()
            adapter = checkAdapter
            checkAdapter.setNewData(dataList)
        }
        com.jr.libbase.extension.setOnClickListener(ivClose) {
            when (this) {
                ivClose -> {
                    mHandler.removeCallbacksAndMessages(null)
                    dismiss()
                }
            }
        }
    }

    private fun startCheck() {
        val currentPos = 0
        checkAdapter.data[currentPos].checkState = 1
        checkAdapter.notifyItemChanged(currentPos)
        mHandler.sendMessageDelayed(Message().apply {
            what = MSG_WHAT
            arg1 = currentPos
        }, checkTime)
    }


    private val mHandler = MyHandler(this)

    private class MyHandler(dialog: AccountCheckDialog?) : Handler() {
        //弱引用持有HandlerActivity , GC 回收时会被回收掉
        private val weakReference: WeakReference<AccountCheckDialog?>

        init {
            weakReference = WeakReference<AccountCheckDialog?>(dialog)
        }

        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            val mDialog: AccountCheckDialog = weakReference.get() ?: return

            when (msg.what) {
                mDialog.MSG_WHAT -> {
                    try {
                        var position = msg.arg1

                        Log.d("caowj", "dialog position=$position")
                        if (position < mDialog.dataList.size) {
                            mDialog.checkAdapter.data[position].checkState = 2
                            mDialog.checkAdapter.notifyItemChanged(position)
                            position += 1

                            if (position <= mDialog.dataList.size - 1) {
                                mDialog.checkAdapter.data[position].checkState = 1
                                mDialog.checkAdapter.notifyItemChanged(position)

                                sendMessageDelayed(Message().apply {
                                    what = mDialog.MSG_WHAT
                                    arg1 = position
                                }, mDialog.checkTime)
                            }else{
                                mDialog.checkedCallback?.invoke()
                                mDialog.dismiss()
                            }
                        }
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
            }
        }
    }
}

6、使用Dialog:

    /**
     * 账号诊断Dialog
     */
    private fun showCheckingDialog(list: List<CheckResultInfo>) {
        XPopup.Builder(context)
            .isDestroyOnDismiss(true)
            .dismissOnBackPressed(false)
            .dismissOnTouchOutside(false)
            .asCustom(AccountCheckDialog(requireContext(), list, checkedCallback = {
                Log.d("caowj", "账号诊断完成,查看检测报告")
            })).show()
    }

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

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

相关文章

【C语言】静态关键字static的用法(详解)

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;C语言初阶 ✨其他专栏&#xff1a;代码小游戏 &#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论…

I.MX6ULL_Linux_驱动篇(44)linux MISC驱动

MISC 驱动也叫做杂项驱动&#xff0c;也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。 MISC 驱动其实就是最简单的字符设备驱动&#xff0c;通常嵌套在 platform 总线驱动中&#xff0c;实现复杂的驱动&#xff0c;本章我们就来学习一下 MISC 驱动的编写…

恺英网络宣布:与华为鸿蒙系统展开合作,将开发多款手游

8月5日消息&#xff0c;恺英网络宣布旗下子公司盛和网络参加了华为开发者大会&#xff08;HDC.Together&#xff09;游戏服务论坛&#xff0c;并在华为鸿蒙生态游戏先锋合作启动仪式上进行了亮相。恺英网络表示&#xff0c;将逐步在HarmonyOS上开发多款游戏&#xff0c;利用Har…

【C++】做一个飞机空战小游戏(五)——getch()控制两个飞机图标移动(控制光标位置)

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

ffmpeg-ffplay代码架构简述

全局变量 /* Minimum SDL audio buffer size, in samples. */ // 最小音频缓冲 #define SDL_AUDIO_MIN_BUFFER_SIZE 512 /* Calculate actual buffer size keeping in mind not cause too frequent audio callbacks */ // 计算实际音频缓冲大小&#xff0c;并不需要太频繁…

c语言基础知识帮助理解(详解数组)

前面梳理完函数和递归的知识后&#xff0c;来进行数组知识的梳理 对函数有疑惑的同学&#xff0c;可以看我之前的文章&#xff1a;c语言基础知识帮助理解&#xff08;详解函数&#xff09;_总之就是非常唔姆的博客-CSDN博客 c语言基础知识帮助理解&#xff08;函数递归详解&am…

类的6个默认成员函数 构造函数

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生…

ruoyi-cloud-notes01

1、Maven中的dependencyManagement Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息&#xff0c;那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找…

HCIP MPLS总结

一、MPLS--多协议标签交换 多协议&#xff1a;可以基于多种不同的3层协议来生成2.5层的标签信息&#xff1b; 包交换&#xff1a;包为网络层的PDU&#xff0c;故包交换是基于IP地址进行数据转发&#xff1b;就是路由器的路由行为&#xff1b; 原始的包交换&#xff1a;数据包…

STM32 CubeMX USB_CDC(USB_转串口)

STM32 CubeMX STM32 CubeMX 定时器&#xff08;普通模式和PWM模式&#xff09; STM32 CubeMX一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码实验效果 ![请添加图片描述](https://img-blog.csdnimg.cn/a7333bba478441ab950a66fc63f204fb.png)printf发…

分库分表概念、原理、拆分策略和实现技术讲解

文章目录 1.什么是分库分表2.分库分表拆分策略2.1 垂直拆分2.2 水平拆分 3.分库分表实现技术简介 1.什么是分库分表 分库分表的中心思想就是将数据分散存储&#xff0c;使得单一数据库/表的数据量变小来缓解单一数据库的性能问题&#xff0c;从而达到提升数据库性能的目的。 …

python中使用yt-dlp模块实现带进程条下载音视频

当代的互联网时代&#xff0c;视频内容的流行无疑是其中的重要组成部分。作为全球最大的视频分享平台&#xff0c;每天吸引着数以亿计的用户观看各种各样的视频内容。有时候&#xff0c;我们可能希望将某些喜欢的视频保存到本地进行观看&#xff0c;或者将它们用于其他用途。在…

406 · 和大于S的最小子数组

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a;同向双指针 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param nums: an array …

任务12、Quality指令加持,Midjourney生成电影级数码作品

12.1 任务概述 本次实验任务旨在帮助你掌握Midjourney AI绘画中的Quality指令。通过深入介绍Quality指令的概念和作用,我们将解释为什么它在绘画中至关重要。通过测试不同的Quality参数对绘画效果的影响,并提供实战演示,你将学会如何在Midjourney中设置Quality参数以达到更…

Spring 事务详解(注解方式)

目 录 序言 1、编程式事务 2、配置声明式事务 2.1 基于TransactionProxyFactoryBean的方式&#xff08;不常用&#xff0c;因为要为每一个类配置TransactionProxyFactoryBean&#xff09; 2.2 基于AspectJ的XML方式&#xff08;常用&#xff0c;可配置在某些类下的所有子…

⛳ StringBuffer and StringBuilder 处理字符串

目录 ⛳ StringBuffer and StringBuilder 处理字符串&#x1f3a8; 一&#xff0c;简介&#x1f3ed; 二&#xff0c;常用方法&#x1f69c; 三 &#xff0c;StringBugger&#x1f43e; 四&#xff0c;StringBuilder⭐ 五&#xff0c;StringBuffer和StringBuilder面试 ⛳ Strin…

【李宏毅机器学习·学习笔记】Tips for Training: Adaptive Learning Rate

本节课主要介绍了Adaptive Learning Rate的基本思想和方法。通过使用Adaptive Learning Rate的策略&#xff0c;在训练深度神经网络时程序能实现在不同参数、不同iteration中&#xff0c;学习率不同。 本节课涉及到的算法或策略有&#xff1a;Adgrad、RMSProp、Adam、Learning …

Qt应用开发(基础篇)——时间微调输入框QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类&#xff0c;这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件&#xff0c;父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板4

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…