模拟Toast 自定义提示框

这篇具有很好参考价值的文章主要介绍了模拟Toast 自定义提示框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模拟Toast 自定义提示框

前言

为满足产品需求,发现现在的ToastUtils不是太重就是不太满足需求,这边写个简单易用的工具,几十行代码解决的问题,还要啥轮子。
模拟Toast 自定义提示框,Android,自定义控件,android

功能如下:

  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屏幕高);

使用前先测量

如下代码,动态获取控件高宽,即可做到大小自适应文章来源地址https://www.toymoban.com/news/detail-540910.html

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

到了这里,关于模拟Toast 自定义提示框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue自定义全局弹出询问框、输入框、提示框、toast(附源码)

    早前写过一篇关于vue自定义弹出询问框、输入框、提示框的贴子,当时只是实现了组件化,组件需要在各个业务模板进行引用,不能全局化使用,不太方便,本次将其改进成了全局使用,具体的业务模块不需要引入组件,直接调用main.js注册的全局方法即可。 涉及技术点: 遮

    2024年02月03日
    浏览(33)
  • 【Android控件】HorizontalScrollView的基础使用记录(滚动条自定义)

    目录 ​​​​​​​ 效果图 简介 注意事项 基础属性 滚动条全部设置 滚动条是否总显示 自定义滚动条滑动背景和滚动条背景 设置滚动条的宽度 设置滚动条距离 其它常规设置 设置滚动速度 布局代码示例 总结 HorizontalScrollView是水平滚动标签。垂直滚动动是 ScrollView标签 H

    2024年02月10日
    浏览(41)
  • Android开发控件形状之自定义圆角button(三种形态)

    第一步:在drawable文件下创建button的形状描述文件btn_shape.xml btn1.xml btn2.xml btn3.xml 第二步:在布局文件中layout.xml中对btn1.xml以上三种其中一种的引用语句,用来设置button形状: android:background=\\\"@drawable/btn1\\\" 效果图: 点击前 点击后     解析shape文件中的android:shape属性:  Android

    2024年02月13日
    浏览(42)
  • Android 之 Toast 的基本使用

    好的,终于学习完Adapter类相关的一些控件,当然除了讲解的那几个,还有其他很多的 相关的控件,就不慢慢讲解了~有需要的自行查阅文档,查看相关的用法,本节带来的是: Android用于提示信息的一个控件——Toast(吐司)!Toast是一种很方便的消息提示框,会在 屏幕中显示一个

    2024年02月08日
    浏览(29)
  • Android Toast工具类 解决Toast不消失 解决非UI线程不能Toast的问题

    觉得有用,请  点赞  +  关注 ,您的支持是我最大的动力! 觉得有用,请  点赞  +  关注 ,您的支持是我最大的动力! 觉得有用,请  点赞  +  关注 ,您的支持是我最大的动力!

    2024年02月16日
    浏览(37)
  • windows电脑安装 Android Studio 的时候提示“创建Android虚拟机或安装安卓模拟器失败”

      生命是黑暗的,除非有了激励;激励是盲目的,除非有了知识;知识是徒然的,除非有了工作;工作都是虚空的,除非是有了爱。   如果一定要说人生成功的标准是什么,我认为,那就是两个字,快乐。你能永远快乐,你的人生,就一定是最成功的人生。   变化多

    2024年02月15日
    浏览(53)
  • [Android Studio] 第4节 Toast使用详解

    文章目录         前言         一、Toast是什么?         二、使用步骤 Toast是Android中用于在屏幕上显示简短的提示消息的一种方式。 下面是使用Toast的详细步骤: 导入Toast类: 在Java文件中,首先需要导入 android.widget.Toast 类,可以在文件的开头 创建Toast对象:

    2024年02月07日
    浏览(26)
  • [Android] Logcat无法连接模拟器查看log,提示:No connected devices.

    将IDEA版本更换后,发现无法使用Logcat查看日志信息。Logcat区域无法识别到逍遥模拟器。 Logcat区域提示: No connected devices. 这里以 IntelliJ IDEA 2022.3.2+逍遥模拟器 处理方法为例: 第一步 : IDEA中打开Terminal,进入SDK的adb文件所在位置…SDKplatform-tools 【此处SDK前面的具体路径根据

    2024年02月06日
    浏览(40)
  • Toaster - Android 吐司框架,专治 Toast 各种疑难杂症

    https://github.com/getActivity/Toaster 想了解实现原理的可以点击此链接查看:Toaster 源码 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入 如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包