Saya ingin tahu cara melakukan drag pada android yang berbasis di X, koordinat mouse Y? pertimbangkan sebagai dua contoh sederhana, Penampil Tim / QuickSupport menggambar "pola kata sandi" pada smartphone jarak jauh dan Pena Windows Paint.
Yang bisa saya lakukan hanyalah mensimulasikan sentuhan (dengan dispatchGesture()
dan juga AccessibilityNodeInfo.ACTION_CLICK
).
Saya menemukan tautan yang relevan ini, tetapi tidak tahu apakah itu dapat berguna:
Di bawah ini adalah kode kerja saya yang digunakan untuk mengirim koordinat mouse (di dalam PictureBox
kendali) ke telepon jarak jauh dan mensimulasikan sentuhan.
Aplikasi Formulir 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));
}
}
Edit:
Upaya terakhir saya adalah "layar gesek" menggunakan koordinat mouse (C # Aplikasi Formulir Windows) dan rutin android khusus (dengan mengacu pada kode "layar gesek" yang terhubung di atas), masing-masing:
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));
}
}
}
Layanan Aksesibilitas Android :
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);
}
}
yang menghasilkan hasil berikut (tetapi masih tidak dapat menggambar "kata sandi pola" seperti TeamViewer misalnya). Tetapi seperti dikatakan pada komentar di bawah, saya pikir bahwa dengan pendekatan yang sama ini dapat dicapai dengan menggunakan gerakan Lanjutan mungkin. Setiap saran dalam arah ini akan diterima.
Edit 2:
Pastinya, solusinya adalah melanjutkan gerakan seperti yang dikatakan pada Edit sebelumnya .
- Mensimulasikan gerakan joystick menggunakan AccessibilityService
- Mengapa fungsi continueStroke tidak berfungsi
Dan di bawah ini adalah kode tetap yang seharusnya saya temukan di sini =>
Layanan Aksesibilitas Android:
// 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);
Lalu, keraguan saya adalah: bagaimana cara mengirim koordinat mouse dengan benar untuk kode di atas, dari cara yang dapat melakukan drag ke arah mana pun? Beberapa ide?
Edit 3:
Saya menemukan dua rutinitas yang digunakan untuk melakukan drag, tetapi mereka menggunakan UiAutomation + injectInputEvent()
. AFAIK, injeksi acara hanya berfungsi dalam aplikasi sistem seperti yang dikatakan di sini dan di sini dan saya tidak menginginkannya.
Ini adalah rutinitas yang ditemukan:
- gesekan boolean publik (int downX, int downY, int upX, int upY, langkah int, seret boolean)
- gesekan boolean publik (Poin [] segmen, int segmentSteps)
Kemudian untuk mencapai tujuan saya, saya pikir rutin ke-2 lebih tepat untuk digunakan (mengikuti logika, tidak termasuk injeksi peristiwa) dengan kode yang ditunjukkan pada Edit 2 dan mengirim semua titik pictureBox1_MouseDown
dan pictureBox1_MouseMove
(C # Aplikasi Windows Forms) masing-masing untuk mengisi Point[]
secara dinamis dan pictureBox1_MouseUp
mengirim cmd untuk menjalankan rutin dan menggunakan array yang diisi ini. Jika Anda memiliki ide untuk rutinitas pertama, beri tahu saya: D.
Jika setelah membaca Sunting ini Anda memiliki solusi yang memungkinkan, tolong tunjukkan saya dalam jawaban, sementara saya akan mencoba dan menguji ide ini.
StrokeDescription.continueStroke()
bisa menjadi solusi yang memungkinkan. Lihat bagian Gerakan lanjutan di sini .
pictureBox1_MouseDown
tidak boleh mengirim koordinat. Seharusnya hanya menyimpan koordinat awal, dan kemudian pada pictureBox1_MouseUp
Anda mengirimnya, karena itu menandai akhir gerakan mouse