Skip to content Skip to sidebar Skip to footer

Detect Every Touch Events Without Overriding Dispatchtouchevent()?

I am developing Android library which needs to track all touch events on app that uses it. For now Users should override theirs Activity’s dispatchTouchEvent() on their’s every

Solution 1:

Answering as this may be helpful to others. Answer will be helpful for library that requires to intercept touch events.

If you dont want to overrride dispatchTouchEvent() (Imp in case you are coding for library) method of activity then we can use Window.Callback class. Create your own implementation of Window.Callback as code below and then set it as callback to Window object from your activity.

Do as in below code snippet for Activity context instance you get.

//set Window.Callback for getting touch eventfinalWindowwin= context.getWindow();
        final Window.CallbacklocalCallback= win.getCallback();
        win.setCallback(newMyWindowCallback(localCallback));

Class MyWindowCallback will be as :

You will get TouchEvent on dispatchTouchEventMethod() of MyWindowCallback where you can use these as required.

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;

publicclassMyWindowCallbackimplementsWindow.Callback{

    Window.Callback localCallback;

    publicMyWindowCallback(Window.Callback localCallback) {
        this.localCallback = localCallback;
    }

    @OverridepublicbooleandispatchKeyEvent(KeyEvent event) {
        return localCallback.dispatchKeyEvent(event);
    }

    @SuppressLint("NewApi")
    @OverridepublicbooleandispatchKeyShortcutEvent(KeyEvent event) {
        return localCallback.dispatchKeyShortcutEvent(event);
    }

    @OverridepublicbooleandispatchTouchEvent(MotionEvent event) {
        //YOU WILL GET TOUCH EVENTS HERE>> USE AS REQUIRED>>return localCallback.dispatchTouchEvent(event);
    }

    @OverridepublicbooleandispatchTrackballEvent(MotionEvent event) {
        return localCallback.dispatchTrackballEvent(event);
    }

    @SuppressLint("NewApi")
    @OverridepublicbooleandispatchGenericMotionEvent(MotionEvent event) {
        return localCallback.dispatchGenericMotionEvent(event);
    }

    @OverridepublicbooleandispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
        return localCallback.dispatchPopulateAccessibilityEvent(event);
    }

    @OverridepublicViewonCreatePanelView(int featureId) {
        return localCallback.onCreatePanelView(featureId);
    }

    @OverridepublicbooleanonCreatePanelMenu(int featureId, Menu menu) {
        return localCallback.onCreatePanelMenu(featureId, menu);
    }

    @OverridepublicbooleanonPreparePanel(int featureId, View view, Menu menu) {
        boolean ret = localCallback.onPreparePanel(featureId, view, menu);
        return ret;
    }

    @OverridepublicbooleanonMenuOpened(int featureId, Menu menu) {
        return localCallback.onMenuOpened(featureId, menu);
    }

    @OverridepublicbooleanonMenuItemSelected(int featureId, MenuItem item) {
        return localCallback.onMenuItemSelected(featureId, item);
    }

    @OverridepublicvoidonWindowAttributesChanged(WindowManager.LayoutParams attrs) {
        localCallback.onWindowAttributesChanged(attrs);
    }

    @OverridepublicvoidonContentChanged() {
        localCallback.onContentChanged();
    }

    @OverridepublicvoidonWindowFocusChanged(boolean hasFocus) {
        Log.d("","ttest onfocus changed called");
        localCallback.onWindowFocusChanged(hasFocus);
    }

    @OverridepublicvoidonAttachedToWindow() {
        localCallback.onAttachedToWindow();
    }

    @OverridepublicvoidonDetachedFromWindow() {
        localCallback.onDetachedFromWindow();
    }

    @OverridepublicvoidonPanelClosed(int featureId, Menu menu) {
        localCallback.onPanelClosed(featureId, menu);
    }

    @OverridepublicbooleanonSearchRequested() {
        return localCallback.onSearchRequested();
    }

    @SuppressLint("NewApi")
    @OverridepublicActionModeonWindowStartingActionMode(ActionMode.Callback callback) {
        return localCallback.onWindowStartingActionMode(callback);
    }

    @SuppressLint("NewApi")
    @OverridepublicvoidonActionModeStarted(ActionMode mode) {
        localCallback.onActionModeStarted(mode);

    }

    @SuppressLint("NewApi")
    @OverridepublicvoidonActionModeFinished(ActionMode mode) {
        localCallback.onActionModeFinished(mode);

    }
}

Post a Comment for "Detect Every Touch Events Without Overriding Dispatchtouchevent()?"