android - developer - Detecta cada evento táctil sin anular el dispatchTouchEvent()?
touch event android developer (1)
Responder como esto puede ser útil para otros. La respuesta será útil para la biblioteca que requiere interceptar eventos táctiles.
Si no desea anular el método de actividad dispatchTouchEvent () ( Imp en caso de que esté codificando para la biblioteca ), entonces podemos usar la clase Window.Callback. Cree su propia implementación de Window.Callback como código a continuación y luego configúrelo como una devolución de llamada al objeto Window desde su actividad.
Haga lo que se muestra en el siguiente fragmento de código para la instancia de contexto de actividad que obtiene.
//set Window.Callback for getting touch event
final Window win = context.getWindow();
final Window.Callback localCallback = win.getCallback();
win.setCallback(new MyWindowCallback(localCallback));
La clase MyWindowCallback será como:
Obtendrá TouchEvent en dispatchTouchEventMethod () de MyWindowCallback, donde puede usarlos según sea necesario.
import android.annotation.SuppressLint;
import android.util.Log;
import android.view.ActionMode;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
public class MyWindowCallback implements Window.Callback{
Window.Callback localCallback;
public MyWindowCallback(Window.Callback localCallback) {
this.localCallback = localCallback;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return localCallback.dispatchKeyEvent(event);
}
@SuppressLint("NewApi")
@Override
public boolean dispatchKeyShortcutEvent(KeyEvent event) {
return localCallback.dispatchKeyShortcutEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
//YOU WILL GET TOUCH EVENTS HERE>> USE AS REQUIRED>>
return localCallback.dispatchTouchEvent(event);
}
@Override
public boolean dispatchTrackballEvent(MotionEvent event) {
return localCallback.dispatchTrackballEvent(event);
}
@SuppressLint("NewApi")
@Override
public boolean dispatchGenericMotionEvent(MotionEvent event) {
return localCallback.dispatchGenericMotionEvent(event);
}
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
return localCallback.dispatchPopulateAccessibilityEvent(event);
}
@Override
public View onCreatePanelView(int featureId) {
return localCallback.onCreatePanelView(featureId);
}
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
return localCallback.onCreatePanelMenu(featureId, menu);
}
@Override
public boolean onPreparePanel(int featureId, View view, Menu menu) {
boolean ret = localCallback.onPreparePanel(featureId, view, menu);
return ret;
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
return localCallback.onMenuOpened(featureId, menu);
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
return localCallback.onMenuItemSelected(featureId, item);
}
@Override
public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) {
localCallback.onWindowAttributesChanged(attrs);
}
@Override
public void onContentChanged() {
localCallback.onContentChanged();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
Log.d("","ttest onfocus changed called");
localCallback.onWindowFocusChanged(hasFocus);
}
@Override
public void onAttachedToWindow() {
localCallback.onAttachedToWindow();
}
@Override
public void onDetachedFromWindow() {
localCallback.onDetachedFromWindow();
}
@Override
public void onPanelClosed(int featureId, Menu menu) {
localCallback.onPanelClosed(featureId, menu);
}
@Override
public boolean onSearchRequested() {
return localCallback.onSearchRequested();
}
@SuppressLint("NewApi")
@Override
public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
return localCallback.onWindowStartingActionMode(callback);
}
@SuppressLint("NewApi")
@Override
public void onActionModeStarted(ActionMode mode) {
localCallback.onActionModeStarted(mode);
}
@SuppressLint("NewApi")
@Override
public void onActionModeFinished(ActionMode mode) {
localCallback.onActionModeFinished(mode);
}
}
Estoy desarrollando una biblioteca de Android que necesita rastrear todos los eventos táctiles en la aplicación que la usa. Por ahora, los usuarios deben anular el dispatchTouchEvent()
de sus actividades en cada una de sus actividades. Como se muestra abajo
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
MyLib.dispatchTouchEvent(event);
return super.dispatchTouchEvent(event);
}
Pero Appsee detecta eventos táctiles con Appsee.start(“key”);
en el método onCreate integrado en la primera actividad donde se inicia la aplicación. Cómo es esto posible. ¿¿Alguna ayuda??