Làm cách nào để mô phỏng một sự kiện chạm với Android trong khi cung cấp các tọa độ X và Y theo cách thủ công?
Làm cách nào để mô phỏng một sự kiện chạm với Android trong khi cung cấp các tọa độ X và Y theo cách thủ công?
Câu trả lời:
Phương pháp của Valentin Rocher hoạt động nếu bạn đã mở rộng chế độ xem của mình, nhưng nếu bạn đang sử dụng trình nghe sự kiện, hãy sử dụng cách này:
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);
Để biết thêm về cách lấy một đối tượng MotionEvent, đây là một câu trả lời tuyệt vời: Android: Làm thế nào để tạo một MotionEvent?
downTime
sẽ là thời gian khi người dùng chạm xuống màn hình, trong khi eventTime
trong trường hợp này là khi người dùng nhấc ngón tay lên ( ACTION_UP
). Tôi không chắc liệu nó sẽ vẫn hoạt động nếu cả hai đều giống nhau. Bạn có thể kiểm tra nó và đăng kết quả của bạn.
Đây là một script Monkeyrunner gửi cảm ứng và kéo vào một ứng dụng. Tôi đã sử dụng điều này để kiểm tra xem ứng dụng của tôi có thể xử lý các cử chỉ vuốt lặp lại nhanh chóng hay không.
# 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
thay vì 'DOWN_AND_UP'
. ( DOWN_AND_UP
là mặc định, vì vậy mã của bạn vẫn hoạt động)
UP
hành động
sử dụng adb Shell Commands để mô phỏng sự kiện chạm
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
Nếu tôi hiểu rõ ràng, bạn muốn làm điều này theo chương trình. Sau đó, bạn có thể sử dụng phương thức onTouchEventView
và tạo một MotionEvent
với các tọa độ bạn cần.
Bạn nên cung cấp cho Monkeyrunner mới . Có thể điều này có thể giải quyết vấn đề của bạn. Bạn đặt mã khóa vào đó để kiểm tra, có thể xảy ra các sự kiện cảm ứng.
adb shell monkey
nó monkeyrunner
, mà là một công cụ khác.
Khi sử dụng Monkey Script, tôi nhận thấy rằng DispatchPress (KEYCODE_BACK) không làm gì cả. Trong nhiều trường hợp, điều này là do Hoạt động không sử dụng sự kiện Chính. Giải pháp cho vấn đề này là sử dụng kết hợp tập lệnh khỉ và lệnh nhập adb shell trong một chuỗi.
1 Sử dụng tập lệnh khỉ mang lại một số kiểm soát thời gian tuyệt vời. Chờ một khoảng thời gian nhất định cho hoạt động và là một cuộc gọi adb chặn.
2 Cuối cùng gửi adb shell input keyevent 4 sẽ kết thúc APK đang chạy.
VÍ DỤ
adb shell Monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell input keyevent 4