public boolean dispatchTouchEvent(MotionEvent ev) { if(!onInterceptTouchEvent()){ for(View child : children){ if(child.dispatchTouchEvent(ev)) return true; } } return super.dispatchTouchEvent(ev); }
@SuppressLint("ClickableViewAccessibility") // Not needed for ViewPager @Override public boolean onTouch(View view, @NonNull MotionEvent event) { // ViewPager will steal touch events during settling regardless of // requestDisallowInterceptTouchEvent. We will prevent it here. if (!isTouchInProgress && event.getActionMasked() == MotionEvent.ACTION_DOWN) { isTouchInProgress = true; // Now ViewPager is in drag mode, so it should not intercept DOWN event view.dispatchTouchEvent(event); isTouchInProgress = false; return true; } // User can touch outside of child view, so we will not have a chance to settle // ViewPager. If so, this listener should be called and we will be able to settle // ViewPager manually. settleViewPagerIfFinished((ViewPager) view, event); return true; // We should skip view pager touches to prevent some subtle bugs } };
@Override public boolean dispatchTouchEvent(MotionEvent event) { bindActivity.dispatchTouchEvent(event); return super.dispatchTouchEvent(event); }
@Override public boolean dispatchTouchEvent(@NonNull MotionEvent event) { if (rippleDrawable != null && event.getAction() == MotionEvent.ACTION_DOWN) rippleDrawable.setHotspot(event.getX(), event.getY()); return super.dispatchTouchEvent(event); }
@Override public boolean injectMotionEvent(MotionEvent event) throws InjectEventSecurityException { checkNotNull(event); checkState(Looper.myLooper() == Looper.getMainLooper(), "Expecting to be on main thread!"); loopMainThreadUntilIdle(); // TODO: temporarily restrict to one view root for now getOnlyElement(getViewRoots()).getView().dispatchTouchEvent(event); loopMainThreadUntilIdle(); return true; }
@Override public boolean dispatchTouchEvent(MotionEvent ev) { for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); try { child.dispatchTouchEvent(ev); } catch (Exception e) { e.printStackTrace(); } } return true; } }
handled = mDelegateView.dispatchTouchEvent(event);
@Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: pressed = true; invalidate(); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: pressed = false; invalidate(); break; default: break; } return super.dispatchTouchEvent(event); }
MotionEvent peAdjusted = MotionEvent.obtainNoHistory(pe); peAdjusted.offsetLocation(offsetX, offsetY); consumed |= childView.dispatchTouchEvent(peAdjusted); consumed |= childView.dispatchTouchEvent(event); if (consumed) { break;
@Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: if (isContain(event)) { isPressed = true; startRipple(); } else { getParent().requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: break; } return super.dispatchTouchEvent(event); }
@Test public void testTouchOutsideBounds() { final View view = mock(View.class); when(view.getContext()).thenReturn(RuntimeEnvironment.application); mTouchDelegate.registerTouchExpansion(0, view, new Rect(0, 0, 10, 10)); MotionEvent event = MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 100, 100, 0); mTouchDelegate.onTouchEvent(event); verify(view, never()).dispatchTouchEvent(event); }
@Test public void testDrawingOrder() { final View view1 = mock(View.class); when(view1.getContext()).thenReturn(RuntimeEnvironment.application); when(view1.dispatchTouchEvent(any(MotionEvent.class))) .thenReturn(true); mTouchDelegate.registerTouchExpansion(0, view1, new Rect(0, 0, 10, 10)); final View view2 = mock(View.class); when(view2.getContext()).thenReturn(RuntimeEnvironment.application); when(view2.dispatchTouchEvent(any(MotionEvent.class))) .thenReturn(true); mTouchDelegate.registerTouchExpansion(1, view2, new Rect(0, 0, 10, 10)); MotionEvent event = MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 5, 5, 0); mTouchDelegate.onTouchEvent(event); verify(view1, never()).dispatchTouchEvent(event); verify(view2, times(1)).dispatchTouchEvent(event); } }
@Test public void testUnregister() { final View view = mock(View.class); when(view.getContext()).thenReturn(RuntimeEnvironment.application); mTouchDelegate.registerTouchExpansion(0, view, new Rect(0, 0, 10, 10)); mTouchDelegate.unregisterTouchExpansion(0); MotionEvent event = MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 5, 5, 0); mTouchDelegate.onTouchEvent(event); verify(view, never()).dispatchTouchEvent(event); }
@Test public void dispatchTouchEvent_listensToFalseFromListener() throws Exception { final AtomicBoolean called = new AtomicBoolean(false); view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { called.set(true); return false; } }); MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 12f, 34f, 0); view.dispatchTouchEvent(event); assertThat(shadowOf(view).getLastTouchEvent()).isSameAs(event); assertThat(called.get()).isTrue(); }
@Test public void testTouchWithinBounds() { final View view = mock(View.class); when(view.getContext()).thenReturn(application); when(view.getWidth()).thenReturn(4); when(view.getHeight()).thenReturn(6); mTouchDelegate.registerTouchExpansion(0, view, new Rect(0, 0, 10, 10)); MotionEvent event = obtain( uptimeMillis(), uptimeMillis(), ACTION_DOWN, 5, 5, 0); mTouchDelegate.onTouchEvent(event); verify(view, times(1)).dispatchTouchEvent(event); assertThat(event.getX()).isEqualTo(2f); assertThat(event.getY()).isEqualTo(3f); }
mTouchTarget.dispatchTouchEvent(ev); mTouchTarget.dispatchTouchEvent(event); event.recycle();
@Test public void dispatchTouchEvent_sendsMotionEventToOnTouchEvent() throws Exception { TouchableView touchableView = new TouchableView(context); MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 12f, 34f, 0); touchableView.dispatchTouchEvent(event); assertThat(touchableView.event).isSameAs(event); view.dispatchTouchEvent(event); assertThat(shadowOf(view).getLastTouchEvent()).isSameAs(event); }
cancelEvent.offsetLocation(0, sheetTranslation - getHeight()); cancelEvent.setAction(MotionEvent.ACTION_CANCEL); getSheetView().dispatchTouchEvent(cancelEvent); cancelEvent.recycle(); getSheetView().dispatchTouchEvent(cancelEvent); cancelEvent.recycle(); MotionEvent downEvent = MotionEvent.obtain(event); downEvent.setAction(MotionEvent.ACTION_DOWN); getSheetView().dispatchTouchEvent(downEvent); downEvent.recycle(); setState(State.EXPANDED); getSheetView().dispatchTouchEvent(event); } else { getSheetView().dispatchTouchEvent(event);
tempHeader.dispatchTouchEvent(transformEvent(ev, mMotionHeaderPosition)); tempHeader.invalidate(); tempHeader.postDelayed(new Runnable() { View tempHeader = getHeaderAt(mMotionHeaderPosition); if (tempHeader != null) { if (tempHeader.dispatchTouchEvent(transformEvent(ev, mMotionHeaderPosition))) { mHeaderChildBeingPressed = true; tempHeader.setPressed(true);
mTarget.dispatchTouchEvent(ev); } else { MotionEvent obtain = MotionEvent.obtain(ev); obtain.setAction(MotionEvent.ACTION_DOWN); mDispatchTargetTouchDown = true; mTarget.dispatchTouchEvent(obtain); obtain.setAction(MotionEvent.ACTION_CANCEL); mDispatchTargetTouchDown = false; mTarget.dispatchTouchEvent(obtain); mTarget.dispatchTouchEvent(ev);