Làm cách nào để mô phỏng một sự kiện chạm trong Android?


101

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?


1
Bạn sẽ nhận được một số câu trả lời khả thi bên dưới, chỉ cần lưu ý rằng chúng sẽ chỉ hoạt động trên các ứng dụng mà bạn có thể thực hiện các sửa đổi nhỏ. Đối với các ứng dụng khác mà bạn không thể sửa đổi, bạn sẽ cần một nền tảng gốc để đưa các sự kiện vào.
Chris Stratton

Có thể thực hiện một ứng dụng để chạm vào x, y trong mỗi 10 giây và thu nhỏ nó, nhưng chạm vào x, y vẫn được tiếp tục?
Dr.jacky

Kiểm tra câu trả lời của tôi mà không có yêu cầu root. :)
Anand Varkey Philips

Câu trả lời:


110

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?


1
Câu trả lời hay, nhưng là một người mới bắt đầu sử dụng Android, OnTouchListener đã làm tôi bối rối. Bây giờ tôi nhận ra rằng người nghe không cần thiết để mô phỏng. Điều duy nhất cần thiết là MotionEvent trong nửa sau mã của bạn.
user1532390

Tại sao bạn lại thêm 100 mili vào eventTime? Nó không hoạt động nếu downTime và eventTime giống nhau?
tu-Reinstate Monica-dor duh

2
@tudor - Chỉ để mô phỏng một thao tác chạm thực. downTimesẽ là thời gian khi người dùng chạm xuống màn hình, trong khi eventTimetrong 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.
azdev

Tôi nên khai báo đối tượng view như thế nào?
TheLogicGuy

ok .. còn cử chỉ vuốt sang trái, phải, trên và dưới .. bằng ACTION_MOVE thì làm thế nào để thực hiện việc này?
Ramesh_D

24

Đâ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)

1
Bạn nên sử dụng MonkeyDevice.DOWN_AND_UPthay vì 'DOWN_AND_UP'. ( DOWN_AND_UPlà mặc định, vì vậy mã của bạn vẫn hoạt động)
ValarDohaeris

Thử trên một thiết bị (Nexus 10), nó chỉ đơn giản khởi động lại ngay sau khi UPhành động
Equidamoid

Tôi có thể sử dụng điều này trong một lớp không thử nghiệm không?
Dania

20

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 

1
hey gì về nếu muốn tới zoom nhúm mô phỏng cách sử dụng lệnh adb và tôi có tọa độ của nhúm zoom
nikhil84

1

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 MotionEventvới các tọa độ bạn cần.


1

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.


1
Vui lòng cho tôi biết cách cài đặt Monkeyrunner. adb không nhận ra khỉrunner
indra

Nó không liên quan đến con khỉ đầu bò ui của adb. Bạn sẽ tìm thấy Monkeyrunner trong thư mục công cụ của bản sửa đổi 9 của adt.
bàn phím bàn phím

Cũng kiểm tra liên kết tôi đã cung cấp trong câu trả lời của tôi. Điều này dẫn đến thông tin được cung cấp của Google trên Monkeyrunner.
bàn phím

Tôi đã thử với "./adb shell Monkey". Nhưng không thể gọi sự kiện chạm
indra

Nó không phải là adb shell monkeymonkeyrunner, mà là một công cụ khác.
bàn phím

0

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


Chào mừng bạn đến với Stack Overflow! Cảm ơn đã đăng câu trả lời của bạn! Hãy đảm bảo đọc kỹ Câu hỏi thường gặp về Tự quảng cáo . Cũng lưu ý rằng bạn bắt buộc phải đăng tuyên bố từ chối trách nhiệm mỗi khi bạn liên kết đến trang web / sản phẩm của chính mình. Tôi đã xóa liên kết. Không thêm lại nó vào mà không thêm một tiết lộ.
Andrew Barber

-6

MotionEvent chỉ được tạo bằng cách chạm vào màn hình.


10
Bạn có thể tạo thủ công bằng cách sử dụng một trong các phương pháp lấy tĩnh của MotionEvent.
azdev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.