android java 用系统弹窗的方式实现模拟点击动画特效

接上一篇:android java系统弹窗的基础模板-CSDN博客

本篇记录的是系统弹窗的一个应用示例:实现点击动画效果

首先模拟点击的实现参考:android模拟点击_motionevent upevent = motionevent.obtain(systemclo-CSDN博客

动画效果,是指点击之后,在点击的中心坐标,播放一个固定时长的动画。

因为需要能够在其他应用上播放动画,所以可以使用系统悬浮窗,即系统弹窗来实现。

实现上很多可参考android java系统弹窗的基础模板-CSDN博客

1、资源文件xml比模板更简单

app\src\main\res\layout\click_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="match_parent">
	<ImageView
		android:id="@+id/clickImageView"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"/>
</LinearLayout>

因为只需要一个view,不需要其他ui控件,所以更简单

2、代码实现

2.1 初始化同模板

特意初始化了一下动画image的高度

rootView初始化,AddOrUpdateView我封装的用来添加rootView到windowManager的接口。rootView初始设置为隐藏。

    private View rootView;
    private ImageView imageView;
    private Context farContext;
    private int imageHeight;    

    public void Init(Context context) {
        farContext = context;
        rootView = LayoutInflater.from(context).inflate(R.layout.click_layout, null);
        imageView = rootView.findViewById(R.id.clickImageView);

        imageHeight = ScreenResolutionReceiver.getResolutionHeight() / 20;

        AddOrUpdateView(rootView, 0, 0, true);
        rootView.setVisibility(View.GONE);
    }

2.2 AddOrUpdateView封装,方便复用

WindowManager.LayoutParams params设置悬浮窗的高度宽度为资源文件的初始高度宽度,且为叠加在上方形式overlay,背景为透明色(因为会加载动画,所以不需要背景色)。

用入参x、y动态调整悬浮窗的位置。 - imageHeight / 2保证悬浮窗的中心点是鼠标点击的坐标点。

    private WindowManager windowManager;

    private void AddOrUpdateView(View view, int x, int y, boolean add) {
        windowManager = (WindowManager)farContext.getSystemService(WINDOW_SERVICE);

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT, // 初始高度
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSPARENT);

        params.gravity = Gravity.LEFT | Gravity.TOP;
        params.x = x - imageHeight / 2;
        params.y = y - imageHeight / 2;

        if (add) {
            windowManager.addView(view, params);
        } else {
            windowManager.updateViewLayout(view, params);
        }
    }

2.3 加载gif动画,实现点击特效

使用了Glide来加载gif,glide组件,本身是需要在build.gradle的dependencies里添加下面两行:

    implementation 'com.github.bumptech.glide:glide:4.12.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'

点击则触发播放1s的动画效果,要实现的逻辑如下:

弹窗设置为显示的同时,加载gif,执行一次动画效果就够了,然后设定为1s(经验值)后隐藏弹窗。

主要是超时这块比较难搞,尝试了几种写法都不好用。不断调整搜索的关键字,最终找到了handler msg.what的用法。

        这块值得一说的是,使用AIGC来做件事的效率,不如使用搜索引擎。因为android开发的特点,就是方法过多过杂,不少方法都是过时、不完整的、甚至错误的。这也是和android本身历史版本过多有关,且有些网上文章给出的就是针对某些特殊硬件的。所以,这种情况下,AI大模型本身的训练数据可能就有些脏,往往也给不出好的方案。而且大模型的回答过于正规,增加了阅读、试错的时间成本呢。对于已经能够熟练使用搜索引擎的人来说,使用后者的效率高得多。

如下,在glide的listener(new RequestListener<GifDrawable>()里,先设置循环次数为1,再模拟发送一个空的延时消息。然后在handler的处理队列里,设置弹窗为隐藏。

    private final int delaytime = 1000;
    private final int msgWhat = 1;  // 随便设置都可以

    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == msgWhat) {
                rootView.setVisibility(View.GONE);
            }
        }
    };

    public void LoadGif(int x, int y) {
        AddOrUpdateView(rootView, x, y, false);

        rootView.setVisibility(View.VISIBLE);

        int resourceId = R.drawable.click_loading;
        new Handler(Looper.getMainLooper()).post(() -> {
                    Glide.with(getContext())
                            .asGif()
                            .load(resourceId)
                            .override(imageHeight, imageHeight) // 保持宽高比,限制高度
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .listener(new RequestListener<GifDrawable>() {
                                @Override
                                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                                    return false;
                                }

                                @Override
                                public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                                    resource.setLoopCount(1); // 设置循环次数为1

                                    //发送延时消息,通知动画结束
                                    //以下两个参数都是 int 型,记得如上的声明
                                    handler.sendEmptyMessageDelayed(msgWhat, delaytime);
                                    return false;
                                }
                            })
                            .into(imageView);
                }
        );
    }

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

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

相关文章

deepseek 本地化部署和小模型微调

安装ollama 因为本人gpu卡的机器系统是centos 7, 直接使用ollama会报 所以ollama使用镜像方式进行部署&#xff0c; 拉取镜像ollama/ollama 启动命令 docker run -d --privileged -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 查看ollama 是否启动…

Java_类加载器

小程一言类加载器的基础双亲委派模型核心思想优势 各类加载器的职责 类加载器的工作流程举例&#xff1a;如何在Java中使用类加载器启动类加载器、扩展类加载器与系统类加载器输出解释自定义类加载器 类加载器与类冲突总结 小程一言 本专栏是对Java知识点的总结。在学习Java的过…

Baklib推动数字化内容管理解决方案助力企业数字化转型

内容概要 在当今信息爆炸的时代&#xff0c;数字化内容管理成为企业提升效率和竞争力的关键。企业在面对大量数据时&#xff0c;如何高效地存储、分类与检索信息&#xff0c;直接关系到其经营的成败。数字化内容管理不仅限于简单的文档存储&#xff0c;更是整合了文档、图像、…

【ComfyUI专栏】如何为ComfyUI工作流写上节点名称与顺序

有些朋友可能在网上看到视频的时候能够看到所有的节点都是按照顺序进行排列,我们可以看到当前节点顺序,也能够看到当前的节点的名称是什么? 这个其实并不是默认设置,也不是ComfyUI本身的设置,而是在Manager 节点,在Manager节点设置中有个标签设置。 这里标签设置有如下的…

Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法

Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…

【实践案例】基于大语言模型的海龟汤游戏

文章目录 项目背景提示词构建海龟汤主持人真相判断专家 具体实现流程文心一言大语言模型“海龟汤”插件参考 项目背景 “海龟汤”作为一种聚会类桌游&#xff0c;又称情境推理游戏&#xff0c;是一种猜测情境还原事件真相的智力游戏。其玩法是由出题者提出一个难以理解的事件&…

探秘Linux IO虚拟化:virtio的奇幻之旅

在当今数字化时代&#xff0c;虚拟化技术早已成为推动计算机领域发展的重要力量。想象一下&#xff0c;一台物理主机上能同时运行多个相互隔离的虚拟机&#xff0c;每个虚拟机都仿佛拥有自己独立的硬件资源&#xff0c;这一切是如何实现的呢&#xff1f;今天&#xff0c;就让我…

栈(5题)

目录 1.删除字符串中的所有相邻重复项 2.比较含退格的字符串 3.基本计算器2 4.字符串解码 5.验证栈序列 1.删除字符串中的所有相邻重复项 1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09; 我们只需要用一个string的字符串模拟一下这个栈就可以…

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为&#xff1a;Word.docx&#xff1a;考生文件夹样式的复制样式的修改 样式的应用&#xff08;没有相似/超级多的情况下&#xff09;——替换 [ ]通配符&#x…

麦芯 (MachCore) 应用开发教程 6:一台设备中多台电脑主从机的设置

麦芯是构建在windows系统上的设备应用操作系统&#xff0c;利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 在麦芯&#xff08;MachCore&#xff09;应用开发过程中&#xff0c;多机协同工作的场景十分常见&#xf…

GRE阅读双线阅读 --青山学堂GRE全程班 包括 阅读、数学、写作、填空、背单词

新版GRE考试整体结构 section题量时间写作1篇issue30min语文S112道题(7道填空5道阅读)18min数学S112道题21min语文S215道题(7道填空8道阅读)23min数学S215道题26min Tips: 写作结束后&#xff0c;语文和数学的顺序不固定&#xff0c;2中可能&#xff1a; issue -> V ->…

014-STM32单片机实现矩阵薄膜键盘设计

1.功能说明 本设计主要是利用STM32驱动矩阵薄膜键盘&#xff0c;当按下按键后OLED显示屏上会对应显示当前的按键键值&#xff0c;可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。 2.硬件接线 模块管脚STM32单片机管脚矩阵键盘行1PA0矩阵键盘…

浅谈《图解HTTP》

感悟 滑至尾页的那一刻&#xff0c;内心突兀的涌来一阵畅快的感觉。如果说从前对互联网只是懵懵懂懂&#xff0c;但此刻却觉得她是如此清晰而可爱的呈现在哪里。 介绍中说&#xff0c;《图解HTTP》适合作为第一本网络协议书。确实&#xff0c;它就像一座桥梁&#xff0c;连接…

Android学习制作app(ESP8266-01S连接-简单制作)

一、理论 部分理论见arduino学习-CSDN博客和Android Studio安装配置_android studio gradle 配置-CSDN博客 以下直接上代码和效果视频&#xff0c;esp01S的收发硬件代码目前没有分享&#xff0c;但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…

使用mybatisPlus插件生成代码步骤及注意事项

使用mybatisPlus插件可以很方便的生成与数据库对应的PO对象&#xff0c;以及对应的controller、service、ImplService、mapper代码&#xff0c;生成这种代码的方式有很多&#xff0c;包括mybatis-plus提供的代码生成器&#xff0c;以及idea提供的代码生成器&#xff0c;无论哪一…

FFmpeg(7.1版本)在Ubuntu18.04上的编译

一、从官网上下载FFmpeg源码 官网地址:Download FFmpeg 点击Download Source Code 下载源码到本地电脑上 二、解压包 tar -xvf ffmpeg-7.1.tar.xz 三、配置configure 1.准备工作 安装编译支持的软件 ① sudo apt-get install nasm //常用的汇编器,用于编译某些需要汇编…

CMake的QML项目中使用资源文件

Qt6.5的QML项目中&#xff0c;我发现QML引用资源文件并不像QtWidgets项目那样直接。 在QtWidgets的项目中&#xff0c;我们一般是创建.qrc​资源文件&#xff0c;然后创建前缀/new/prefix​&#xff0c;再往该前缀中添加一个图片文件&#xff0c;比如&#xff1a;test.png​。…

微信登录模块封装

文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…

KNIME:开源 AI 数据科学

KNIME&#xff08;Konstanz Information Miner&#xff09;是一款开源且功能强大的数据科学平台&#xff0c;由德国康斯坦茨大学的软件工程师团队开发&#xff0c;自2004年推出以来&#xff0c;广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…

如何让DeepSeek恢复联网功能?解决(由于技术原因,联网搜索暂不可用)

DeekSeek提示&#xff1a;&#xff08;由于技术原因&#xff0c;联网搜索暂不可用&#xff09; 众所周知&#xff0c;因为海外黑客的ddos攻击、僵尸网络攻击&#xff0c;deepseek的联网功能一直处于宕机阶段&#xff0c;但是很多问题不联网出来的结果都还是2023年的&#xff0c…