MotionEvent Touch simulieren?

E

Extremefall

Ambitioniertes Mitglied
3
Hallo
Ich würde gerne mittels MotionEvent eine Touchscreenberührung simulieren. Dazu soll an Position x,y für a Sekunden die Berührung simuliert werden. Wie mache ich das mittels MotionEvent? Bisher habe ich nur ein MotionEvent Objekt erzeugt.
 
Die Methode aufrufen? :blink:
 
Aber wie heißt die Methode, die ich auf dem MotionEvent Objekt aufrufen muss, um es zu starten?
 
Wieso so kompliziert? Schreibe deine eigene Methode, wo du x und y übergibst. In der MotionEvent Methode rufst du deine eigene auf und beim simulieren auch.
 
Wie kann ich in der MotionEvent Methode meine Methode aufrufen? MotionEvent ist doch die vorgegebene Klasse.
 
Sorry, mein Kopf war schon weiter, als ich geschrieben hatte :D Ich rede vom GestureDetector, TouchListener und die dazugehörigen Klassen. Wenn vom System ein TouchEvent (MotionEvent) getriggert wird, fängst du es hier ab. Da kannst du dann deine eigene Methode aufrufen.
 
Ich weiß leider immer noch nicht, wie ich es machen kann. Hier ist erstmal mein Code:
Code:
 package com.app.myapp;

import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.sax.*;
import android.view.View.OnTouchListener;
public class MainActivity 
extends Activity implements OnTouchListener
{

	public boolean onTouch(View p1, MotionEvent p2)
	{
		// TODO: Implement this method
		
	 Toast toast = Toast.makeText(getApplicationContext(), "View touched",  Toast.LENGTH_LONG);
		toast.show();
		return true;
	}
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
	{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		LinearLayout MainLayout = (LinearLayout)findViewById(R.id.mainlayout);
		MainLayout.setOnTouchListener(li);
		// 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_DOWN, x,  y, metaState);// Dispatch touch event to view
		dispatchTouchEvent(motionEvent);
	
    }
	OnTouchListener li = new OnTouchListener(){

	@Override 
	public boolean onTouch(View view, MotionEvent event) {
		Toast toast = Toast.makeText(getApplicationContext(), "View touched",  Toast.LENGTH_LONG);
		toast.show();
		return true;}
		};
		}
 
Zuletzt bearbeitet:
Ich versuche es mal mit Pseudocode:

class Activity implements OnTouchListener {

public void onCreate() {
// mach was
myMethod(5,7);
}

public void myMethod(int x, int y) {
// tu was
}

public void onTouch(MotionEvent e) {
myMethod(e.getX(), e.getY());
}
}


Ist es jetzt klarer?
 
Ich möchte ohne eigene Interaktion eine Berührung simulieren. Also mittels ,Code soll an position x,y geklickt werden. Dein Pseudocode sieht für mich so aus, als wenn die Interaktion ausgewertet wird (Position der Berührung wird bestimmt).
 
Das war doch nur ein Beispiel. Was genau willst du dann tun? Wenn du mit dem Finger drauf tipps, springt er auch nur in den OnTouchListener. Die Logik, die dort hinterlegt ist, wird einfach verschoben und kann leichter aufgerufen werden.

So wie ich es am Anfang verstanden habe, soll es keinen Unterschied geben, ob die Methode durch ein MotionEvent oder durch den Start der Activity ausgelöst wird.
 
Ich habe folgendes,genau vor:
Ich tippe,auf den Bildschirm
- der Code des OnTouchListeners wird ausgeführt
Der Code soll folgendes,machen:
Ein Tippen auf,den Bildschirm für genau 450ms an Position x,y ausführen.
Nur wie mache ich es mit dem Tippen? Kann man mittels MotionEvent so etwas,simulieren? Das Auslagern kann man ja immer noch machen.
 
ruf doch einfach dein onTouch mit nem entsprechendem MotionEvent auf?

Man kann auch auf high level ebene Events so injecten, als wenn sie vom System kommen würden.. unter 4.1 z.B. so:
Code:
    private void sendTap(float x, float y) {
        long now = SystemClock.uptimeMillis();
        injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, x, y, 0));
        injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, x, y, 0));
    }

    private void injectPointerEvent(MotionEvent event) {
        event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
        InputManager.getInstance().injectInputEvent(event,
                InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
    }
das ist aber keine offizielle api. ;)
Bei dem code musste nur den events unterschiedliche zeiten zuweisen, das kannste dann so an onTouch senden.
 
Das sieht schon sehr gut aus. Aber welchen InputManager verwendest du? Ich habe den aus dem API Level 16 probiert. Dort fehlt aber die Methode getInstance(). Und einen anderen finde ich leider nicht.

Also bisher sieht es so aus:
Code:
package com.example.simulation;
import java.io.IOException;

import com.android.monkeyrunner.MonkeyDevice;
import com.android.monkeyrunner.MonkeyRunner;

import android.hardware.input.InputManager;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.app.Activity;
import android.util.Log;
import android.view.InputDevice;
import android.view.Menu;
import android.view.MotionEvent;
public class MainActivity extends Activity {
    private static InputManager instance = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
        
    }
   
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    private void sendTap(float x, float y) {
        long now = SystemClock.uptimeMillis();
        injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, x, y, 0));
        injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, x, y, 0));
    }

    private void injectPointerEvent(MotionEvent event) {
        event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
        Log.i("Input", "InjectPointerEvent: " + event);
        injectInputEvent(event, 2);
                
    }
}

Wie ruft man denn die Methode injectInputEvent auf? Die Methode gibt es in der API Level 16 nicht.
 

Ähnliche Themen

M
Antworten
3
Aufrufe
704
swa00
swa00
R
Antworten
2
Aufrufe
701
swa00
swa00
xunling
Antworten
1
Aufrufe
945
swa00
swa00
Zurück
Oben Unten