Как рассчитать координаты X, Y для имитации касания на экране?
В рамках проекта по удаленному управлению смартфонами на Android вы столкнулись с необходимостью имитации касаний на экране, используя координаты курсора мыши внутри компонента Image в Delphi. Это компонент отображает экран удаленного устройства. В вашем проекте компонент Image расположен внутри компонента ScrollBox. Оба компонента настроены следующим образом:
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;
Для отправки координат используется процедура Image1MouseDown:
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;
// Отправка координат на Android устройство
end;
Вы также попытались применить подобный подход в коде на Java (Android), но касания происходили в неправильных местах:
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;
// Касание на экране с координатами x и y
}
Проблема заключалась в том, что операции с координатами не изменяли их значение, как ожидалось, и касания происходили в местах, отличных от тех, где был совершен клик мышью на экране компонента TImage в приложении Delphi.
Решение проблемы было найдено и заключается в следующем:
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);
RYCoord := StrToInt(List[0]); // Высота экрана устройства
RXCoord := StrToInt(List[1]); // Ширина экрана устройства
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;
В данном решении используется информация о разрешении экрана устройства для корректного преобразования координат из компонента Image в реальные физические размеры экрана устройства.
Этот метод позволяет точно имитировать касания на экране Android устройства в том же месте, где было совершено нажатие мышью на изображении экрана в приложении Delphi.
В рамках проекта по удаленному управлению смартфонами на Android необходимо рассчитать координаты X и Y для имитации касаний на экране с учетом масштабирования компонента `Image` в Delphi и реальных размеров экрана устройства.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.