模拟Toast 自定义提示框

news2024/11/22 19:01:59

模拟Toast 自定义提示框

前言

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

功能如下:

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

TipPop

class TipPopup : PopupWindow {

    private val ctx: Context

    constructor(ctx: Context, content: String) : super(ctx) {
        this.ctx = ctx

        contentView = LayoutInflater.from(ctx).inflate(R.layout.toast_tip, null)
        width = ViewGroup.LayoutParams.WRAP_CONTENT
        height = ViewGroup.LayoutParams.WRAP_CONTENT
        isFocusable = true
        isOutsideTouchable = true
        animationStyle = R.style.dialog_animation_style
        setBackgroundDrawable(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: Int
        var y: Int

        when (gravity) {
            Gravity.LEFT or Gravity.CENTER_VERTICAL -> {
                x = centerX - contentView.measuredWidth
                y = centerY - contentView.measuredHeight / 2
            }
            Gravity.RIGHT or Gravity.CENTER_VERTICAL -> {
                x = centerX
                y = centerY - contentView.measuredHeight / 2
            }
            Gravity.TOP or Gravity.CENTER_HORIZONTAL -> {
                x = centerX - contentView.measuredWidth / 2
                y = centerY - contentView.measuredHeight
            }
            Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL -> {
                x = centerX - contentView.measuredWidth / 2
                y = centerY
            }
            /*默认正中间*/
            else -> {
                x = centerX - contentView.measuredWidth / 2
                y = 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">

    <!--场景模式文字提示-->
    <TextView
        android: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"
    >
	<alpha
	   android: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">
	<alpha
	   android: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.coloradmin.cn/o/725767.html

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

相关文章

刷题日记06《回溯算法》

问题描述 力扣https://leetcode.cn/problems/Ygoe9J/ 给定一个无重复元素的正整数数组 candidates 和一个正整数 target &#xff0c;找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。 candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之非阻塞缓存(四)

优化四&#xff1a;非阻塞缓存&#xff0c;提高缓存带宽 对于允许乱序执行的流水线计算机&#xff0c;处理器不需要因数据高速缓存未命中而停止。 例如&#xff0c;处理器可以继续从指令高速缓存获取指令&#xff0c;同时等待数据高速缓存返回丢失的数据。 非阻塞高速缓存或无…

23家企业推出昇腾AI系列新品 覆盖云、边、端智能硬件

[中国&#xff0c;上海&#xff0c;2023年7月6日] 昇腾人工智能产业高峰论坛在上海举办。论坛现场&#xff0c;大模型联合创新启动&#xff0c;26家行业领军企业、科研院所与华为将共同基于昇腾AI进行基础大模型与行业大模型应用创新。同时&#xff0c;华为携手伙伴联合发布昇腾…

Java虚拟机(JVM)、垃圾回收器

一、Java简介 1、Java开发及运行版本 JRE(Java Runtime Environment&#xff0c;运行环境) 所有的程序都要在JRE下才能够运行。包括JVM和Java核心类库和支持文件。JDK(Java Development Kit&#xff0c;开发工具包) 用来编译、调试Java程序的开发工具包。包括Java工具(javac/…

【LNMP】架构及应用部署 搭建电影网站

准备环境 一台虚拟机192.168.108.67 关闭防火墙 systemctl stop firewalld iptables -F setenforce 0 检查光盘 查看yum仓库 安装nginx依赖 [rootlocalhost ~]# yum -y install pcre-devel zlib-devel 创建管理nginx用户&#xff08;用来运行nginx&#xff09; [rootlocalh…

picard安装时报错“Exception in thread “main“ java.lang.UnsupportedClassVersionError”

最近在通过GATK所介绍的best practice流程来call SNP流程 1.流程 1.1 BWA比对&#xff0c;获得sam文件 1.2 准备用picard来压缩排序sam文件为bam文件&#xff0c;并对bam文件进行去重复&#xff08;duplicates marking&#xff09; 这是就需要用到picard软件 按照教程网页上…

go-zero的rpc服务案例解析

go-zero的远程调用服务是基于gRpc的gRPC教程与应用。 zero使用使用gRpc需要安装protoc插件&#xff0c;因为gRpc基于protoc插件使用protocol buffers文件生成rpc服务器和api的代码的。 gRPC 的代码生成还依赖 protoc-gen-go&#xff0c;protoc-gen-go-grpc 插件来配合生成 Go…

机器学习笔记 - 局部敏感哈希简介

一、算法简述 局部敏感散列 (LSH) 技术,可显著加快对数据的邻居搜索或近似重复检测。例如,这些技术可用于以惊人的速度过滤掉抓取网页的重复项,或者从地理空间数据集中对附近点执行近恒定时间查找。 让我们快速回顾一下其他类型的哈希函数,哈希函数的传统用途是…

青岛大学_王卓老师【数据结构与算法】Week04_13_案例分析与实现3_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

漏洞检测01:DNS域传送漏洞

DNS域传送漏洞 文章目录 DNS域传送漏洞漏洞描述检测方法修复建议 DNS域传送漏洞 该漏洞当下已经非常少了 DNS服务器分为&#xff1a;主服务器、备份服务器和缓存服务器。在主备服务器之间同步数据库&#xff0c;需要使用“DNS域传送”。域传送是指备份服务器从主服务器拷贝数…

多目标下改进NSGA-II算法并使用ZDT测试函数验证matlab

目标优化机械臂轨迹&#xff0c;不知道NSGA-II算法改进后到底有没有效果&#xff0c;需要用测试函数进行验证&#xff0c;附matlab代码 参考多目标优化NSGA-II的实现&#xff08;MATLAB完整代码&#xff09;_nsga2 matlab_羽丶千落的博客-CSDN博客 目录 1.复制所有matlab代码…

STM32速成笔记—低功耗模式

文章目录 一、STM32低功耗模式介绍二、睡眠模式2.1 进入睡眠模式2.2 退出睡眠模式 三、停止模式3.1 进入停止模式3.2 退出停止模式 四、待机模式五、程序设计 一、STM32低功耗模式介绍 STM32提供了一些低功耗模式。默认情况下&#xff0c;系统复位或上电复位后&#xff0c;微控…

html中表格

一、table标签 参数说明 实例 <body><table border"1" align"center" width"300" height"200" cellspacing"10"><tr><td>1.1</td><td>1.2</td><td>1.3</td></t…

把labelme得到的json文件转换成yolov8需要的格式,划分数据集

使用labelme打标&#xff0c;得到json文件把所有json文件放到一个单独的文件夹&#xff0c;里面只有json文件使用脚本&#xff0c;把json里面的label,标注框的中心坐标、宽、高提取出来&#xff0c;注意这里的4个值都按照图像大小压缩了。 脚本如下&#xff1a; import json…

【网页设计】基于HTML的湖南渔鼓文化宣传网页的设计

1.引言 随着文化交流的不断深入&#xff0c;湖南渔鼓文化作为湖南省的非物质文化遗产&#xff0c;逐渐引起了人们的关注和研究。为了更好地推广和宣传湖南渔鼓文化&#xff0c;我们设计了一款基于HTML的湖南渔鼓文化宣传网页。 该网页旨在向广大用户介绍湖南渔鼓文化的深厚底…

第四章:SSD网络详解

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:YOLO v1网络详解 第六章:YOLO v2网络详解 第七章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正…

FME之发布全局变量和接收全局变量

1.发布变量用VariableSetter转换器&#xff0c;其中DH是全局变量名称&#xff0c;它的值是从上一步产生的数据中某个字段提取。发布之前我们一般都会用Sampler抽样保留一条记录即可。 2.接收全局变量用VariableRetriever转换器&#xff0c;其中变量名称用之前发布的全局变量名称…

Redis下载和安装(Windows系统)

本套教程中采用 Windows 系统对 Redis 数据库进行讲解。 虽然 Redis 官方网站没有提供 Windows 版的安装包&#xff0c;但可以通过 GitHub 来下载 Windows 版 Redis 安装包&#xff0c;下载地址&#xff1a;点击前往。 注意&#xff1a;Windows 安装包是某位民间“大神”根据 …

小白到运维工程师自学之路 第四十七集 (LNMP部署电影网站)

一、概述 Linux&#xff1a;作为操作系统&#xff0c;提供服务器的基本功能和稳定性。通常使用常见的Linux发行版&#xff0c;如Ubuntu、CentOS等。 Nginx&#xff1a;作为Web服务器和反向代理服务器&#xff0c;处理HTTP请求和传递数据。Nginx具有高性能、稳定性和并发处理能…

Java链式编程与Builder(建造者)设计模式

一、链式编程 1.1.释义 链式编程&#xff0c;也叫级联式编程&#xff0c;调用对象的函数时返回一个this对象指向对象本身&#xff0c;达到链式效果&#xff0c;可以级联调用。 1.2.特点 可以通过一个方法调用多个方法&#xff0c;将多个方法调用链接起来&#xff0c;形成一…