Android'de bir dokunma olayını nasıl simüle edebilirim?


101

X ve Y koordinatlarını manuel olarak verirken Android ile bir dokunma olayını nasıl simüle edebilirim?


1
Aşağıda bazı uygulanabilir cevaplar alıyorsunuz, sadece küçük değişiklikler yapabileceğiniz uygulamalarda çalışacaklarını unutmayın. Değiştiremeyeceğiniz diğer uygulamalar için, olayları enjekte etmek için köklü bir platforma ihtiyacınız olacaktır.
— Chris Stratton

Her 10 saniyede x, y'ye dokunup küçültecek bir uygulama yapmak mümkün mü, ancak x, y'ye dokunmaya devam edilebilir mi?
— Dr.jacky

Cevabımı kök gereksinimleri olmadan kontrol edin. :)
— Anand Varkey Philips

Yanıtlar:


110

Valentin Rocher'in yöntemi, görüşünüzü genişletirseniz işe yarar, ancak bir olay dinleyicisi kullanıyorsanız, şunu kullanın:

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);

Bir MotionEvent nesnesi edinme hakkında daha fazla bilgi için işte mükemmel bir cevap: Android: MotionEvent nasıl oluşturulur?


1
İyi cevap, ancak Android'e yeni başlayan biri olarak OnTouchListener kafamı karıştırdı. Simülasyon için dinleyicinin gerekli olmadığını şimdi anlıyorum. Gerekli olan tek şey, kodunuzun ikinci yarısındaki MotionEvent'dir.
— user1532390

Neden eventTime'a 100 milisaniye ekliyorsunuz? DownTime ve eventTime aynıysa çalışmaz mı?
— tu-Reinstate Monica-dor duh

2
@tudor - Yalnızca gerçek bir dokunuşu simüle etmek için. downTimekullanıcının ekrana dokunduğu zaman iken eventTimebu durumda kullanıcının parmağını yukarı kaldırdığı zaman olacaktır ( ACTION_UP). Her ikisi de aynı ise yine de çalışıp çalışmayacağından emin değilim. Test edebilir ve sonuçlarınızı gönderebilirsiniz.
— azdev

Görünüm nesnesini nasıl bildirmeliyim?
— TheLogicGuy

ok .. sola, sağa, yukarı ve aşağı kaydırma hareketine ne dersiniz .. ACTION_MOVE kullanarak bunu nasıl yapabilirsiniz?
— Ramesh_D

24

İşte bir uygulamaya dokunma ve sürükleme gönderen bir monkeyrunner betiği. Bunu, uygulamamın hızlı tekrarlayan kaydırma hareketlerini işleyebildiğini test etmek için kullanıyorum.

# 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
Bunun MonkeyDevice.DOWN_AND_UPyerine kullanmalısınız 'DOWN_AND_UP'. ( DOWN_AND_UPvarsayılandır, dolayısıyla kodunuz hala çalışır)
— ValarDohaeris

Başka bir cihazda UP
— denendi

Bunu test dışı bir sınıfta kullanabilir miyim?
— Dania

20

dokunma olayını simüle etmek için adb Shell Komutlarını kullanın

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, adb komutunu kullanarak sıkıştırarak yakınlaştırmayı simüle etmek istersem ve sıkıştırma yakınlaştırma koordinatlarım varsa
— nikhil84

1

Açıkça anladıysam, bunu programlı olarak yapmak istersiniz. Ardından, onTouchEvent yöntemini kullanabilir ve ihtiyacınız olan koordinatlarla Viewbir oluşturabilirsiniz MotionEvent.


1

Yeni maymun koşucusuna bir şans vermelisin . Belki bu, sorunlarınızı çözebilir. İçine test için anahtar kodlar koyarsınız, belki dokunma olayları da mümkündür.


1
Lütfen monkeyrunner'ı nasıl kuracağımı bana bildirin. adb monkeyrunner'ı tanımıyor
— indira

Adb'nin ui excersiser maymunu ile ilgili değildir. Monkeyrunner'ı adt'nin 9. revizyonunun araçlar dizininde bulacaksınız.
— keyboardsurfer

Ayrıca cevabımda verdiğim bağlantıya bakın. Bu, Google'ın maymun koşucu hakkında sağladığı bilgilere götürür.
— klavyede

"./Adb kabuk maymunu" ile denedim. Ama dokunma olayını çağıramadı
— indira

Farklı bir araç olan adb shell monkeyo değil monkeyrunner.
— keyboardsurfer

0

Monkey Script'i kullanırken DispatchPress'in (KEYCODE_BACK) gerçekten berbat bir şey yapmadığını fark ettim. Çoğu durumda, bunun nedeni Faaliyetin Anahtar olayını tüketmemesidir. Bu sorunun çözümü, bir dizide maymun betiği ve adb kabuk giriş komutunun bir karışımını kullanmaktır.

1 Maymun komut dosyası kullanmak harika zamanlama kontrolü sağladı. Etkinlik için belirli bir saniye bekleyin ve engelleyen bir adb çağrısıdır.
2 Son olarak, adb shell girişi göndermek keyevent 4 çalışan APK'yi sonlandıracaktır.

ÖRNEĞİN

adb kabuk maymun -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb kabuk girdisi keyevent 4


Stack Overflow'a hoş geldiniz! Cevabınızı gönderdiğiniz için teşekkürler! Lütfen Kendini Tanıtma ile ilgili SSS'yi dikkatlice okuduğunuzdan emin olun . Ayrıca , kendi sitenize / ürününüze her bağlandığınızda bir sorumluluk reddi beyanı göndermeniz gerektiğini unutmayın . Bağlantıyı kaldırdım. Bir açıklama eklemeden de tekrar eklemeyin.
— Andrew Barber

-6

MotionEvent yalnızca ekrana dokunarak oluşturulur.


10
MotionEvent'in statik elde etme yöntemlerinden birini kullanarak manuel olarak bir tane oluşturabilirsiniz.
— azdev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.