Я хочу знати, як виконати перетягування на андроїд на основі координат миші X, Y? розглянемо як два простих приклади: Team Viewer / QuickSupport малює "шаблон пароля" на віддаленому смартфоні та ручці Windows Paint відповідно.
Все, що я в змозі зробити, це імітувати дотик (з dispatchGesture()
і також AccessibilityNodeInfo.ACTION_CLICK
).
Я знайшов ці важливі посилання, але не знаю, чи вони можуть бути корисними:
Нижче - мій робочий код, який використовується для надсилання координат миші (всередині PictureBox
управління) на віддалений телефон та імітації дотику.
Додаток для форм Windows:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
foreach (ListViewItem item in lvConnections.SelectedItems)
{
// Remote screen resolution
string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920
int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
int yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);
Client client = (Client)item.Tag;
if (e.Button == MouseButtons.Left)
client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
}
}
Редагувати:
Моєю останньою спробою був "проведіть пальцем" за допомогою координат миші (C # Windows Forms Application) та користувацької програми Android (з посиланням на код "проведенного екрана", пов'язаного вище) відповідно:
private Point mdownPoint = new Point();
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
foreach (ListViewItem item in lvConnections.SelectedItems)
{
// Remote screen resolution
string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920
Client client = (Client)item.Tag;
if (e.Button == MouseButtons.Left)
{
xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);
// Saving start position:
mdownPoint.X = xClick;
mdownPoint.Y = yClick;
client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
}
}
}
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
foreach (ListViewItem item in lvConnections.SelectedItems)
{
// Remote screen resolution
string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920
Client client = (Client)item.Tag;
if (e.Button == MouseButtons.Left)
{
xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);
client.sock.Send(Encoding.UTF8.GetBytes("MOUSESWIPESCREEN" + mdownPoint.X + "<|>" + mdownPoint.Y + "<|>" + xClick + "<|>" + yClick + Environment.NewLine));
}
}
}
Android AccessibilityService :
public void Swipe(int x1, int y1, int x2, int y2, int time) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
System.out.println(" ======= Swipe =======");
GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
Path path = new Path();
path.moveTo(x1, y1);
path.lineTo(x2, y2);
gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 100, time));
dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {
@Override
public void onCompleted(GestureDescription gestureDescription) {
System.out.println("SWIPE Gesture Completed :D");
super.onCompleted(gestureDescription);
}
}, null);
}
}
який дає наступний результат (але все ще не в змозі намалювати «шаблон пароля», як, наприклад, TeamViewer). Але, як сказано в коментарі нижче, я думаю, що при подібному підході це можна досягти, мабуть, продовжуючи жести . Будь-які пропозиції в цьому напрямку будуть вітатися.
Редагувати 2:
Однозначно, рішення - це продовження жестів, як сказано в попередньому редагуванні .
А нижче - передбачуваний фіксований код, який я знайшов тут =>
Android AccessibilityService:
// Simulates an L-shaped drag path: 200 pixels right, then 200 pixels down.
Path path = new Path();
path.moveTo(200,200);
path.lineTo(400,200);
final GestureDescription.StrokeDescription sd = new GestureDescription.StrokeDescription(path, 0, 500, true);
// The starting point of the second path must match
// the ending point of the first path.
Path path2 = new Path();
path2.moveTo(400,200);
path2.lineTo(400,400);
final GestureDescription.StrokeDescription sd2 = sd.continueStroke(path2, 0, 500, false); // 0.5 second
HongBaoService.mService.dispatchGesture(new GestureDescription.Builder().addStroke(sd).build(), new AccessibilityService.GestureResultCallback(){
@Override
public void onCompleted(GestureDescription gestureDescription){
super.onCompleted(gestureDescription);
HongBaoService.mService.dispatchGesture(new GestureDescription.Builder().addStroke(sd2).build(),null,null);
}
@Override
public void onCancelled(GestureDescription gestureDescription){
super.onCancelled(gestureDescription);
}
},null);
Тоді я сумніваюся в тому, як правильно надіслати координати миші для коду вище, того, як можна виконати перетягування в будь-який бік? Якась ідея?
Редагувати 3:
Я знайшов дві підпрограми, які використовуються для виконання перетягування, але вони використовують UiAutomation + injectInputEvent()
. AFAIK, ін'єкція події працює лише в системному додатку, як сказано тут і тут, і я не хочу цього.
Це підпрограми, знайдені:
- public boolean swipe (int downX, int downY, int upX, int upY, int steps, булеве перетягування)
- загальнодоступне буле проводка (сегменти Point [], int segmentSteps)
Тоді, щоб досягти своєї мети, я думаю, що 2-й режим є більш доцільним для використання (дотримуючись логіки, виключаючи введення події) з кодом, показаним на Edit 2, і надіслати всі пункти pictureBox1_MouseDown
та pictureBox1_MouseMove
(C # Windows Forms Application) відповідно, щоб заповнювати Point[]
динамічно та pictureBox1_MouseUp
надсилати cmd для виконання процедури та використання цього заповненого масиву. Якщо у вас є ідея до першого розпорядку, дайте мені знати: D.
Якщо після прочитання цієї редакції у вас є можливе рішення, покажіть мені у відповідь, будь ласка, тоді як я спробую перевірити цю ідею.
StrokeDescription.continueStroke()
може бути ймовірним рішенням. Дивіться розділ Продовження жестів тут .
pictureBox1_MouseDown
не повинен надсилати координати. Він повинен зберігати лише початкові координати, а потім pictureBox1_MouseUp
ви надсилаєте їх, тому що це означає кінець руху миші