【Android】跟着chatGPT学习悬浮窗的实现

article/2024/12/22 9:16:56

请实现Android里的悬浮窗,这个悬浮窗里有2个TextView

实现 Android 悬浮窗需要涉及到以下几个步骤:

  1. 创建一个悬浮窗口的布局,包含两个 TextView。

  1. 创建一个 Service,并在 Service 的 onCreate() 方法中创建悬浮窗口。

  1. 在悬浮窗口的布局中添加两个 TextView。

  1. 在 Service 中实现悬浮窗口的拖动和关闭功能。

  1. 在 AndroidManifest.xml 文件中声明 Service。

下面是一个简单的示例代码:

csharpCopy

public class FloatingWindowService extends Service {private WindowManager windowManager;private View floatingView;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();// 创建悬浮窗口的布局floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null);// 获取 WindowManagerwindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);// 设置悬浮窗口的参数WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,Build.VERSION.SDK_INT >= Build.VERSION_CODES.O? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY: WindowManager.LayoutParams.TYPE_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);// 设置悬浮窗口的位置和大小params.gravity = Gravity.TOP | Gravity.START;params.x = 0;params.y = 100;// 添加悬浮窗口的布局windowManager.addView(floatingView, params);// 添加拖动和关闭功能floatingView.setOnTouchListener(new FloatingOnTouchListener(params));floatingView.findViewById(R.id.close_button).setOnClickListener(new FloatingOnClickListener());}@Overridepublic void onDestroy() {super.onDestroy();// 移除悬浮窗口的布局if (floatingView != null) {windowManager.removeView(floatingView);}}// 实现拖动功能private class FloatingOnTouchListener implements View.OnTouchListener {private int initialX;private int initialY;private float initialTouchX;private float initialTouchY;private WindowManager.LayoutParams params;FloatingOnTouchListener(WindowManager.LayoutParams params) {this.params = params;}@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 记录触摸点的位置和悬浮窗口的位置initialX = params.x;initialY = params.y;initialTouchX = event.getRawX();initialTouchY = event.getRawY();return true;case MotionEvent.ACTION_UP:// 拖动结束,更新悬浮窗口的位置int newX = initialX + (int) (event.getRawX() - initialTouchX);int newY = initialY + (int) (event.getRawY() - initialTouchY);params.x = newX;params.y = newY;windowManager.updateViewLayout(floatingView, params);return true;case MotionEvent.ACTION_MOVE:// 拖动中,更新悬浮窗口的位置int newX1 = initialX + (int) (event.getRawX() - initialTouchX);int newY1 = initialY + (int) (event.getRawY() - initialTouchY);params.x = newX1;params.y = newY1;windowManager.updateViewLayout(floatingView, params);return true;}return false;}}// 实现关闭功能private class FloatingOnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {stopSelf();}}
}

在这个代码中,我们创建了一个 FloatingWindowService 类,并在 onCreate() 方法中创建了一个悬浮窗口的布局。我们还在 Service 中实现了悬浮窗口的拖动和关闭功能。

悬浮窗口的布局文件(floating_window.xml)可以包含两个 TextView,如下所示:

iniCopy

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/floating_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@android:color/white"><TextViewandroid:id="@+id/text_view1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView 1" /><TextViewandroid:id="@+id/text_view2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView 2"android:layout_below="@id/text_view1" /><Buttonandroid:id="@+id/close_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Close"android:layout_alignParentEnd="true" /></RelativeLayout>

最后,在 AndroidManifest.xml 文件中声明 Service:

Copy

<service android:name=".FloatingWindowService" />

这样,我们就完成了 Android 悬浮窗的实现。

很好,例子里的java代码请修改为kotlin

好的,下面是 Kotlin 版本的代码实现:

kotlinCopy

class FloatingWindowService : Service() {private lateinit var windowManager: WindowManagerprivate lateinit var floatingView: Viewoverride fun onBind(intent: Intent?): IBinder? {return null}override fun onCreate() {super.onCreate()// 创建悬浮窗口的布局floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null)// 获取 WindowManagerwindowManager = getSystemService(WINDOW_SERVICE) as WindowManager// 设置悬浮窗口的参数val params = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAYelseWindowManager.LayoutParams.TYPE_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT)// 设置悬浮窗口的位置和大小params.gravity = Gravity.TOP or Gravity.STARTparams.x = 0params.y = 100// 添加悬浮窗口的布局windowManager.addView(floatingView, params)// 添加拖动和关闭功能floatingView.setOnTouchListener(FloatingOnTouchListener(params))floatingView.findViewById<View>(R.id.close_button).setOnClickListener(FloatingOnClickListener())}override fun onDestroy() {super.onDestroy()// 移除悬浮窗口的布局if (::floatingView.isInitialized) {windowManager.removeView(floatingView)}}// 实现拖动功能private inner class FloatingOnTouchListener(private val params: WindowManager.LayoutParams) :View.OnTouchListener {private var initialX: Int = 0private var initialY: Int = 0private var initialTouchX: Float = 0fprivate var initialTouchY: Float = 0foverride fun onTouch(v: View?, event: MotionEvent?): Boolean {when (event?.action) {MotionEvent.ACTION_DOWN -> {// 记录触摸点的位置和悬浮窗口的位置initialX = params.xinitialY = params.yinitialTouchX = event.rawXinitialTouchY = event.rawYreturn true}MotionEvent.ACTION_UP -> {// 拖动结束,更新悬浮窗口的位置val newX = initialX + (event.rawX - initialTouchX).toInt()val newY = initialY + (event.rawY - initialTouchY).toInt()params.x = newXparams.y = newYwindowManager.updateViewLayout(floatingView, params)return true}MotionEvent.ACTION_MOVE -> {// 拖动中,更新悬浮窗口的位置val newX = initialX + (event.rawX - initialTouchX).toInt()val newY = initialY + (event.rawY - initialTouchY).toInt()params.x = newXparams.y = newYwindowManager.updateViewLayout(floatingView, params)return true}}return false}}// 实现关闭功能private inner class FloatingOnClickListener : View.OnClickListener {override fun onClick(v: View?) {stopSelf()}}
}

在这个 Kotlin 版本的代码中,我们使用了 inner class 来实现了 FloatingOnTouchListener 和 FloatingOnClickListener 两个内部类,以及使用了 lateinit 修饰符来延迟初始化悬浮窗口布局。其它部分与 Java 版本的代码类似。

怎么设置悬浮窗的大小

要设置悬浮窗口的大小,可以在 WindowManager.LayoutParams 中设置其宽度和高度。具体来说,可以通过设置以下两个参数来控制悬浮窗口的大小:

  • width:悬浮窗口的宽度。

  • height:悬浮窗口的高度。

例如,我们可以将悬浮窗口的宽度设置为屏幕宽度的一半,高度设置为 200dp,代码如下:

stylusCopy

// 获取屏幕宽度
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
val screenWidth = displayMetrics.widthPixels
// 设置悬浮窗口的参数
val params = WindowManager.LayoutParams(screenWidth / 2, // 悬浮窗口的宽度为屏幕宽度的一半resources.getDimensionPixelSize(R.dimen.floating_window_height), // 悬浮窗口的高度为 200dpif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAYelseWindowManager.LayoutParams.TYPE_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT
)

在这个示例代码中,我们首先获取了屏幕宽度,然后将悬浮窗口的宽度设置为屏幕宽度的一半,高度设置为 200dp,使用了 resources.getDimensionPixelSize() 方法来获得 200dp 对应的像素值。

需要注意的是,悬浮窗口的大小不应该超过屏幕的可见范围,否则可能会导致悬浮窗口无法完全显示。另外,如果悬浮窗口的大小发生变化,需要调用 WindowManager.updateViewLayout() 方法来更新悬浮窗口的布局。

Copy

// 更新悬浮窗口的布局
windowManager.updateViewLayout(floatingView, params)

在这个示例代码中,我们将更新悬浮窗口的布局放在了拖动事件的处理中,如果需要在其它地方更新悬浮窗口的布局,也可以使用同样的方式调用 WindowManager.updateViewLayout() 方法。

params.gravity 是什么

params.gravity 是指悬浮窗口的重心,即悬浮窗口在屏幕上的对齐方式。Gravity 是 Android 中一个常用的布局参数,用于控制视图在屏幕上的位置、大小和对齐方式等。

在 WindowManager.LayoutParams 中,gravity 是一个 int 类型的参数,可以使用 | 运算符进行组合。常见的 gravity 参数值有以下几种:

  • Gravity.TOP:将视图的顶部与其父容器的顶部对齐。

  • Gravity.BOTTOM:将视图的底部与其父容器的底部对齐。

  • Gravity.LEFT:将视图的左侧与其父容器的左侧对齐。

  • Gravity.RIGHT:将视图的右侧与其父容器的右侧对齐。

  • Gravity.CENTER_HORIZONTAL:将视图水平居中对齐。

  • Gravity.CENTER_VERTICAL:将视图垂直居中对齐。

  • Gravity.CENTER:将视图水平和垂直居中对齐。

可以通过将这些参数值组合起来,来控制视图在屏幕上的对齐方式。例如,params.gravity = Gravity.TOP or Gravity.START 将悬浮窗口的重心设置为左上角。

在悬浮窗口的实现中,params.gravity 可以用于设置悬浮窗口相对于屏幕左上角的位置。例如,params.gravity = Gravity.TOP or Gravity.START 将悬浮窗口设置在屏幕左上角,而 params.gravity = Gravity.BOTTOM or Gravity.END 将悬浮窗口设置在屏幕右下角。

需要注意的是,params.gravity 的默认值是 Gravity.TOP | Gravity.START,即悬浮窗口默认位于屏幕左上角。如果需要调整悬浮窗口的位置,可以通过修改 params.gravity 的值来实现。

上面的代码中,WindowManager.LayoutParams.WRAP_CONTENT 是多少

WindowManager.LayoutParams.WRAP_CONTENT 表示悬浮窗口的宽度或高度使用内容的大小,即根据悬浮窗口内部的视图内容来动态调整悬浮窗口的大小。

在悬浮窗口实现中,通常使用 WindowManager.LayoutParams.WRAP_CONTENT 来指定悬浮窗口的宽度或高度,以便悬浮窗口的大小能够自适应其内部的视图内容。例如,可以使用以下代码来创建一个宽度为 WRAP_CONTENT,高度为 200dp 的悬浮窗口:

stylusCopy

val params = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,resources.getDimensionPixelSize(R.dimen.floating_window_height),if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAYelseWindowManager.LayoutParams.TYPE_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT
)

在这个代码示例中,我们将悬浮窗口的宽度设置为 WindowManager.LayoutParams.WRAP_CONTENT,以便悬浮窗口的宽度能够自适应其内部的视图内容。同时,我们将悬浮窗口的高度设置为 200dp,以确保悬浮窗口在高度上有一定的大小。

需要注意的是,使用 WindowManager.LayoutParams.WRAP_CONTENT 作为悬浮窗口的宽度或高度时,需要确保悬浮窗口内部的视图内容已经正确地布局和测量完成,否则悬浮窗口可能会显示异常。另外,如果悬浮窗口的内容发生变化,需要调用 WindowManager.updateViewLayout() 方法来更新悬浮窗口的布局。


http://chatgpt.dhexx.cn/article/pdhGUKI6.shtml

相关文章

[chatGPT] 如何通过JNI在Android上显示实时视频流

目录 背景正文layout xmljavaCjava 总结一&#xff1a; 追问&#xff1a;CC 总结二&#xff1a;答疑解惑C 画蛇添足 视频不显示黑屏 最后感叹科技的更新速度&#xff0c;真的程序员都可能会被替代&#xff0c;下一个时代最大的问题应该是劳动力过剩&#xff0c;导致社会性结构改…

使用Chat gpt提高Android开发效率

简介 在过去几周里&#xff0c;我进行了一项令人大开眼界的实验&#xff0c;将 Chat-GPT&#xff08;我使用的是 Bing Chat&#xff0c;它在后台使用了 GPT-4&#xff0c;并且可以免费使用&#xff09;融入到我的日常 Android 开发工作流程中&#xff0c;以探索它是否能够提高…

chatgpt赋能python:Python如何打包安卓程序?

Python如何打包安卓程序&#xff1f; Python 是一种高级编程语言&#xff0c;具有简单易学、代码简洁、易于阅读等特点&#xff0c;因此在开发中广受欢迎。而随着移动设备的普及&#xff0c;Python 开发者们也开始着手开发安卓应用程序。那么&#xff0c;在 Python 中如何打包…

通过ChatGPT跟MetaHuman对话,Android/iOS兼容

一、申请ChatGPT的API-KEY 1.通过 openAI官网申请API-KEY 2.参考使用腾讯云函数一分钟搭建 OpenAI 免翻墙代理搭建openAI免翻墙代理 3.通过Postman测试一下openAI函数是否可被调用,传入BearerToken和Body参数,ChatGPT即可返回应答数据 二、启用必要的插件 1.启用文字转语…

试看ChatGPT如何带你通关蔚来Android车载面试

近期ChatGPT&#xff0c;火了。火到什么程度&#xff1f;根据瑞士银行巨头瑞银集团的一份报告显示&#xff0c;在ChatGPT推出仅2个月后&#xff0c;它在2023年1月末的月活用户已经突破了1亿。 那么ChatGPT是什么&#xff1f; 借用百度介绍下&#xff0c;ChatGPT&#xff0c;美…

【Android-ChatGPT】安装Android Studio遇到Unable to access Android SDK add-on list的错误【亲测解决】

【问题】 安装Android Studio遇到Unable to access Android SDK add-on list的错误。 【解决方案】 这个一般是没有设置代理造成的&#xff0c;点击setup proxy进行代理设置。 点击Android Studio - Preferences&#xff0c;在 Appearance & Behavior的System Settings下…

鸿蒙到底是不是安卓? ChatGPT的回答令人惊讶!

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux

2023年目前要说最热的点&#xff0c;肯定是ChatGPT了。 ChatGPT官方提供的网页版本&#xff0c;还有需要科学上网&#xff0c;很多人都会基于此进行封装。 现在是移动互联网时代&#xff0c;基于手机APP的需求还是很大的。 所以&#xff0c;今天给大家推荐一个ChatGPT客户端…

用ChatGPT提高开发效率(Andoid)

一、前言 我们问了10个问题&#xff0c;开发的、生活中有疑问的&#xff0c;ChartGPT都给了我们答案。这些答案怎么样&#xff0c;请往下看吧。 ChatGPT-1、写一个车牌号的正则表达式ChatGPT-2、写一个中国大陆车牌号的正则表达式ChatGPT-3、用kotlin写一个车牌号的校验函数C…

奇思妙想,用ChatGPT写代码怎么样呢?来看看写一个简单的Android apk

前言 这段时间重大新闻就属ChatGPT了&#xff0c;这到底是个什么呢&#xff1f;官方解释 ChatGPT是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&#xff0c;使用了Transformer神经网络架构&#xff0c;也是GPT-3.5架构&#xff0c;这是一种…

十分钟教你搭建类似ChatGPT的安卓应用程序

大家好&#xff0c;我是易安&#xff01; Chat GPT 是当今著名的人工智能工具&#xff0c;就像聊天机器人一样。Chat GPT会回答发送给它的所有查询。今天&#xff0c;我将通过集成 OpenAI API (ChatGPT)构建一个简单的类似 ChatGPT 的 android 应用程序&#xff0c;我们可以在其…

使用 ChatGPT 改善 Android 开发效率的 7 个案例~

翻译 修改自 https://proandroiddev.com/chatgpt-for-android-developers-1c3c1ecc6440&#xff0c;原作者&#xff1a;Rafa Araujo ChatGPT 是由 OpenAI 公司创造的自然语言处理工具&#xff0c;对那些想要提高技能的软件开发人员来说&#xff0c;它绝对是不容错过的重要利器…

一款好用的ChatGPT工具,安卓app

要找到一款真正好用的chatgpt工具是不容易的&#xff0c;要么注册付费很麻烦&#xff0c;要么很快就不能用了&#xff0c;要么还不是真正的chatgpt。 这款解决以上所有问题。 你似乎来到了没有知识存在的荒原 - 知乎知乎&#xff0c;中文互联网高质量的问答社区和创作者聚集的…

ChatGPT能帮Android开发者干些啥?

ChatGPT能帮Android开发者干些啥&#xff1f; ChatGPT 是 OpenAI 创建的一种自然语言工具&#xff0c;本文将展示一些使用 ChatGPT 帮助软件开发的实际示例。凭借其易用性和自定义功能&#xff0c;ChatGPT 可以为提高软件工程师的绩效做出贡献。 访问 ChatGPT 转到https://ch…

使用 ChatGPT 改善 Android 开发效率的 7 个案例

ChatGPT 是由 OpenAI 公司创造的自然语言处理工具&#xff0c;对那些想要提高技能的软件开发人员来说&#xff0c;它绝对是不容错过的重要利器。 本文将展示使用 ChatGPT 来促进 Android 软件开发的 7 个案例&#xff0c;你会发现凭借其易用性和定制功能&#xff0c;ChatGPT 能…

ChatGpt与AndroidStudio合体变身教程,从此ChatGPT成为你的私人助理

chatGpt火了这么长时间了&#xff0c;大家肯定都有所了解&#xff0c;今天我就给大家分享一下&#xff0c;如何让chatgpt与AndroidStudio成功合体&#xff0c;变身成为我们的私人助理&#xff01;&#xff08;记得给鄙人点点关注哦&#xff09; 合体进行中 合体步骤下载插件重…

Android Studio类ChatGpt的免费AI编程助手

ChatGpt大火&#xff0c;带动了AI工具的发展&#xff0c;介绍两款免费的AI编程助手&#xff0c;一款用于输入关键字自动输出代码&#xff0c;一款则是自动补全提示&#xff0e; 可支持大部分代码编辑器&#xff0c;这里主要介绍Android Studio上安装使用&#xff0e; Bito 支…

制作自己的ChatGPT

Feb 11, 20235 min read 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 众所周知&#xff0c;ChatGPT 目前能够取得令人印象深刻的壮举。 很可能许多人都有在他们自己的项目中使用该技术的想法。 不过需要注意的是&#xff0c;ChatGPT 目前并没有官方的 API。 使用非…

ChatGPT的各种骚操作

ChatGPT&#xff0c;美国“开放人工智能研究中心”研发的聊天机器人程序 [12] &#xff0c;于2022年11月30日发布 [2-3]。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xf…

借助ChatGPT实现 PPT | 导图 | 短视频文案生成【AIGC】

文章目录 1、chatgpt 自动制作 PPT2、chatgpt 生成 Excel 公式3、chatgpt 生成思维导图4、chatgpt 快速生成短视频5、总结 1、chatgpt 自动制作 PPT 步骤如下&#xff1a; ①要求 chatgpt 生成 PPT 内容&#xff0c;以 markdown 格式输出&#xff1b; ②借助网站 mindshow.fun…