# float_window **Repository Path**: liangbigtree/float_window ## Basic Information - **Project Name**: float_window - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-08 - **Last Updated**: 2025-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android ImGui 悬浮窗实现 本项目实现了一个带有触摸穿透功能的 Android ImGui 悬浮窗。主要特点包括: - 全屏显示但允许触摸穿透 - 可拖动窗口位置 - 保持 ImGui 界面的完整交互功能 ## 关键实现 ### 1. Java 层实现 (FloatingWindowService.java) ```java // 窗口参数设置 params.width = 1000; // ImGui 窗口宽度 params.height = 775; // ImGui 窗口高度 params.x = 15; // ImGui 窗口 X 坐标 params.y = 270; // ImGui 窗口 Y 坐标 // 关键窗口标志 params.flags = LayoutParams.FLAG_NOT_FOCUSABLE | // 不获取焦点 LayoutParams.FLAG_NOT_TOUCH_MODAL | // 不拦截触摸事件 LayoutParams.FLAG_LAYOUT_IN_SCREEN; // 占满整个屏幕 ``` 主要修改: - 将窗口大小设置为实际的 ImGui 窗口大小 - 移除多余的触摸区域(vTouch) - 设置正确的窗口标志实现触摸穿透 - 实现窗口拖动功能 ### 2. ImGui 渲染层 (imgui_renderer.cpp) ```cpp void showMyDrawDemo() { // 设置实际的 ImGui 窗口 ImGui::SetNextWindowPos(ImVec2(0, 0)); ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize); ImGui::Begin("Hello world!", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar); // ... 窗口内容 ... ImGui::End(); } ``` 主要修改: - 移除透明背景窗口 - 将 ImGui 窗口设置为固定位置和大小 - 设置合适的窗口标志 ### 3. 原生层实现 (native-lib.cpp) ```cpp extern "C" JNIEXPORT jboolean JNICALL Java_com_example_float_1window_ImGuiView_nativeOnTouchEvent( JNIEnv* env, jclass clazz, jint action, jfloat x, jfloat y) { if (!renderer) { return false; } // 将触摸事件传递给 ImGui ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2(x, y); // 根据动作类型设置鼠标按下状态 bool isDown = (action != 1); // ACTION_UP = 1 io.MouseDown[0] = isDown; // 让 ImGui 处理事件 return io.WantCaptureMouse; } ``` 主要修改: - 简化触摸事件处理逻辑 - 使用 ImGui 的内置机制判断事件处理 - 正确设置鼠标位置和状态 ## 功能特性 1. 窗口交互 - ImGui 界面内可正常交互(点击按钮、滑动等) - 点击 ImGui 界面外的区域时,事件正确传递到底层应用 - 可通过拖动窗口任意位置来移动整个界面 2. 性能优化 - 移除冗余的触摸处理层 - 简化事件传递逻辑 - 优化渲染流程 ## 注意事项 1. 窗口大小 - 当前窗口大小固定为 1000x775 - 如需调整大小,需同时修改 Java 层和 ImGui 层的相关参数 2. 触摸事件 - 使用 ImGui 的 WantCaptureMouse 机制处理事件 - 确保事件在正确的区域被拦截或穿透 3. 窗口位置 - 初始位置设置为 (15, 270) - 可通过拖动调整位置 - 位置信息会被正确保存和更新 ## 可能的改进 1. 动态窗口大小 - 实现窗口大小的动态调整 - 添加缩放功能 2. 界面优化 - 添加更多自定义样式 - 优化交互体验 3. 性能优化 - 添加帧率控制 - 优化渲染效率