feat(android): 触摸映射 + letterbox 显示(阶段 2a 代码部分)
问题:阶段 1 的 SurfaceView 用 MATCH_PARENT,2560x1440 的视频被拉进 1080x2400 竖屏,画面变形。变形状态下手指位置与远端指针不再一一对应, 触摸映射无从谈起。所以两者必须一起做。 新增 RemoteSurfaceView - onMeasure 按视频宽高比 letterbox:视图尺寸 = 画面尺寸,黑边不属于视图, 触摸天然只在画面内产生事件,坐标归一化到 0..=65535 才准确 - 手势:单指轻点=左键、单指拖动=左键拖拽、双指轻点=右键、双指滑动=滚轮 - 刻意不做「手指即光标」的绝对跟随:手指会完全挡住目标,精细操作不可用 - 边界处理:进入拖拽后落下第二指,先抬起左键再切双指手势, 否则远端会留下一个被按住未释放的按键 协议侧(不改线格式,只加只读查询) - viewer-core::Session 记录 AuthOk 的桌面尺寸,新增 desktop_size() - android-ffi 新增 nativeDesktopSize(handle) -> i64(高32=宽,低32=高) - RustBridge.desktopSize() 拆包 - 尺寸必须在建解码器之前拿到:等首帧再改视图尺寸会触发重新测量, 把刚创建的解码器 surface 打掉 MainActivity - 接入 RemoteSurfaceView.Listener;连接成功后先取尺寸设宽高比,再起解码线程 - 返回键 = 断开(不退出 App,便于重连);去掉阶段 1 的双击断开 (双击现在语义上是「两次左键点击」,会和远端交互冲突) 验证:cargo build --workspace 通过;cargo test 全绿(common 20 + viewer-core 3)。 真机手势验收待手机重新连接后补。
This commit is contained in:
1 parent
f119300a57
commit
5047618c01
5 files changed
+315
-78
No files matched your search
@@ -172,6 +172,22 @@ pub extern "system" fn Java_com_verify_remote_RustBridge_nativeStats(
|
||||
(((st.rtt_ms & 0xFFFF_FFFF) << 32) | (st.frames_in & 0xFFFF_FFFF)) as jlong
|
||||
}
|
||||
|
||||
/// 被控端桌面尺寸,打包成 i64:高 32 位宽、低 32 位高。0 = 句柄无效。
|
||||
/// Kotlin 侧必须在建解码器之前调用,用返回值定 SurfaceView 宽高比。
|
||||
#[no_mangle]
|
||||
pub extern "system" fn Java_com_verify_remote_RustBridge_nativeDesktopSize(
|
||||
_env: JNIEnv,
|
||||
_class: JClass,
|
||||
handle: jlong,
|
||||
) -> jlong {
|
||||
let Some(boxed) = handle_to_box(handle) else {
|
||||
return 0;
|
||||
};
|
||||
let guard = lock_box(boxed);
|
||||
let (w, h) = guard.session.desktop_size();
|
||||
(((w as u64 & 0xFFFF_FFFF) << 32) | (h as u64 & 0xFFFF_FFFF)) as jlong
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "system" fn Java_com_verify_remote_RustBridge_nativeSendMouseMove(
|
||||
_env: JNIEnv,
|
||||
|
||||
Reference in new issue
Block a user