จะจำลองเหตุการณ์การสัมผัสด้วย Android ในขณะที่ให้พิกัด X และ Y ด้วยตนเองได้อย่างไร
จะจำลองเหตุการณ์การสัมผัสด้วย Android ในขณะที่ให้พิกัด X และ Y ด้วยตนเองได้อย่างไร
คำตอบ:
วิธีการของ Valentin Rocher ใช้ได้ผลหากคุณขยายมุมมองของคุณ แต่ถ้าคุณใช้ผู้ฟังเหตุการณ์ให้ใช้สิ่งนี้:
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);
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรับวัตถุ MotionEvent นี่คือคำตอบที่ยอดเยี่ยม: Android: จะสร้าง MotionEvent ได้อย่างไร?
downTime
จะเป็นเวลาที่ผู้ใช้แตะลงบนหน้าจอในขณะที่eventTime
ในกรณีนี้จะเป็นเวลาที่ผู้ใช้ยกนิ้วขึ้น ( ACTION_UP
) ฉันไม่แน่ใจว่ามันจะยังใช้งานได้หรือไม่ถ้าทั้งสองเหมือนกัน คุณสามารถทดสอบและโพสต์ผลลัพธ์ของคุณ
นี่คือสคริปต์ Monkeyrunner ที่ส่งการสัมผัสและลากไปยังแอปพลิเคชัน ฉันใช้สิ่งนี้เพื่อทดสอบว่าแอปพลิเคชันของฉันสามารถรองรับท่าทางการปัดซ้ำ ๆ อย่างรวดเร็วได้
# 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
แทน'DOWN_AND_UP'
. ( DOWN_AND_UP
เป็นค่าเริ่มต้นดังนั้นรหัสของคุณยังคงใช้งานได้)
UP
ดำเนินการ
ใช้ adb Shell Commands เพื่อจำลองเหตุการณ์การสัมผัส
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
ถ้าฉันเข้าใจชัดเจนคุณต้องทำตามโปรแกรม จากนั้นคุณสามารถใช้เมธอดonTouchEventView
และสร้างMotionEvent
พิกัดที่คุณต้องการ
คุณควรให้Monkeyrunnerใหม่ไป บางทีนี่อาจช่วยแก้ปัญหาของคุณได้ คุณใส่รหัสเพื่อทดสอบอาจเป็นเหตุการณ์สัมผัสได้
adb shell monkey
มันเป็นmonkeyrunner
เครื่องมือที่แตกต่างกัน
เมื่อใช้ Monkey Script ฉันสังเกตว่า DispatchPress (KEYCODE_BACK) ไม่ได้ทำอะไรเลยที่แย่มาก ในหลาย ๆ กรณีเกิดจากการที่กิจกรรมไม่ใช้เหตุการณ์สำคัญ วิธีแก้ปัญหานี้คือการใช้คำสั่งผสมของ Monkey script และ adb shell input ตามลำดับ
1 การใช้สคริปต์ลิงช่วยให้สามารถควบคุมเวลาได้ดีเยี่ยม รอสักครู่สำหรับกิจกรรมและเป็นการปิดกั้นการโทร adb
2 ในที่สุดก็ส่งคีย์อินพุตเชลล์ adb เหตุการณ์ 4 จะสิ้นสุด APK ที่กำลังทำงานอยู่
เช่น
adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell input keyevent 4
MotionEvent สร้างขึ้นโดยการสัมผัสหน้าจอเท่านั้น