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

news/2025/2/6 13:22:14/

接上一篇: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"><ImageViewandroid: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() {@Overridepublic 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>() {@Overridepublic boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {return false;}@Overridepublic 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);});}


http://www.ppmy.cn/news/1569808.html

相关文章

基础相对薄弱怎么考研

复习总体规划 明确目标 选择专业和院校&#xff1a;根据你的兴趣、职业规划和自身实力&#xff0c;选择适合自己的专业和院校。可以参考往年的分数线、报录比、复试难度等。了解考试科目&#xff1a;不同专业考试科目不同&#xff0c;一般包括&#xff1a; 公共课&#xff1a…

机器学习基本概念(附代码)

一、算法与模型的关系 在机器学习领域&#xff0c;算法和模型是两个核心概念。算法是一种偏抽象的概念&#xff0c;它定义了计算机解决问题的步骤和流程。而模型则是更加具体的概念&#xff0c;通过代码实现特定算法来完成任务。数学上&#xff0c;一个简单的模型可以表示为 y…

一、TensorFlow的建模流程

1. 数据准备与预处理&#xff1a; 加载数据&#xff1a;使用内置数据集或自定义数据。 预处理&#xff1a;归一化、调整维度、数据增强。 划分数据集&#xff1a;训练集、验证集、测试集。 转换为Dataset对象&#xff1a;利用tf.data优化数据流水线。 import tensorflow a…

时序论文37 | DUET:双向聚类增强的多变量时间序列预测

论文标题&#xff1a;DUET: Dual Clustering Enhanced Multivariate Time Series Forecasting 论文链接&#xff1a;https://arxiv.org/pdf/2412.10859 代码链接&#xff1a;https://github.com/decisionintelligence/DUET &#xff08;后台回复“交流”加入讨论群&#xff…

edu小程序挖掘严重支付逻辑漏洞

edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号&#xff0c;直接搜索引擎搜索即可得到&#xff0c;这就不用多说了&#xff0c;但是这里的手机号可以任意输入&#xff0c;只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…

中位数定理:小试牛刀> _ <2025牛客寒假1

给定数轴上的n个点&#xff0c;找出一个到它们的距离之和尽量小的点&#xff08;即使我们可以选择不是这些点里的点&#xff0c;我们还是选择中位数的那个点最优&#xff09; 结论:这些点的中位数就是目标点。可以自己枚举推导&#xff08;很好想&#xff09; (对于 点的数量为…

华为手机nova9,鸿蒙系统版本4.2.0.159,智慧助手.今天版本是14.x,如何卸载智慧助手.今天?

手欠&#xff0c;将手机鸿蒙系统升级到4.2.0.159后&#xff0c;出现了负一屏&#xff0c;负一屏就是主页向左滑&#xff0c;出现了&#xff0c;如图的界面&#xff1a; 华为鸿蒙系统负一屏的界面 通过在手机中我的华为-搜索“开启或关闭智慧助手.今天&#xff08;负一屏&#…

openai agent第二弹:deepresearch原理介绍

文章目录 技术原理类似开源项目OpenDeepResearcheropen-deep-researchollama-deep-researchersmolagents的open_deep_research 参考资料 2月2日openai上线了第二个agent: deep research&#xff0c;具体功能类似24年11月google gemini发布的deep research。 技术原理 deep res…