studio evento event developer android android-activity touch-event

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??