72 lines
2.3 KiB
Dart
72 lines
2.3 KiB
Dart
import 'package:fixnum/fixnum.dart';
|
||
import 'package:webrtc_controller_flutter/proto/control_message.pb.dart';
|
||
|
||
/// 控制指令构造工具,对应 Android 端 RemoteTouchView 的指令格式。
|
||
///
|
||
/// 指令通过 DataChannel 以 protobuf 二进制([ControlMessage])发送,
|
||
/// 被控端(WebRTCControlled)的 InputCommandHandler 负责解析执行。
|
||
class ControlCommands {
|
||
ControlCommands._();
|
||
|
||
/// 单击指令。坐标 x/y 为相对于屏幕的百分比(0.0 ~ 1.0)。
|
||
static ControlMessage touch(double x, double y) => ControlMessage(
|
||
action: Action.TOUCH,
|
||
x: x,
|
||
y: y,
|
||
);
|
||
|
||
/// 滑动指令。坐标为相对百分比,duration 为毫秒。
|
||
static ControlMessage swipe(
|
||
double x1,
|
||
double y1,
|
||
double x2,
|
||
double y2,
|
||
int durationMs,
|
||
) =>
|
||
ControlMessage(
|
||
action: Action.SWIPE,
|
||
x1: x1,
|
||
y1: y1,
|
||
x2: x2,
|
||
y2: y2,
|
||
duration: Int64(durationMs),
|
||
);
|
||
|
||
/// 按键指令。action: 0=按下, 1=抬起(对应 Android KeyEvent.ACTION_DOWN/UP)。
|
||
static ControlMessage key(int keyCode, int action) => ControlMessage(
|
||
action: Action.KEY,
|
||
keyCode: keyCode,
|
||
keyAction: action,
|
||
);
|
||
|
||
/// 长按指令。坐标 x/y 为相对于屏幕的百分比(0.0 ~ 1.0)。
|
||
/// 对应 Android 端 RemoteTouchView.createLongPressCommand。
|
||
static ControlMessage longPress(double x, double y) => ControlMessage(
|
||
action: Action.LONG_PRESS,
|
||
x: x,
|
||
y: y,
|
||
);
|
||
|
||
/// 原始 MotionEvent 指令,用于实现“实时跟手”。
|
||
/// action: 0=DOWN, 1=UP, 2=MOVE(对应 Android MotionEvent.ACTION_XXX)。
|
||
static ControlMessage motionEvent(int action, double x, double y) =>
|
||
ControlMessage(
|
||
action: Action.MOTION_EVENT,
|
||
motionAction: action,
|
||
x: x,
|
||
y: y,
|
||
);
|
||
|
||
/// 分辨率切换指令。
|
||
/// [width] 目标长边/宽度(<=0 表示被控端原生分辨率);
|
||
/// [height] 目标高度(<=0 时由被控端按屏幕宽高比计算);
|
||
/// [fps] 目标帧率(<=0 表示沿用当前帧率)。
|
||
static ControlMessage setResolution(int width, int height, int fps) =>
|
||
ControlMessage(
|
||
action: Action.SET_RESOLUTION,
|
||
width: width,
|
||
height: height,
|
||
fps: fps,
|
||
);
|
||
}
|