模拟Toast 自定义提示框

模拟Toast 自定义提示框

前言

为满足产品需求,发现现在的ToastUtils不是太重就是不太满足需求,这边写个简单易用的工具,几十行代码解决的问题,还要啥轮子。
toast

功能如下:

  1. 自动消失
  2. 相对锚点位置 可配置,正中间,左中,右中,下中,等
  3. 高宽自适应

TipPop

class TipPopup : PopupWindow {private val ctx: Contextconstructor(ctx: Context, content: String) : super(ctx) {this.ctx = ctxcontentView = LayoutInflater.from(ctx).inflate(R.layout.toast_tip, null)width = ViewGroup.LayoutParams.WRAP_CONTENTheight = ViewGroup.LayoutParams.WRAP_CONTENTisFocusable = trueisOutsideTouchable = trueanimationStyle = R.style.dialog_animation_stylesetBackgroundDrawable(ColorDrawable())contentView.findViewById<TextView>(R.id.toast_tv_tip_content).setText(content)}fun show(parent: View, gravity: Int) {val it = IntArray(2)parent.getLocationOnScreen(it)val centerX = parent.measuredWidth / 2 + it[0]val centerY = parent.measuredHeight / 2 + it[1]/*使用前先测量*/contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)var x: Intvar y: Intwhen (gravity) {Gravity.LEFT or Gravity.CENTER_VERTICAL -> {x = centerX - contentView.measuredWidthy = centerY - contentView.measuredHeight / 2}Gravity.RIGHT or Gravity.CENTER_VERTICAL -> {x = centerXy = centerY - contentView.measuredHeight / 2}Gravity.TOP or Gravity.CENTER_HORIZONTAL -> {x = centerX - contentView.measuredWidth / 2y = centerY - contentView.measuredHeight}Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL -> {x = centerX - contentView.measuredWidth / 2y = centerY}/*默认正中间*/else -> {x = centerX - contentView.measuredWidth / 2y = centerY - contentView.measuredHeight / 2}}showAtLocation(parent, Gravity.NO_GRAVITY, x, y)}}

XML

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><!--场景模式文字提示--><TextViewandroid:layout_gravity="center"android:id="@+id/toast_tv_tip_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@color/black_50"android:gravity="center"android:text="@string/calibrating"android:minWidth="@dimen/dimen_66dp"android:paddingLeft="@dimen/dimen_12dp"android:paddingTop="@dimen/dimen_3dp"android:paddingRight="@dimen/dimen_12dp"android:paddingBottom="@dimen/dimen_3dp"android:textColor="@color/white"android:textSize="@dimen/sp_14"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></FrameLayout>

Style

    <style name="dialog_animation_style"><item name="android:windowEnterAnimation">@anim/anim_show_in</item><item name="android:windowExitAnimation">@anim/anim_show_out</item></style><?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromAlpha="0"android:toAlpha="1.0"android:duration="300"/>
</set>    <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromAlpha="1.0"android:toAlpha="0"android:duration="300"/>
</set>    

使用

private var tipPopup: TipPopup? = null
/*** 提示框,自动消失*/
private fun shoTip(id: Int, start: () -> Unit, end: () -> Unit) {start()if (tipPopup == null) {tipPopup = TipPopup(requireContext(), getStr(id))}if (false == tipPopup?.isShowing) {tipPopup?.show(line, Gravity.TOP or Gravity.CENTER_HORIZONTAL)}Handler().postDelayed({tipPopup?.dismiss()end()}, 1500)
}shoTip(R.string.calibrating, fun() {//开始弹出
}, fun() {//关闭弹窗
})

showAtLocation的理解

showAtLocation,这里查阅资料,主要是对第二个参数的理解比较重要,因为其代表的是相对屏幕的坐标点,所以笔者直接配置为Gravity.NO_GRAVITY

第二个参数:请记住屏幕原点是屏幕的左上角。Gravity.TOP |
Gravity.RIGHT指的就是屏幕的右上角,那么pw的中心点坐标是(屏幕宽,0)。pw默认是在屏幕的中间,也就是Gravity.LEFT表示pw的中心点坐标是(0,1/2屏幕高);

使用前先测量

如下代码,动态获取控件高宽,即可做到大小自适应

   contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)

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

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

相关文章

RTOS任务切换过程中堆栈的使用情况

我们知道 Cortex-M3 系列单片机内部有双堆栈机制。即 Cortex‐M3 拥有两个堆栈指针&#xff1a;主堆栈&#xff08;MSP&#xff09;和进程堆栈&#xff08;PSP&#xff09;。任一时刻只能使用其中的一个。通过控制寄存器 CONTROL 中的选择位进行控制。 两个堆栈指针如下&#…

SparkJDBC性能优化指南

前言 本文以Mysql为例。Spark作为一种强大且广泛应用于大数据处理的分布式计算框架,有着出色的性能和可伸缩性。在使用Spark处理大规模数据时,往往需要与关系型数据库MySQL进行交互。然而,由于MySQL和Spark本身的特性之间存在一些差异,直接使用Spark读写MySQL的默认配置可…

JVM理论(一)基础概念

JVM概述 JVM就是二进制字节码的运行环境,负责装载字节码到其内存,解释/编译为对应平台上的机器指令执行,每条java指令在java虚拟机规范中都有详细定义,包括如何取、处理操作数等;JVM特点如下 一次编译,到处运行&#xff08;各CPU的架构不同的情况下JVM为了实现跨平台,字节码指…

WSL2 及 docker开发环境搭建

WSL2 及 docker开发环境搭建 1.使能WSL 控制面板->程序->程序和功能->启动或关闭Windows功能->勾选红框中选项->确认后重启电脑 &#xfeff; 2.下载Linux Kernel Update安装包 下载地址如下&#xff0c; 附件已将下载的安装包作为附件形式上传&#xff0c;…

6月《中国数据库行业分析报告》已发布,首发空间、搜索引擎数据库【全球产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

高效协作助力企业发展:企业网盘在提升工作效率方面的重要作用!

企业网盘是一种专门为了企业协作工作而设计的在线文档管理平台&#xff0c;受到了众多企业用户的青睐与喜爱。企业网盘如何大幅提高企业协作工作效率&#xff1f; 1、提高文件访问效率 传统的文件共享方式往往使用邮件附件或U盘进行传递&#xff0c;可能会遇到文档版本不一致、…

C语言 - AES软件加解密算法

概述 &#xff08;AES&#xff09;RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法&#xff0c;其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于256位的32位任意倍数。深入学习请参考《密码学》书籍&#xff0c;谢谢各位参阅。 验证环境&#xf…

阿里云ACE认证和华为云HCIE认证对比分析

最近有不少小伙伴私信问我&#xff0c;阿里云、腾讯云、华为云这几大厂商的云认证&#xff0c;哪一个更好&#xff0c;今天有空来跟大家认真地分析一下。 01-从云计算市场占有率来看 作为国内云计算市场的探路人&#xff0c;阿里虽然一路走来有过很多坎坷&#xff0c;但也不负…

Netty的事件驱动模型nio,epoll,oio各个使用场景和支持的网络通讯协议

1.首先说一下nio和epoll有什么区别 在Netty中&#xff0c;Epoll和NIO是两种不同的事件驱动模型&#xff0c;用于实现网络通信。它们在底层的实现和性能特征上有一些区别。 1. NIO&#xff08;Non-blocking I/O&#xff09;&#xff1a;NIO是Java原生的非阻塞I/O模型&#xff…

【hadoop】Google的基本思想

Google的基本思想 三架马车GFS分布式文件系统的核心架构和原理机架感知 MapReduce计算模型PageRank问题MapReduce BigTable 三架马车 Google的基本思想主要有三个&#xff0c;称之为三架马车&#xff0c;分别是GFS&#xff08;Google File System&#xff09;、MapReduce计算模…

MySql进阶(2)

MySql进阶 一、视图1.1 视图的增删改查1. 2 视图的检查选项1.3 视图的更新与作用 二、存储过程2.1 存储介绍2.2 语法2.3 变量2.3.1 系统变量2.3.2、用户自定义变量2.3.2、局部变量 2.4、if判断2.5、参数2.6、case2.7、循环2.7.1、while2.7.2、repeat2.7.3、loop 2.8、游标-curs…

Delphi 11必备指南:使用Git集成Python4Delphi的完整步骤

在Delphi中使用Python有很多好处&#xff0c;可以扩展Delphi的功能并利用Python强大的科学计算和数据分析库。但是&#xff0c;为了将Python集成到Delphi中&#xff0c;我们需要安装Python for Delphi (P4D)组件套件。在这篇博客中&#xff0c;我将介绍如何使用Git安装P4D组件套…