Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何计算X,Y坐标来模拟触摸屏?_Android_Delphi_Delphi 10 Seattle_Accessibilityservice - Fatal编程技术网

Android 如何计算X,Y坐标来模拟触摸屏?

Android 如何计算X,Y坐标来模拟触摸屏?,android,delphi,delphi-10-seattle,accessibilityservice,Android,Delphi,Delphi 10 Seattle,Accessibilityservice,在我的智能手机android远程协助项目中,我尝试在图像组件(Delphi)中基于鼠标坐标模拟触摸屏(使用),这是我接收远程设备屏幕的地方 图像组件位于滚动框组件内 图像组件为:对齐:alNone,自动调整大小:True ScrollBox是:Align:alClient,AutoScroll:True,AutoSize:False 图像组件的重定尺寸代码: procedure TForm2.Checkbox1Click(Sender: TObject); begin if Check

在我的智能手机android远程协助项目中,我尝试在
图像
组件(Delphi)中基于鼠标坐标模拟触摸屏(使用),这是我接收远程设备屏幕的地方

图像
组件位于
滚动框
组件内

  • 图像
    组件为:对齐:alNone,自动调整大小:True
  • ScrollBox
    是:Align:alClient,AutoScroll:True,AutoSize:False
图像组件的重定尺寸代码:

procedure TForm2.Checkbox1Click(Sender: TObject);
begin
  if Checkbox1.Checked then
  begin
    Image1.AutoSize := false;
    Image1.Stretch := true;
    Image1.Align := alClient;
  end
  else
  begin
    Image1.AutoSize := true;
    Image1.Stretch := false;
    Image1.Align := alNone;
  end;
end;
这是我发送坐标的方式:

procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

  X := (X * Image1.Width) div Image1.Width;
  Y := (Y * Image1.Height) div Image1.Height;

  SS1.Socket.Connections[Index].SendText('touch' + IntToStr(X) +
    '<|>' + IntToStr(Y) + #13#10);
end;
程序TForm2.Image1MouseDown(发送方:ToObject;按钮:TMouseButton;
移位:t移位状态;X,Y:整数);
开始
X:=(X*Image1.宽度)div Image1.宽度;
Y:=(Y*Image1.高度)div Image1.高度;
SS1.Socket.Connections[Index].SendText('touch')+IntToStr(X)+
''+IntToStr(Y)+13#10);
结束;
然后我在Java代码(android)上尝试了这一点:

字符串xline;
如果(xline.contains(“touch”)){
字符串坐标=xline.replace(“touch”,“”);
String[]tokens=coordinates.split(Pattern.quote(“”));
float x=parseFloat(标记[0]);
float y=parseFloat(标记[1]);
int screenWidth=getResources().getDisplayMetrics().widthPixels;
int screenHeight=getResources().getDisplayMetrics().heightPixels;
x=(x*屏幕宽度)/屏幕宽度;
y=(y*屏幕高度)/屏幕高度;
//用x和y在屏幕上触摸
}
但是触摸是发生在一个非常遥远的地方


如何解决此问题?

找到了解决方案,参考文献为:

程序TForm2.Image1MouseDown(发送方:ToObject;按钮:TMouseButton;
移位:t移位状态;X,Y:整数);
变量
索引,XTouch,YTouch,RXCoord,RYCoord:整数;
列表:t字符串;
屏幕:字符串;
开始
索引:=Form1.ListView1.ItemIndex;
如果索引=-1,则
出口
列表:=TStringList.Create;
rsscreen:=Form1.ListView1.Selected.SubItems[6];
尝试
提取字符串(['x'],[],PChar(RScreen),List);//我的智能手机是1920x1080
RYCoord:=stroint(列表[0]);//1920(高度)
RXCoord:=stroint(列表[1]);//1080(宽度)
最后
列表。免费;
结束;
XTouch:=圆形((X/Image1.宽度)*RXCoord);
YTouch:=圆形((Y/Image1.高度)*RYCoord);
Form1.SS1.Socket.Connections[Index].SendText('touch')+IntToStr(XTouch)
+''+IntToStr(YTouch)+13#10);
结束;

请注意,这些操作不会更改X和Y:
X:=(X*Image1.Width)div Image1.Width。期望的结果是什么?什么的坐标?@MBo,我想举个例子:当我点击WhatsApp图标时,智能手机上的触摸也会在WhatsApp图标上。这是我所希望的结果。然后,没有人会告诉我如何计算这些坐标以在智能手机屏幕上触摸到我用鼠标指向
TImage
组件的同一位置(上面的Delphi应用程序屏幕截图)?
String xline;

if (xline.contains("touch")) {

    String coordinates = xline.replace("touch", "");

    String[] tokens = coordinates.split(Pattern.quote("<|>"));

    float x = parseFloat(tokens[0]);
    float y = parseFloat(tokens[1]);

    int screenWidth = getResources().getDisplayMetrics().widthPixels;
    int screenHeight = getResources().getDisplayMetrics().heightPixels;

    x = (x * screenWidth) / screenWidth;
    y = (y * screenHeight) / screenHeight;

    // touch on screen with x and y
}
procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Index, XTouch, YTouch, RXCoord, RYCoord: Integer;
  List: TStrings;
  RScreen: String;
begin
  Index := Form1.ListView1.ItemIndex;
  if Index = -1 then
    Exit;

  List := TStringList.Create;
  RScreen := Form1.ListView1.Selected.SubItems[6];

  try
    ExtractStrings(['x'], [], PChar(RScreen), List); // Ex: my smartphone is 1920x1080
    RYCoord := StrToInt(List[0]); // 1920 (height)
    RXCoord := StrToInt(List[1]); // 1080 (width)
  finally
    List.Free;
  end;

  XTouch := Round((X / Image1.Width) * RXCoord);
  YTouch := Round((Y / Image1.Height) * RYCoord);

  Form1.SS1.Socket.Connections[Index].SendText('touch' + IntToStr(XTouch)
    + '<|>' + IntToStr(YTouch) + #13#10);
end;