X ve Y koordinatlarını manuel olarak verirken Android ile bir dokunma olayını nasıl simüle edebilirim?
X ve Y koordinatlarını manuel olarak verirken Android ile bir dokunma olayını nasıl simüle edebilirim?
Yanıtlar:
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?
downTime
kullanıcının ekrana dokunduğu zaman iken eventTime
bu 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.
İş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)
MonkeyDevice.DOWN_AND_UP
yerine kullanmalısınız 'DOWN_AND_UP'
. ( DOWN_AND_UP
varsayılandır, dolayısıyla kodunuz hala çalışır)
UP
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
Açıkça anladıysam, bunu programlı olarak yapmak istersiniz. Ardından, onTouchEvent yöntemini kullanabilir ve ihtiyacınız olan koordinatlarla View
bir oluşturabilirsiniz MotionEvent
.
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.
adb shell monkey
o değil monkeyrunner
.
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