Bagaimana cara mensimulasikan kejadian sentuh dengan Android sambil memberikan koordinat X dan Y secara manual?
Bagaimana cara mensimulasikan kejadian sentuh dengan Android sambil memberikan koordinat X dan Y secara manual?
Jawaban:
Metode Valentin Rocher berfungsi jika Anda telah memperluas pandangan Anda, tetapi jika Anda menggunakan pendengar acara, gunakan ini:
view.setOnTouchListener(new OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
Toast toast = Toast.makeText(
getApplicationContext(),
"View touched",
Toast.LENGTH_LONG
);
toast.show();
return true;
}
});
// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
float x = 0.0f;
float y = 0.0f;
// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
downTime,
eventTime,
MotionEvent.ACTION_UP,
x,
y,
metaState
);
// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);
Untuk lebih lanjut tentang mendapatkan objek MotionEvent, berikut ini jawaban yang sangat bagus: Android: Bagaimana cara membuat MotionEvent?
downTime
akan menjadi waktu saat pengguna menyentuh layar, sedangkan eventTime
dalam kasus ini adalah saat pengguna mengangkat jari ke atas ( ACTION_UP
). Saya tidak yakin apakah itu akan tetap berfungsi jika keduanya sama. Anda dapat mengujinya dan memposting hasil Anda.
Berikut adalah skrip monkeyrunner yang mengirimkan sentuhan dan seret ke aplikasi. Saya telah menggunakan ini untuk menguji apakah aplikasi saya dapat menangani gerakan gesek berulang yang cepat.
# This is a monkeyrunner jython script that opens a connection to an Android
# device and continually sends a stream of swipe and touch gestures.
#
# See http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html
#
# usage: monkeyrunner swipe_monkey.py
#
# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
# Connects to the current device
device = MonkeyRunner.waitForConnection()
# A swipe left from (x1, y) to (x2, y) in 2 steps
y = 400
x1 = 100
x2 = 300
start = (x1, y)
end = (x2, y)
duration = 0.2
steps = 2
pause = 0.2
for i in range(1, 250):
# Every so often inject a touch to spice things up!
if i % 9 == 0:
device.touch(x2, y, 'DOWN_AND_UP')
MonkeyRunner.sleep(pause)
# Swipe right
device.drag(start, end, duration, steps)
MonkeyRunner.sleep(pause)
# Swipe left
device.drag(end, start, duration, steps)
MonkeyRunner.sleep(pause)
MonkeyDevice.DOWN_AND_UP
bukan 'DOWN_AND_UP'
. ( DOWN_AND_UP
adalah default, jadi kode Anda masih berfungsi)
UP
tindakan
gunakan Perintah adb Shell untuk mensimulasikan peristiwa sentuh
adb shell input tap x y
and also
adb shell sendevent /dev/input/event0 3 0 5
adb shell sendevent /dev/input/event0 3 1 29
Jika saya mengerti dengan jelas, Anda ingin melakukan ini secara terprogram. Kemudian, Anda dapat menggunakan metode onTouchEventView
, dan membuat MotionEvent
dengan koordinat yang Anda butuhkan.
Anda harus mencoba monkeyrunner baru . Mungkin ini bisa menyelesaikan masalah Anda. Anda meletakkan kode kunci di dalamnya untuk pengujian, mungkin peristiwa sentuh juga dimungkinkan.
adb shell monkey
itu monkeyrunner
, yang merupakan alat yang berbeda.
Saat menggunakan Monkey Script saya perhatikan bahwa DispatchPress (KEYCODE_BACK) tidak melakukan apa pun yang benar-benar payah. Dalam banyak kasus, hal ini disebabkan oleh fakta bahwa Aktivitas tidak menggunakan event Key. Solusi untuk masalah ini adalah dengan menggunakan campuran perintah monkey script dan adb shell secara berurutan.
1 Menggunakan skrip monyet memberikan kontrol waktu yang bagus. Tunggu beberapa detik untuk aktivitas dan panggilan adb memblokir.
2 Akhirnya, mengirim adb shell input keyevent 4 akan mengakhiri APK yang berjalan.
MISALNYA
adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
kejadian kunci masukan shell adb 4