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.