Android - 云游戏本地悬浮输入框实现

一、简述

云游戏输入法分两种情况,以云化原神为例,分为 云端输入法本地输入法,运行效果如下:

云端输入法本地输入法

云端输入法 就是运行在云端设备上的输入法,对于不同客户端来说(Android、iPhone),运行效果一致。
本地输入法 则是运行在用户侧设备上的输入法,对于不同客户端来说(Android、iPhone),运行效果不一致。

从开发角度来说,云端输入法 是最省心的,无须关心输入法事件,只管同步触屏事件即可。但是,从功能性角度来说,本地输入法 可以有更好的体验,能为非触屏设备提供云游戏文字交互能力,例如 TV 端(遥控器操控)。

本地输入法 需要前后端配合开发,后端需提供输入法唤起事件回调,读取和注入文字的能力,这个以后有机会再做详细介绍。本篇主要讲述 前端(Android 客户端)实现,其实仔细分析一下就能看出,这个 本地输入法 功能,无非是在输入法之上显示了一个 悬浮输入框,并且与输入法同步显隐,所以,本篇的核心内容,就是如何来实现这么一个 悬浮输入框

二、方案

在说明具体方案之前,需要先了解下 Android 窗口对于输入法的主要 adjust 策略:

分类说明
adjustResize始终调整 activity 主窗口的尺寸,以为屏幕上的软键盘腾出空间。
adjustPan不通过调整 activity 主窗口的尺寸为软键盘腾出空间。相反,窗口的内容会自动平移,使键盘永远无法遮盖当前焦点,以便用户始终能看到自己输入的内容。这通常不如调整窗口尺寸可取,因为用户可能需关闭软键盘才能进入被遮盖的窗口部分,并与之进行交互。

  • 图片出处:https://code.luasoftware.com/tutorials/android/move-layout-when-keyboard-shown
  • adjust 官方说明:https://developer.android.com/guide/topics/manifest/activity-element?hl=zh-cn

悬浮输入框 并不是一个新课题,网上有其他 Android 开发者分享过自己实现 悬浮输入框 的方案,他们的做法,大致能分为以下几种:

方案原理
基于 View 实现通过监听输入法高度,调整页面底部 View 的 y 值偏移量
基于 Activity 实现
基于 Dialog 实现
利用 adjustResize 特性,将处于窗口底部的输入框,自动被输入法顶上去
  • https://blog.csdn.net/chzphoenix/article/details/122863199
  • https://segmentfault.com/a/1190000011541743
  • https://cloud.tencent.com/developer/article/1153415

那么这几种方案会有什么问题呢?

方案问题
基于 View 实现Android SDK 没有提供监听与获取输入法高度的 API,早期主流做法是使用 ViewTreeObserverOnGlobalLayoutListener,监听布局高度变化,进而计算出输入法高度,但是设备兼容性可能存在问题,在不同设备上拿到的输入法高度不一定准确,适配成本较高。
基于 Activity 实现需要编写一个新的透明 Activity,在清单文件中注册 Activity 和指定 windowSoftInputModeadjustResize,这个方案利用了 adjustResize 特性,非常讨巧,无须计算输入法高度,适配成本较低,但是,实现上比较复杂笨重,特别是输入框监听事件需要在两个 Activity 之间传递时,无法很优雅的实现。

基于 Dialog 实现 方案,可以很好的规避掉上述方案存在的问题。因为 DialogActivity 一样,拥有自己的 Window,而 windowSoftInputMode 实际上是作用于 Window 的,即 Dialog 可以设置自己的 windowSoftInputMode

window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

另外,Dialog 可以很轻易地把输入框事件回调给外部(Activity、Fragment 等)。

注:Dialog 无须在清单文件中注册,在动态更新上也有一定的优势。

三、实现

经过上面的分析,我最终采用的是 基于 Dialog 实现 方案,来实现 悬浮输入框。要注意的地方大致有这几点:

  • Dialog 样式与布局
  • 监听输入法显隐
  • 兼容横竖屏切换

1、Dialog 样式与布局

系统默认的 Dialog 是有样式的,需要对其进行定制,修改为透明的 Dialog,另外还要修改窗口的 windowSoftInputMode,具体代码如下:

/*** 基于 Dialog 实现的悬浮输入框** @author LQR* @since 2024/7/6*/
public class FloatInputDialog extends AbsFloatInputDialog {protected View rootView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);rootView = initView();initWindow();}protected View initView() {// 自定义布局View rootView = View.inflate(

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

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

相关文章

Fastapi在docekr中进行部署之后,uvicorn占用的CPU非常高

前一段接点小活,做点开发,顺便学了学FASTAPI框架,对比flask据说能好那么一些,至少并发什么的不用研究其他的asgi什么的,毕竟不是专业开发,能少研究一个东西就省了很多的事。 但是部署的过程中突然之间在do…

Centos二进制方式搭建Mysql8,并升级mysql8.0.33到mysql8.3.0

准备安装包 # 切换目录 cd /usr/local/src/ # 下载libaio包 wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libaio-0.3.109-13.el7.x86_64.rpm # 下载MySQL8.0.33安装包 wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.33-linux-glibc2.17-x86_64-min…

ANR日志输出

appNotResponding //com.android.server.am.AppErrors.java/* app: 当前发生ANR的进程* activity: 发生ANR的界面* parent: 发生ANR的界面的上一级界面* aboveSystem: * annotation: 发生ANR的原因*/ final void appNotResponding(ProcessRecord app, ActivityRecord activity…

Zabbix分布式监控

目录 分布式监控架构 实现分布式监控的步骤 优点和应用场景 安装Zabbix_Proxy Server端Web页面配置 测试 Zabbix 的分布式监控架构允许在大规模和地理上分散的环境中进行高效的监控。通过分布式监控,Zabbix 可以扩展其监控能力,支持大量主机和设备…

企业网站用免费wordpress主题的风险和弊端

免费WordPress主题除了不用花钱之外,几乎没有什么好处。个人网站如果用用还可以,如果是企业用的商业网站,最好不要用免费的WordPress主题模板,一但发生问题,你将付出的代价,比两三百元买个付费的WordPress主…

基于全志Orangepi Zero 2 的语音刷抖音项目

目录 一、硬件连接 二、项目实现功能 三、SU-03T语音模块的配置和烧录 3.1 创建产品: 3.2 设置PIN引脚为串口模式: 3.3 设置唤醒词: 3.4 设置指令语句: 3.5 设置控制详情: 3.6 发音人配置: 3.7 其…

atcoder 357 F Two Sequence Queries (线段树板子)

题目: 分析: 线段树 代码: // Problem: F - Two Sequence Queries // Contest: AtCoder - SuntoryProgrammingContest2024(AtCoder Beginner Contest 357) // URL: https://atcoder.jp/contests/abc357/tasks/abc357_…

华为HCIP Datacom H12-821 卷29

1.多选题 下面关于LSA age字段,描述正确的是∶ A、LSA age的单位为秒,在LSDB中的LSA的LS age随时间增长而增长 B、LSA age的单位为秒,在LSDB中的LSA的LS age随时间增长而减少 C、如果一条LSA的LS age达到了LS RefreshTime&#xff08…

[spring] Spring MVC - security(下)

[spring] Spring MVC - security(下) callback 一下,当前项目结构如下: 这里实现的功能是连接数据库,大范围和 [spring] rest api security 重合 数据库连接 - 明文密码 第一部分使用明文密码 设置数据库 主要就是…

内存与硬盘(笔记)

文章目录 1. 内存① 笔记② 相关软件 2. 硬盘① 笔记② 相关软件 3. 区别:4. 推荐 1. 内存 ① 笔记 ① 笔记本的内存条和台式机的内存条是不互通的 ② 我们常说的内存其实指的是运行内存(前台后台同时能运行多少APP) ③ 下图来自京东: 解析&#xff1…

应用程序提权

MYSQL提权 Mysql提权利用场景 1.拥有数据库账号密码 2.Webshell可以连接数据库,能够写文件 3.可操作数据库 如何获取数据库账号密码? 1.找数据库配置文件 2.通过webshell对数据库进行本地爆破 3.Hash获取mysql密码 UDF提权 udf提权指的是利用注…

ubuntu 分区情况

ubuntu系统安装与分区指南 - Philbert - 博客园 (cnblogs.com)https://www.cnblogs.com/liangxuran/p/14872811.html 详解安装Ubuntu Linux系统时硬盘分区最合理的方法-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1711884

pycharm中快捷键汇总

Pycarm指令汇总 Ctrl鼠标 单击,能直接查看其用法 Ctrl/ 快速注释 CtrlC 在pycharm的terminal中可以停止运行, 其他的地方可以复制。 CtrlV 粘贴 CtrlA 全选 CtrlP 查看()中需要填写什么参数 Altenter 自动不补全所需要的库

终于找到了免费的C盘清理软件(极智C盘清理)

搜了很久,终于让我找到了一款 完全免费的C盘清理软件(极智C盘清理)。 点击前往官网免费使用极智C盘清理软件: C盘清理 用户好评 完全免费的极智C盘清理 用极智C盘清理清理了下系统的临时文件、缓存等无用数据文件,C盘终…

尚硅谷大事件后台API项目(学习自用)

大事件后台API项目 1.初始化 1.1创建项目 首先创建一个文件夹名为api_server,然后用vscode打开这个文件夹,新建终端,在终端输入npm init -y会生成一个package.json文件,接着新建一个文件app.js作为入口文件,在终端安…

哈尔滨等保测评标准的国际比较与启示

随着信息技术的快速发展和全球化趋势的加深,信息安全成为各国政府和企业共同关注的焦点。哈尔滨作为东北地区重要的经济和科技中心,其信息安全等级保护(简称“等保”)测评标准在确保本地企业信息安全的同时,也面临着与…

Could not find a package configuration file provided by “Torch“ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境: Ubuntu20.04 一、问题描述 自己编译调用 Torch 的程序时,遇到如下报错: Make Error at CMakeLists.txt:15 (find_package):By not providing "FindTor…

设计资料:520-基于ZU15EG 适配AWR2243的雷达验证底板 高速信号处理板 AWR2243毫米波板

基于ZU15EG 适配AWR2243的雷达验证底板 一、板卡概述 本板卡系北京太速科技自主研发,基于MPSOC系列SOC XCZU15EG-FFVB1156架构,搭载两组64-bit DDR4,每组容量32Gb,最高可稳定运行在2400MT/s。另有1路10G SFP光纤接口、1路40G…

使用F1C200S从零制作掌机之构建debian文件系统

前情:使用buildrootfs构建的文件系统调试了很久NES模拟器,执行InfoNES模拟器的时候一直黑屏,无内容显示,调不通了,所以改用debian系统试试。 一、环境配置 首先下载两个工具:qemu-arm-static和debootstra…

uniapp小程序上传文件

需求 小程序需要上传用户相册图片或拍摄的照片到后端服务器 uniapp官方处理小程序文件方法 选择文件方法:uni.chooseMedia uni-app官网uni-app,uniCloud,serverless,uni.chooseVideo(OBJECT),chooseVideo HarmonyOS 兼容性,uni.chooseMedia(OBJECT),uni.saveVid…