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

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()
    }

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

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

相关文章

java Springboot02--Controller,文件上传,拦截器

因为前后端分离了&#xff0c;所以这个项目基本用不到controller 这句话意思&#xff1a; controller只能用get接受前端的请求 RequestMapping(value "/hello",method RequestMethod.GET) GetMapping("/hello") 这两句等价的 前段传递参数&#xff0…

kube-prometheus 使用blackbox进行icmp 监控

安装kube-prometheus 后默认在monitoring namespace中有创建 blackbox-exporter deployment。但默认没有icmp的module配置&#xff0c;无法执行ping探测。因为即使有icmp module&#xff0c;默认配置也是无法执行ping探测的&#xff08;这篇文章要解决的就是这个问题&#xff0…

Syncfusion Essential Edit for WPF Crack

Syncfusion Essential Edit for WPF Crack 在任何WPF应用程序中启用语法高亮显示。 Syncfusion Essential Edit for WPF是一款具有所有基本功能的编辑器&#xff0c;如文本编辑、剪切、复制和粘贴。它允许用户从各种文件格式打开文件并将其保存为各种文件格式。Syncfusion Esse…

企业微信如何发起视频直播?

一、如何发起直播 1.【工作台->直播 】应用可发起&#xff1b; 【群聊—“”—群直播】可发起&#xff0c;发起直播时&#xff0c;支持预览直播视频&#xff0c;确认开始直播后则进入直播。 2.在直播应用或群聊工具中支持发起预约直播&#xff0c;可设置开始时间、直播时长…

opencv基础-34 图像平滑处理-2D 卷积 cv2.filter2D()

2D卷积是一种图像处理和计算机视觉中常用的操作&#xff0c;用于在图像上应用滤波器或卷积核&#xff0c;从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中&#xff0c;图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动&#xff0c;对每个局部区…

Qt做警告处理界面

解决的问题&#xff1a; 做上位机时&#xff0c;多有检测仪器状态&#xff0c;事实显示警告&#xff0c;错误等状态&#xff0c;笔者就是需要显示各种仪器状态&#xff0c;做显示&#xff0c;后做出处理逻辑 Axure设计图&#xff1a; 需求&#xff1a;更新状态&#xff0c;根…

EditPlus连接Linux系统远程操作文件

EditPlus是一套功能强大的文本编辑器&#xff01; 1.File ->FTP->FTP Settings&#xff1b; 2.Add->Description->FTP server->Username->Password->Subdirectory->Advanced Options 注意&#xff1a;这里的Subdirectory设置的是以后上传文件的默认…

有效管理IT问题的5个原则

问题管理就是发现未知的、隐藏的问题&#xff0c;这是根本原因&#xff0c; 这是您 IT 帮助台无穷无尽的工单来源。当您实施有效的 问题管理&#xff0c;您的 IT 团队可以超越消防模式&#xff0c;专注于战略 IT 目标。以下是可以帮助您实现一流问题管理的五个原则&#xff1a;…

Vue电商项目--VUE插件的使用及原理

图片懒加载 图片懒加载&#xff0c;就是图片延迟加载。只加载页面可视区域上的图片&#xff0c;等滚动到页面下面时&#xff0c;再加载对应视口上的图片 而在vue中有一个插件 vue-lazyload - npm (npmjs.com) npm i vue-lazyload 去使用他&#xff0c;这里我们引入了一张图片…

C 语言的转义字符

转义字符也叫转移序列&#xff0c;包含如下&#xff1a; 转移序列 \0oo 和 \xhh 是 ASCII 码的特殊表示。 八进制数示例&#xff1a; 代码&#xff1a; #include<stdio.h> int main(void) {char beep\007;printf("%c\n",beep);return 0; }结果&#xff1a; …

移动端自动化测试实战

UI自动化测试的价值 1、提升回归测试的效率 2、可以进行兼容性测试 UI 自动化测试应用场景 • 冒烟测试自动化&#xff1a;提测之前自动断言提测质量&#xff0c;提供准入参考。 • 功能测试自动化&#xff1a;辅助 QA 与测试工程师的快速验证。 • 验收测试自动化&#xf…

linux内网穿透应用场景有哪些?快解析有什么用处?

随着网络技术的不断发展&#xff0c;无论是工作上还是在生活中人们对网络的依赖和需求越来越高。Linux内网穿透作为一种创新的解决方案&#xff0c;为我们提供了无限可能。 首先我们了解一下Linux操作系统。Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基…

字符函数、字符串函数、内存函数

目录 求字符串长度&#xff1a; size_t strlen ( const char * str ); 无长度限制的字符串函数 字符串拷贝&#xff1a; char * strcpy ( char * destination, const char * source ); 字符串追加&#xff1a; char * strcat ( char * destination, const char * source ); 字…

AR远程专家指导在汽车改装上的应用有哪些?

随着科技的不断发展&#xff0c;AR增强现实技术逐渐走进了我们的生活。加上商贸国际化&#xff0c;远程协同纵深到制造生产的更多环节&#xff0c;研发协同、工艺优化等场景复杂、跨层级、需要频繁沟通确认的流程正通过AR应用实现全面远程化的过渡&#xff0c;在汽车行业&#…

机器视觉赛道持续火热,深眸科技坚持工业AI视觉切入更多应用领域

随着深度学习等算法的突破、算力的不断提升以及海量数据的持续积累&#xff0c;人工智能逐渐从学术界向工业界落地。而机器视觉作为人工智能领域中一个正在快速发展的分支&#xff0c;广泛应用于工业制造的识别、检测、测量、定位等场景&#xff0c;相较于人眼&#xff0c;在精…

C++ 测试框架 GoogleTest 初学者入门篇 丙

断言 什么是断言&#xff1f;断言是用来对表达式执行比较的代码块&#xff0c;调用时类似函数。当表达式一致时&#xff0c;断言返回成功&#xff0c;否则失败。 googletest 的断言是一组宏定义。分为 ASSERT_* 和 EXPECT_* 两种。 比如 ASSERT_EQ(1, 2);EXPECT_EQ(1, 2);上…

MySQL主从复制——概念、原理、搭建过程

文章目录 1.主从复制概念2.主从复制原理3.主从复制结构的搭建3.1 主库配置3.2 从库配置 4.测试主从复制是否搭建成功5.主从复制的小结 DML&#xff08;data manipulation language&#xff09;是数据操纵语言&#xff1a;它们是SELECT、UPDATE、INSERT、DELETE&#xff0c;就象…

vcode开发go

配置环境变量 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 创建文件夹 mkdir hello cd hello go mod help go mod help 初始化一个项目 go mod init hello 获取第三方包 go get github.com/shopspring/decimal 将依赖包下载到本地 go mod …

卷积相关点

从传统的神经网络到卷积神经网络 一.传统的神经网络&#xff08;全连接网络&#xff09; 参数太多&#xff0c;冗余度高&#xff0c;容易过拟合&#xff0c;难以训练 二.卷积神经网络 1.空间平移的不变性&#xff1a;当输入的图像在空间上发生平移时&#xff0c;CNN的相应不…

信息与通信工程面试准备——专业知识提问

1.无线通信&#xff1a;依靠电磁波在空间传播以传输信息。 2.通信的目的&#xff1a;传输信息。 3.通信系统&#xff1a;将信息从信源发送到一个或多个目的地。 4.本书中通信一般指电信&#xff1a;利用电信号传输信息&#xff08;光通信属于电信&#xff0c;因为光也是一种…