OpenHarmonyToolkitsPlaza/HOScrcpy设备交互与事件处理

【免费下载链接】鸿蒙远程真机工具 该工具主要提供鸿蒙系统下基于视频流的投屏功能,帧率基本持平真机帧率,达到远程真机的效果。 【免费下载链接】鸿蒙远程真机工具 项目地址: https://gitcode.com/OpenHarmonyToolkitsPlaza/HOScrcpy

文章详细介绍了HOScrcpy工具在鸿蒙设备远程控制中的核心功能,包括设备分辨率与屏幕旋转控制、触摸与鼠标事件注入、键盘事件与快捷键支持以及实时反控服务实现。通过代码示例和流程图,展示了如何灵活调整设备分辨率、控制屏幕旋转、模拟用户操作以及实现键盘快捷键功能。

设备分辨率与屏幕旋转控制

在鸿蒙远程真机工具HOScrcpy中,设备分辨率和屏幕旋转控制是实现高效投屏和交互的核心功能之一。通过合理配置和调用相关API,开发者可以灵活调整设备的分辨率,并控制屏幕的旋转状态,从而优化投屏体验。

设备分辨率控制

设备分辨率决定了投屏画面的清晰度和流畅性。HOScrcpy提供了以下功能来管理设备分辨率:

  1. 获取设备分辨率
    通过Device类的getScreenshot方法,可以获取当前设备的屏幕截图,并从中提取分辨率信息。例如:

    BufferedImage screenshot = device.getScreenshot(null);
    if (screenshot != null) {
        int width = screenshot.getWidth();
        int height = screenshot.getHeight();
        System.out.println("设备分辨率: " + width + "x" + height);
    }
    
  2. 设置分辨率缩放
    HosRemoteConfig类中,可以通过setScale方法设置视频流的分辨率缩放倍率。例如,设置为2表示获取的视频流分辨率为原始分辨率的二分之一:

    HosRemoteConfig config = new HosRemoteConfig("设备SN");
    config.setScale(2); // 设置为原始分辨率的1/2
    
  3. 动态调整分辨率
    开发者可以根据需求动态调整分辨率,例如在低带宽环境下降低分辨率以提升流畅性:

    mermaid

屏幕旋转控制

屏幕旋转功能允许开发者根据应用需求调整设备的横竖屏状态。HOScrcpy提供了以下方法:

  1. 设置横屏模式
    调用setRotationHorizontal方法将设备屏幕设置为横屏状态:

    device.setRotationHorizontal();
    
  2. 设置竖屏模式
    调用setRotationVertical方法将设备屏幕设置为竖屏状态:

    device.setRotationVertical();
    
  3. 屏幕旋转状态检测
    开发者可以通过getScreenSize方法获取当前设备的分辨率,并根据宽高比判断屏幕方向:

    Size screenSize = device.getScreenSize(true);
    if (screenSize.width > screenSize.height) {
        System.out.println("当前为横屏模式");
    } else {
        System.out.println("当前为竖屏模式");
    }
    

示例代码

以下是一个完整的示例,展示如何动态调整分辨率和控制屏幕旋转:

// 初始化设备
HosRemoteConfig config = new HosRemoteConfig("设备SN");
config.setScale(2); // 设置分辨率为原始1/2
HosRemoteDevice device = new HosRemoteDevice(config);

// 获取并打印分辨率
Size screenSize = device.getScreenSize(true);
System.out.println("当前分辨率: " + screenSize.width + "x" + screenSize.height);

// 切换为横屏模式
device.setRotationHorizontal();
System.out.println("已切换为横屏模式");

// 切换为竖屏模式
device.setRotationVertical();
System.out.println("已切换为竖屏模式");

注意事项

  1. 分辨率缩放限制
    最大缩放倍率为5,超过此值可能导致画面模糊或性能问题。

  2. 屏幕旋转依赖应用支持
    某些应用可能不支持动态旋转,需确保目标应用适配横竖屏切换。

  3. 性能优化
    在高分辨率下,投屏可能占用较多带宽和计算资源,建议根据实际需求调整分辨率。

通过以上功能,开发者可以灵活控制设备的分辨率和屏幕旋转状态,从而为用户提供更优质的投屏体验。

触摸与鼠标事件注入

在OpenHarmonyToolkitsPlaza/HOScrcpy项目中,触摸与鼠标事件注入是实现设备远程控制的核心功能之一。通过注入事件,开发者可以模拟用户在设备上的操作,例如点击、滑动、长按等。以下将详细介绍该功能的实现方式和使用场景。

事件注入机制

事件注入主要通过MultiFunctionLabel类和MainForm类实现,结合回调接口(如KeyBoardCallBackDumpLayoutCallBack等)完成事件的传递与处理。以下是关键类和接口的协作关系:

mermaid

触摸事件注入

触摸事件包括按下(onTouchDown)、抬起(onTouchUp)和移动(onTouchMove)。这些事件通过MultiFunctionLabel的鼠标事件监听器实现:

  1. 按下事件

    @Override
    public void mousePressed(MouseEvent e) {
        if (screenCapturingMode) {
            actualTimeControlCallBack.onMouseDown(e.getPoint(), this);
        }
    }
    
  2. 抬起事件

    @Override
    public void mouseReleased(MouseEvent e) {
        if (screenCapturingMode) {
            actualTimeControlCallBack.onMouseUp(e.getPoint(), this);
        }
    }
    
  3. 移动事件

    @Override
    public void mouseDragged(MouseEvent e) {
        if (screenCapturingMode) {
            actualTimeControlCallBack.onMouseMove(e.getPoint(), this);
        }
    }
    

鼠标事件注入

鼠标事件支持左键、中键和右键的按下、抬起和移动操作。以下是鼠标事件的注入方式:

  1. 按下事件

    public void onMouseDown(String mouseType, int x, int y) {
        // 根据mouseType(LEFT/MIDDLE/RIGHT)注入事件
    }
    
  2. 抬起事件

    public void onMouseUp(String mouseType, int x, int y) {
        // 根据mouseType(LEFT/MIDDLE/RIGHT)注入事件
    }
    
  3. 移动事件

    public void onMouseMove(String mouseType, int x, int y) {
        // 根据mouseType(LEFT/MIDDLE/RIGHT)注入事件
    }
    

使用场景

以下是一个典型的使用场景,展示如何通过代码注入触摸事件:

// 初始化MultiFunctionLabel
MultiFunctionLabel label = new MultiFunctionLabel();
label.setActualTimeControlCallBack(new ActualTimeControlCallBack() {
    @Override
    public void onMouseDown(Point point, MultiFunctionLabel label) {
        // 处理按下事件
    }
    @Override
    public void onMouseUp(Point point, MultiFunctionLabel label) {
        // 处理抬起事件
    }
    @Override
    public void onMouseMove(Point point, MultiFunctionLabel label) {
        // 处理移动事件
    }
});

// 模拟点击操作
label.mousePressed(new MouseEvent(label, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), 0, 100, 100, 1, false));
label.mouseReleased(new MouseEvent(label, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), 0, 100, 100, 1, false));

注意事项

  1. 坐标转换:注入事件的坐标需转换为设备屏幕的实际坐标。
  2. 事件同步:确保事件的顺序和时序正确,避免因异步操作导致事件丢失或错乱。
  3. 性能优化:高频事件注入时需注意性能开销,避免阻塞主线程。

通过以上内容,开发者可以快速掌握触摸与鼠标事件注入的实现方式,并灵活应用于远程控制场景中。

键盘事件与快捷键支持

在HOScrcpy项目中,键盘事件与快捷键支持是通过KeyBoardCallBack接口及其实现类来完成的。这一机制允许开发者通过键盘输入与远程设备进行交互,同时支持自定义快捷键功能。以下将详细介绍其实现原理和使用方法。

键盘事件回调机制

KeyBoardCallBack是一个接口,定义在utils.callbacks包中,用于处理键盘事件的回调逻辑。其核心方法如下:

public interface KeyBoardCallBack {
    void onKeyPressed(KeyEvent e);
    void onKeyReleased(KeyEvent e);
}
实现类示例

MainForm.java中,KeyBoardCallBack的具体实现如下:

private final KeyBoardCallBack keyBoardCallBack = new KeyBoardCallBack() {
    @Override
    public void onKeyPressed(KeyEvent e) {
        // 处理按键按下事件
        Log.debug("KeyBoard", "Key pressed: " + e.getKeyCode());
    }

    @Override
    public void onKeyReleased(KeyEvent e) {
        // 处理按键释放事件
        Log.debug("KeyBoard", "Key released: " + e.getKeyCode());
    }
};

快捷键支持

通过KeyBoardCallBack接口,开发者可以轻松实现快捷键功能。例如,以下代码展示了如何为MultiFunctionLabel组件绑定快捷键:

multiFunctionLabel.setKeyBoardCallBack(new KeyBoardCallBack() {
    @Override
    public void onKeyPressed(KeyEvent e) {
        if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_S) {
            // 处理Ctrl+S快捷键
            saveCurrentLayout();
        }
    }

    @Override
    public void onKeyReleased(KeyEvent e) {
        // 可选:处理按键释放逻辑
    }
});

键盘事件处理流程

以下是键盘事件的处理流程图:

mermaid

常用快捷键示例

以下是一些常见的快捷键实现示例:

快捷键组合 功能描述
Ctrl + S 保存当前布局
Ctrl + C 复制当前选中元素
Ctrl + V 粘贴元素
F5 刷新设备屏幕

代码示例

以下是一个完整的键盘事件处理示例:

public class MainForm {
    private final KeyBoardCallBack keyBoardCallBack = new KeyBoardCallBack() {
        @Override
        public void onKeyPressed(KeyEvent e) {
            if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_S) {
                saveCurrentLayout();
            } else if (e.getKeyCode() == KeyEvent.VK_F5) {
                refreshDeviceScreen();
            }
        }

        @Override
        public void onKeyReleased(KeyEvent e) {
            // 可选逻辑
        }
    };

    private void saveCurrentLayout() {
        // 保存布局逻辑
    }

    private void refreshDeviceScreen() {
        // 刷新屏幕逻辑
    }
}

通过以上机制,开发者可以灵活地为HOScrcpy项目添加键盘事件和快捷键支持,从而提升用户交互体验。

实时反控服务实现

实时反控服务是HOScrcpy工具的核心功能之一,它允许开发者通过视频流或图片流实时控制鸿蒙设备。以下将详细介绍其实现原理、关键代码逻辑以及使用方法。

实现原理

实时反控服务基于视频流或图片流的回调机制,通过注入事件(如触摸、鼠标、键盘等)实现对设备的远程控制。其核心流程如下:

mermaid

关键代码逻辑

1. 视频流回调接口

ScreenCapCallback接口定义了视频流数据的回调方法:

public interface ScreenCapCallback {
    void onData(ByteBuffer byteBuffer);      // 视频流数据回调
    void onException(Throwable throwable);   // 异常回调
    void onReady();                         // 视频流就绪回调
}
2. 事件注入方法

HosRemoteDevice类提供了多种事件注入方法,例如:

// 触摸事件
public void onTouchDown(int x, int y);      // 手指按下
public void onTouchUp(int x, int y);        // 手指抬起
public void onTouchMove(int x, int y);      // 手指移动

// 鼠标事件
public void onMouseDown(String mouseType, int x, int y);  // 鼠标按下
public void onMouseUp(String mouseType, int x, int y);    // 鼠标抬起
3. 设备控制逻辑

通过HosRemoteConfig配置设备参数,例如分辨率、帧率等:

HosRemoteConfig config = new HosRemoteConfig("设备SN");
config.setScale(2);        // 设置分辨率缩放
config.setFrameRate(60);   // 设置帧率
HosRemoteDevice device = new HosRemoteDevice(config);

使用方法

以下是一个简单的示例代码,展示如何启动实时反控服务并注入事件:

// 初始化设备
HosRemoteDevice device = new HosRemoteDevice("设备SN");

// 启动视频流
device.startCaptureScreen(new ScreenCapCallback() {
    @Override
    public void onData(ByteBuffer buffer) {
        // 处理视频流数据
    }

    @Override
    public void onException(Throwable throwable) {
        // 处理异常
    }

    @Override
    public void onReady() {
        // 视频流就绪后注入事件
        device.onTouchDown(100, 200);  // 模拟触摸按下
    }
});

关键类与功能

类名 功能描述
HosRemoteDevice 提供设备连接、事件注入、视频流控制等功能。
ScreenCapCallback 视频流回调接口,用于处理视频流数据和异常。
HosRemoteConfig 配置设备参数,如分辨率、帧率、端口等。

注意事项

  1. 帧率与性能:高帧率可能导致设备性能下降,建议根据实际需求调整。
  2. 事件同步:注入事件时需确保设备已连接且视频流已启动。
  3. 异常处理:通过onException回调捕获并处理异常,避免服务中断。

通过以上实现,开发者可以灵活地集成实时反控服务到自己的应用中,实现高效的鸿蒙设备远程控制。

总结

HOScrcpy工具通过完善的API和回调机制,为开发者提供了强大的鸿蒙设备远程控制能力。从分辨率调整到事件注入,再到实时反控服务,该工具覆盖了设备交互的多个关键场景。开发者可以根据实际需求,灵活调用相关功能,优化投屏体验并实现高效的远程控制。

【免费下载链接】鸿蒙远程真机工具 该工具主要提供鸿蒙系统下基于视频流的投屏功能,帧率基本持平真机帧率,达到远程真机的效果。 【免费下载链接】鸿蒙远程真机工具 项目地址: https://gitcode.com/OpenHarmonyToolkitsPlaza/HOScrcpy

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐