示例#1
0
 protected internal override bool dispatchHoverEvent(android.view.MotionEvent @event
                                                     )
 {
     // Don't allow children to hover; we want this to be treated as a single component.
     return(onHoverEvent(@event));
 }
示例#2
0
        internal virtual bool onTouchEvent(android.view.MotionEvent me)
        {
            if (mState == STATE_NONE)
            {
                return(false);
            }
            int action = me.getAction();

            if (action == android.view.MotionEvent.ACTION_DOWN)
            {
                if (isPointInside(me.getX(), me.getY()))
                {
                    if (!mList.isInScrollingContainer())
                    {
                        beginDrag();
                        return(true);
                    }
                    mInitialTouchY = me.getY();
                    startPendingDrag();
                }
            }
            else
            {
                if (action == android.view.MotionEvent.ACTION_UP)
                {
                    // don't add ACTION_CANCEL here
                    if (mPendingDrag)
                    {
                        // Allow a tap to scroll.
                        beginDrag();
                        int viewHeight = mList.getHeight();
                        // Jitter
                        int newThumbY = (int)me.getY() - mThumbH + 10;
                        if (newThumbY < 0)
                        {
                            newThumbY = 0;
                        }
                        else
                        {
                            if (newThumbY + mThumbH > viewHeight)
                            {
                                newThumbY = viewHeight - mThumbH;
                            }
                        }
                        mThumbY = newThumbY;
                        scrollTo((float)mThumbY / (viewHeight - mThumbH));
                        cancelPendingDrag();
                    }
                    // Will hit the STATE_DRAGGING check below
                    if (mState == STATE_DRAGGING)
                    {
                        if (mList != null)
                        {
                            // ViewGroup does the right thing already, but there might
                            // be other classes that don't properly reset on touch-up,
                            // so do this explicitly just in case.
                            mList.requestDisallowInterceptTouchEvent(false);
                            mList.reportScrollStateChange(android.widget.AbsListView.OnScrollListenerClass.SCROLL_STATE_IDLE
                                                          );
                        }
                        setState(STATE_VISIBLE);
                        android.os.Handler handler = mHandler;
                        handler.removeCallbacks(mScrollFade);
                        if (!mAlwaysShow)
                        {
                            handler.postDelayed(mScrollFade, 1000);
                        }
                        mList.invalidate();
                        return(true);
                    }
                }
                else
                {
                    if (action == android.view.MotionEvent.ACTION_MOVE)
                    {
                        if (mPendingDrag)
                        {
                            float y = me.getY();
                            if (System.Math.Abs(y - mInitialTouchY) > mScaledTouchSlop)
                            {
                                setState(STATE_DRAGGING);
                                if (mListAdapter == null && mList != null)
                                {
                                    getSectionsFromIndexer();
                                }
                                if (mList != null)
                                {
                                    mList.requestDisallowInterceptTouchEvent(true);
                                    mList.reportScrollStateChange(android.widget.AbsListView.OnScrollListenerClass.SCROLL_STATE_TOUCH_SCROLL
                                                                  );
                                }
                                cancelFling();
                                cancelPendingDrag();
                            }
                        }
                        // Will hit the STATE_DRAGGING check below
                        if (mState == STATE_DRAGGING)
                        {
                            int viewHeight = mList.getHeight();
                            // Jitter
                            int newThumbY = (int)me.getY() - mThumbH + 10;
                            if (newThumbY < 0)
                            {
                                newThumbY = 0;
                            }
                            else
                            {
                                if (newThumbY + mThumbH > viewHeight)
                                {
                                    newThumbY = viewHeight - mThumbH;
                                }
                            }
                            if (System.Math.Abs(mThumbY - newThumbY) < 2)
                            {
                                return(true);
                            }
                            mThumbY = newThumbY;
                            // If the previous scrollTo is still pending
                            if (mScrollCompleted)
                            {
                                scrollTo((float)mThumbY / (viewHeight - mThumbH));
                            }
                            return(true);
                        }
                    }
                    else
                    {
                        if (action == android.view.MotionEvent.ACTION_CANCEL)
                        {
                            cancelPendingDrag();
                        }
                    }
                }
            }
            return(false);
        }
 public virtual void addPointerEvent(android.view.MotionEvent @event)
 {
     throw new System.NotImplementedException();
 }
示例#4
0
 public override bool onInterceptTouchEvent(android.view.MotionEvent ev)
 {
     return(mIsTransitioning || base.onInterceptTouchEvent(ev));
 }
示例#5
0
		private void setContext(android.view.MotionEvent curr)
		{
			if (mCurrEvent != null)
			{
				mCurrEvent.recycle();
			}
			mCurrEvent = android.view.MotionEvent.obtain(curr);
			mCurrLen = -1;
			mPrevLen = -1;
			mScaleFactor = -1;
			android.view.MotionEvent prev = mPrevEvent;
			int prevIndex0 = prev.findPointerIndex(mActiveId0);
			int prevIndex1 = prev.findPointerIndex(mActiveId1);
			int currIndex0 = curr.findPointerIndex(mActiveId0);
			int currIndex1 = curr.findPointerIndex(mActiveId1);
			if (prevIndex0 < 0 || prevIndex1 < 0 || currIndex0 < 0 || currIndex1 < 0)
			{
				mInvalidGesture = true;
				android.util.Log.e(TAG, "Invalid MotionEvent stream detected.", new System.Exception
					());
				if (mGestureInProgress)
				{
					mListener.onScaleEnd(this);
				}
				return;
			}
			float px0 = prev.getX(prevIndex0);
			float py0 = prev.getY(prevIndex0);
			float px1 = prev.getX(prevIndex1);
			float py1 = prev.getY(prevIndex1);
			float cx0 = curr.getX(currIndex0);
			float cy0 = curr.getY(currIndex0);
			float cx1 = curr.getX(currIndex1);
			float cy1 = curr.getY(currIndex1);
			float pvx = px1 - px0;
			float pvy = py1 - py0;
			float cvx = cx1 - cx0;
			float cvy = cy1 - cy0;
			mPrevFingerDiffX = pvx;
			mPrevFingerDiffY = pvy;
			mCurrFingerDiffX = cvx;
			mCurrFingerDiffY = cvy;
			mFocusX = cx0 + cvx * 0.5f;
			mFocusY = cy0 + cvy * 0.5f;
			mTimeDelta = curr.getEventTime() - prev.getEventTime();
			mCurrPressure = curr.getPressure(currIndex0) + curr.getPressure(currIndex1);
			mPrevPressure = prev.getPressure(prevIndex0) + prev.getPressure(prevIndex1);
		}
示例#6
0
 public static global::android.view.MotionEvent obtainNoHistory(android.view.MotionEvent arg0)
 {
     global::MonoJavaBridge.JNIEnv @__env = global::MonoJavaBridge.JNIEnv.ThreadEnv;
     return(global::MonoJavaBridge.JavaBridge.WrapJavaObject(@__env.CallStaticObjectMethod(android.view.MotionEvent.staticClass, global::android.view.MotionEvent._obtainNoHistory8937, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0))) as android.view.MotionEvent);
 }
示例#7
0
 public override bool onSingleTapUp(android.view.MotionEvent e)
 {
     throw new System.NotImplementedException();
 }
示例#8
0
 void android.view.inputmethod.InputMethodSession.dispatchTrackballEvent(int arg0, android.view.MotionEvent arg1, android.view.inputmethod.InputMethodSession_EventCallback arg2)
 {
     global::MonoJavaBridge.JNIEnv @__env = global::MonoJavaBridge.JNIEnv.ThreadEnv;
     if (!IsClrObject)
     {
         @__env.CallVoidMethod(this.JvmHandle, global::android.view.inputmethod.InputMethodSession_._dispatchTrackballEvent10253, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg1), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg2));
     }
     else
     {
         @__env.CallNonVirtualVoidMethod(this.JvmHandle, global::android.view.inputmethod.InputMethodSession_.staticClass, global::android.view.inputmethod.InputMethodSession_._dispatchTrackballEvent10253, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg1), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg2));
     }
 }
		public override bool onTouch(View v, MotionEvent ev)
		{

			KeyButton k = (KeyButton) v;

			try
			{
			switch (ev.Action)
			{
				case MotionEvent.ACTION_DOWN:
					if (mService != null && mService.get() != null)
					{
					MainActivity.this.mService.get().sendNoteOn(k.Note, k.Velocity);
					}
					break;
				case MotionEvent.ACTION_UP:
					if (mService != null && mService.get() != null)
					{
					MainActivity.this.mService.get().sendNoteOff(k.Note, k.Velocity);
					}
					break;
			}
			}
			catch (System.NullReferenceException)
			{
				;
			}

			return false;
		}
示例#10
0
 bool android.view.GestureDetector.OnDoubleTapListener.onSingleTapConfirmed(android.view.MotionEvent arg0)
 {
     global::MonoJavaBridge.JNIEnv @__env = global::MonoJavaBridge.JNIEnv.ThreadEnv;
     if (!IsClrObject)
     {
         return(@__env.CallBooleanMethod(this.JvmHandle, global::android.view.GestureDetector.OnDoubleTapListener_._onSingleTapConfirmed8728, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0)));
     }
     else
     {
         return(@__env.CallNonVirtualBooleanMethod(this.JvmHandle, global::android.view.GestureDetector.OnDoubleTapListener_.staticClass, global::android.view.GestureDetector.OnDoubleTapListener_._onSingleTapConfirmed8728, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0)));
     }
 }
示例#11
0
        public override bool onTouchEvent(android.view.MotionEvent @event)
        {
            if (!mIsUserSeekable || !isEnabled())
            {
                return(false);
            }
            switch (@event.getAction())
            {
            case android.view.MotionEvent.ACTION_DOWN:
            {
                if (isInScrollingContainer())
                {
                    mTouchDownX = @event.getX();
                }
                else
                {
                    setPressed(true);
                    if (mThumb != null)
                    {
                        invalidate(mThumb.getBounds());
                    }
                    // This may be within the padding region
                    onStartTrackingTouch();
                    trackTouchEvent(@event);
                    attemptClaimDrag();
                }
                break;
            }

            case android.view.MotionEvent.ACTION_MOVE:
            {
                if (mIsDragging)
                {
                    trackTouchEvent(@event);
                }
                else
                {
                    float x = @event.getX();
                    if (System.Math.Abs(x - mTouchDownX) > mScaledTouchSlop)
                    {
                        setPressed(true);
                        if (mThumb != null)
                        {
                            invalidate(mThumb.getBounds());
                        }
                        // This may be within the padding region
                        onStartTrackingTouch();
                        trackTouchEvent(@event);
                        attemptClaimDrag();
                    }
                }
                break;
            }

            case android.view.MotionEvent.ACTION_UP:
            {
                if (mIsDragging)
                {
                    trackTouchEvent(@event);
                    onStopTrackingTouch();
                    setPressed(false);
                }
                else
                {
                    // Touch up when we never crossed the touch slop threshold should
                    // be interpreted as a tap-seek to that location.
                    onStartTrackingTouch();
                    trackTouchEvent(@event);
                    onStopTrackingTouch();
                }
                // ProgressBar doesn't know to repaint the thumb drawable
                // in its inactive state when the touch stops (because the
                // value has not apparently changed)
                invalidate();
                break;
            }

            case android.view.MotionEvent.ACTION_CANCEL:
            {
                if (mIsDragging)
                {
                    onStopTrackingTouch();
                    setPressed(false);
                }
                invalidate();
                // see above explanation
                break;
            }
            }
            return(true);
        }
示例#12
0
 bool android.view.GestureDetector.OnGestureListener.onFling(android.view.MotionEvent arg0, android.view.MotionEvent arg1, float arg2, float arg3)
 {
     global::MonoJavaBridge.JNIEnv @__env = global::MonoJavaBridge.JNIEnv.ThreadEnv;
     if (!IsClrObject)
     {
         return(@__env.CallBooleanMethod(this.JvmHandle, global::android.view.GestureDetector.OnGestureListener_._onFling8734, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg1), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg2), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg3)));
     }
     else
     {
         return(@__env.CallNonVirtualBooleanMethod(this.JvmHandle, global::android.view.GestureDetector.OnGestureListener_.staticClass, global::android.view.GestureDetector.OnGestureListener_._onFling8734, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg1), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg2), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg3)));
     }
 }
示例#13
0
 public override bool onTrackballEvent(android.view.MotionEvent ev)
 {
     throw new System.NotImplementedException();
 }
 public override void dispatchTrackballEvent(int seq, android.view.MotionEvent @event
                                             , [email protected] callback)
 {
     throw new System.NotImplementedException();
 }
示例#15
0
 public override bool onTouchEvent(android.view.MotionEvent @event)
 {
     throw new System.NotImplementedException();
 }
示例#16
0
        /// <summary>Checks a trackball event.</summary>
        /// <remarks>Checks a trackball event.</remarks>
        /// <param name="event">The event.</param>
        /// <param name="nestingLevel">
        /// The nesting level: 0 if called from the base class,
        /// or 1 from a subclass.  If the event was already checked by this consistency verifier
        /// at a higher nesting level, it will not be checked again.  Used to handle the situation
        /// where a subclass dispatching method delegates to its superclass's dispatching method
        /// and both dispatching methods call into the consistency verifier.
        /// </param>
        public void onTrackballEvent(android.view.MotionEvent @event, int nestingLevel)
        {
            if (!startEvent(@event, nestingLevel, EVENT_TYPE_TRACKBALL))
            {
                return;
            }
            try
            {
                ensureMetaStateIsNormalized(@event.getMetaState());
                int action = @event.getAction();
                int source = @event.getSource();
                if ((source & android.view.InputDevice.SOURCE_CLASS_TRACKBALL) != 0)
                {
                    switch (action)
                    {
                    case android.view.MotionEvent.ACTION_DOWN:
                    {
                        if (mTrackballDown && !mTrackballUnhandled)
                        {
                            problem("ACTION_DOWN but trackball is already down.");
                        }
                        else
                        {
                            mTrackballDown      = true;
                            mTrackballUnhandled = false;
                        }
                        ensureHistorySizeIsZeroForThisAction(@event);
                        ensurePointerCountIsOneForThisAction(@event);
                        break;
                    }

                    case android.view.MotionEvent.ACTION_UP:
                    {
                        if (!mTrackballDown)
                        {
                            problem("ACTION_UP but trackball is not down.");
                        }
                        else
                        {
                            mTrackballDown      = false;
                            mTrackballUnhandled = false;
                        }
                        ensureHistorySizeIsZeroForThisAction(@event);
                        ensurePointerCountIsOneForThisAction(@event);
                        break;
                    }

                    case android.view.MotionEvent.ACTION_MOVE:
                    {
                        ensurePointerCountIsOneForThisAction(@event);
                        break;
                    }

                    default:
                    {
                        problem("Invalid action " + android.view.MotionEvent.actionToString(action) + " for trackball event."
                                );
                        break;
                    }
                    }
                    if (mTrackballDown && @event.getPressure() <= 0)
                    {
                        problem("Trackball is down but pressure is not greater than 0.");
                    }
                    else
                    {
                        if (!mTrackballDown && @event.getPressure() != 0)
                        {
                            problem("Trackball is up but pressure is not equal to 0.");
                        }
                    }
                }
                else
                {
                    problem("Source was not SOURCE_CLASS_TRACKBALL.");
                }
            }
            finally
            {
                finishEvent();
            }
        }
示例#17
0
 public virtual void dispatchTrackballEvent(int seq, android.view.MotionEvent @event
                                            , android.view.inputmethod.InputMethodSessionClass.EventCallback callback)
 {
     throw new System.NotImplementedException();
 }
示例#18
0
        /// <summary>Checks a touch event.</summary>
        /// <remarks>Checks a touch event.</remarks>
        /// <param name="event">The event.</param>
        /// <param name="nestingLevel">
        /// The nesting level: 0 if called from the base class,
        /// or 1 from a subclass.  If the event was already checked by this consistency verifier
        /// at a higher nesting level, it will not be checked again.  Used to handle the situation
        /// where a subclass dispatching method delegates to its superclass's dispatching method
        /// and both dispatching methods call into the consistency verifier.
        /// </param>
        public void onTouchEvent(android.view.MotionEvent @event, int nestingLevel)
        {
            if (!startEvent(@event, nestingLevel, EVENT_TYPE_TOUCH))
            {
                return;
            }
            int  action    = @event.getAction();
            bool newStream = action == android.view.MotionEvent.ACTION_DOWN || action == android.view.MotionEvent
                             .ACTION_CANCEL;

            if (newStream && (mTouchEventStreamIsTainted || mTouchEventStreamUnhandled))
            {
                mTouchEventStreamIsTainted = false;
                mTouchEventStreamUnhandled = false;
                mTouchEventStreamPointers  = 0;
            }
            if (mTouchEventStreamIsTainted)
            {
                @event.setTainted(true);
            }
            try
            {
                ensureMetaStateIsNormalized(@event.getMetaState());
                int deviceId = @event.getDeviceId();
                int source   = @event.getSource();
                if (!newStream && mTouchEventStreamDeviceId != -1 && (mTouchEventStreamDeviceId !=
                                                                      deviceId || mTouchEventStreamSource != source))
                {
                    problem("Touch event stream contains events from multiple sources: " + "previous device id "
                            + mTouchEventStreamDeviceId + ", previous source " + Sharpen.Util.IntToHexString
                                (mTouchEventStreamSource) + ", new device id " + deviceId + ", new source " + Sharpen.Util.IntToHexString
                                (source));
                }
                mTouchEventStreamDeviceId = deviceId;
                mTouchEventStreamSource   = source;
                int pointerCount = @event.getPointerCount();
                if ((source & android.view.InputDevice.SOURCE_CLASS_POINTER) != 0)
                {
                    switch (action)
                    {
                    case android.view.MotionEvent.ACTION_DOWN:
                    {
                        if (mTouchEventStreamPointers != 0)
                        {
                            problem("ACTION_DOWN but pointers are already down.  " + "Probably missing ACTION_UP from previous gesture."
                                    );
                        }
                        ensureHistorySizeIsZeroForThisAction(@event);
                        ensurePointerCountIsOneForThisAction(@event);
                        mTouchEventStreamPointers = 1 << @event.getPointerId(0);
                        break;
                    }

                    case android.view.MotionEvent.ACTION_UP:
                    {
                        ensureHistorySizeIsZeroForThisAction(@event);
                        ensurePointerCountIsOneForThisAction(@event);
                        mTouchEventStreamPointers  = 0;
                        mTouchEventStreamIsTainted = false;
                        break;
                    }

                    case android.view.MotionEvent.ACTION_MOVE:
                    {
                        int expectedPointerCount = Sharpen.Util.IntGetBitCount(mTouchEventStreamPointers);
                        if (pointerCount != expectedPointerCount)
                        {
                            problem("ACTION_MOVE contained " + pointerCount + " pointers but there are currently "
                                    + expectedPointerCount + " pointers down.");
                            mTouchEventStreamIsTainted = true;
                        }
                        break;
                    }

                    case android.view.MotionEvent.ACTION_CANCEL:
                    {
                        mTouchEventStreamPointers  = 0;
                        mTouchEventStreamIsTainted = false;
                        break;
                    }

                    case android.view.MotionEvent.ACTION_OUTSIDE:
                    {
                        if (mTouchEventStreamPointers != 0)
                        {
                            problem("ACTION_OUTSIDE but pointers are still down.");
                        }
                        ensureHistorySizeIsZeroForThisAction(@event);
                        ensurePointerCountIsOneForThisAction(@event);
                        mTouchEventStreamIsTainted = false;
                        break;
                    }

                    default:
                    {
                        int actionMasked = @event.getActionMasked();
                        int actionIndex  = @event.getActionIndex();
                        if (actionMasked == android.view.MotionEvent.ACTION_POINTER_DOWN)
                        {
                            if (mTouchEventStreamPointers == 0)
                            {
                                problem("ACTION_POINTER_DOWN but no other pointers were down.");
                                mTouchEventStreamIsTainted = true;
                            }
                            if (actionIndex < 0 || actionIndex >= pointerCount)
                            {
                                problem("ACTION_POINTER_DOWN index is " + actionIndex + " but the pointer count is "
                                        + pointerCount + ".");
                                mTouchEventStreamIsTainted = true;
                            }
                            else
                            {
                                int id    = @event.getPointerId(actionIndex);
                                int idBit = 1 << id;
                                if ((mTouchEventStreamPointers & idBit) != 0)
                                {
                                    problem("ACTION_POINTER_DOWN specified pointer id " + id + " which is already down."
                                            );
                                    mTouchEventStreamIsTainted = true;
                                }
                                else
                                {
                                    mTouchEventStreamPointers |= idBit;
                                }
                            }
                            ensureHistorySizeIsZeroForThisAction(@event);
                        }
                        else
                        {
                            if (actionMasked == android.view.MotionEvent.ACTION_POINTER_UP)
                            {
                                if (actionIndex < 0 || actionIndex >= pointerCount)
                                {
                                    problem("ACTION_POINTER_UP index is " + actionIndex + " but the pointer count is "
                                            + pointerCount + ".");
                                    mTouchEventStreamIsTainted = true;
                                }
                                else
                                {
                                    int id    = @event.getPointerId(actionIndex);
                                    int idBit = 1 << id;
                                    if ((mTouchEventStreamPointers & idBit) == 0)
                                    {
                                        problem("ACTION_POINTER_UP specified pointer id " + id + " which is not currently down."
                                                );
                                        mTouchEventStreamIsTainted = true;
                                    }
                                    else
                                    {
                                        mTouchEventStreamPointers &= ~idBit;
                                    }
                                }
                                ensureHistorySizeIsZeroForThisAction(@event);
                            }
                            else
                            {
                                problem("Invalid action " + android.view.MotionEvent.actionToString(action) + " for touch event."
                                        );
                            }
                        }
                        break;
                    }
                    }
                }
                else
                {
                    problem("Source was not SOURCE_CLASS_POINTER.");
                }
            }
            finally
            {
                finishEvent();
            }
        }
示例#19
0
 public virtual bool onTouch(android.view.View v, android.view.MotionEvent @event)
 {
     throw new System.NotImplementedException();
 }
示例#20
0
        /// <summary>Checks a generic motion event.</summary>
        /// <remarks>Checks a generic motion event.</remarks>
        /// <param name="event">The event.</param>
        /// <param name="nestingLevel">
        /// The nesting level: 0 if called from the base class,
        /// or 1 from a subclass.  If the event was already checked by this consistency verifier
        /// at a higher nesting level, it will not be checked again.  Used to handle the situation
        /// where a subclass dispatching method delegates to its superclass's dispatching method
        /// and both dispatching methods call into the consistency verifier.
        /// </param>
        public void onGenericMotionEvent(android.view.MotionEvent @event, int nestingLevel
                                         )
        {
            if (!startEvent(@event, nestingLevel, EVENT_TYPE_GENERIC_MOTION))
            {
                return;
            }
            try
            {
                ensureMetaStateIsNormalized(@event.getMetaState());
                int action = @event.getAction();
                int source = @event.getSource();
                if ((source & android.view.InputDevice.SOURCE_CLASS_POINTER) != 0)
                {
                    switch (action)
                    {
                    case android.view.MotionEvent.ACTION_HOVER_ENTER:
                    {
                        ensurePointerCountIsOneForThisAction(@event);
                        mHoverEntered = true;
                        break;
                    }

                    case android.view.MotionEvent.ACTION_HOVER_MOVE:
                    {
                        ensurePointerCountIsOneForThisAction(@event);
                        break;
                    }

                    case android.view.MotionEvent.ACTION_HOVER_EXIT:
                    {
                        ensurePointerCountIsOneForThisAction(@event);
                        if (!mHoverEntered)
                        {
                            problem("ACTION_HOVER_EXIT without prior ACTION_HOVER_ENTER");
                        }
                        mHoverEntered = false;
                        break;
                    }

                    case android.view.MotionEvent.ACTION_SCROLL:
                    {
                        ensureHistorySizeIsZeroForThisAction(@event);
                        ensurePointerCountIsOneForThisAction(@event);
                        break;
                    }

                    default:
                    {
                        problem("Invalid action for generic pointer event.");
                        break;
                    }
                    }
                }
                else
                {
                    if ((source & android.view.InputDevice.SOURCE_CLASS_JOYSTICK) != 0)
                    {
                        switch (action)
                        {
                        case android.view.MotionEvent.ACTION_MOVE:
                        {
                            ensurePointerCountIsOneForThisAction(@event);
                            break;
                        }

                        default:
                        {
                            problem("Invalid action for generic joystick event.");
                            break;
                        }
                        }
                    }
                }
            }
            finally
            {
                finishEvent();
            }
        }
示例#21
0
 public override bool onHoverEvent(android.view.MotionEvent ev)
 {
     base.onHoverEvent(ev);
     // An action bar always eats hover events.
     return(true);
 }
示例#22
0
文件: Touch.cs 项目: zffl/androidmono
 public static bool onTouchEvent(android.widget.TextView arg0, android.text.Spannable arg1, android.view.MotionEvent arg2)
 {
     global::MonoJavaBridge.JNIEnv @__env = global::MonoJavaBridge.JNIEnv.ThreadEnv;
     return(@__env.CallStaticBooleanMethod(android.text.method.Touch.staticClass, global::android.text.method.Touch._onTouchEvent8194, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg1), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg2)));
 }
示例#23
0
		public virtual bool onTouchEvent(android.view.MotionEvent @event)
		{
			if (mInputEventConsistencyVerifier != null)
			{
				mInputEventConsistencyVerifier.onTouchEvent(@event, 0);
			}
			int action = @event.getActionMasked();
			if (action == android.view.MotionEvent.ACTION_DOWN)
			{
				reset();
			}
			// Start fresh
			bool handled = true;
			if (mInvalidGesture)
			{
				handled = false;
			}
			else
			{
				if (!mGestureInProgress)
				{
					switch (action)
					{
						case android.view.MotionEvent.ACTION_DOWN:
						{
							mActiveId0 = @event.getPointerId(0);
							mActive0MostRecent = true;
							break;
						}

						case android.view.MotionEvent.ACTION_UP:
						{
							reset();
							break;
						}

						case android.view.MotionEvent.ACTION_POINTER_DOWN:
						{
							// We have a new multi-finger gesture
							// as orientation can change, query the metrics in touch down
							android.util.DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
							mRightSlopEdge = metrics.widthPixels - mEdgeSlop;
							mBottomSlopEdge = metrics.heightPixels - mEdgeSlop;
							if (mPrevEvent != null)
							{
								mPrevEvent.recycle();
							}
							mPrevEvent = android.view.MotionEvent.obtain(@event);
							mTimeDelta = 0;
							int index1 = @event.getActionIndex();
							int index0 = @event.findPointerIndex(mActiveId0);
							mActiveId1 = @event.getPointerId(index1);
							if (index0 < 0 || index0 == index1)
							{
								// Probably someone sending us a broken event stream.
								index0 = findNewActiveIndex(@event, index0 == index1 ? -1 : mActiveId1, index0);
								mActiveId0 = @event.getPointerId(index0);
							}
							mActive0MostRecent = false;
							setContext(@event);
							// Check if we have a sloppy gesture. If so, delay
							// the beginning of the gesture until we're sure that's
							// what the user wanted. Sloppy gestures can happen if the
							// edge of the user's hand is touching the screen, for example.
							float edgeSlop = mEdgeSlop;
							float rightSlop = mRightSlopEdge;
							float bottomSlop = mBottomSlopEdge;
							float x0 = getRawX(@event, index0);
							float y0 = getRawY(@event, index0);
							float x1 = getRawX(@event, index1);
							float y1 = getRawY(@event, index1);
							bool p0sloppy = x0 < edgeSlop || y0 < edgeSlop || x0 > rightSlop || y0 > bottomSlop;
							bool p1sloppy = x1 < edgeSlop || y1 < edgeSlop || x1 > rightSlop || y1 > bottomSlop;
							if (p0sloppy && p1sloppy)
							{
								mFocusX = -1;
								mFocusY = -1;
								mSloppyGesture = true;
							}
							else
							{
								if (p0sloppy)
								{
									mFocusX = @event.getX(index1);
									mFocusY = @event.getY(index1);
									mSloppyGesture = true;
								}
								else
								{
									if (p1sloppy)
									{
										mFocusX = @event.getX(index0);
										mFocusY = @event.getY(index0);
										mSloppyGesture = true;
									}
									else
									{
										mSloppyGesture = false;
										mGestureInProgress = mListener.onScaleBegin(this);
									}
								}
							}
							break;
						}

						case android.view.MotionEvent.ACTION_MOVE:
						{
							if (mSloppyGesture)
							{
								// Initiate sloppy gestures if we've moved outside of the slop area.
								float edgeSlop = mEdgeSlop;
								float rightSlop = mRightSlopEdge;
								float bottomSlop = mBottomSlopEdge;
								int index0 = @event.findPointerIndex(mActiveId0);
								int index1 = @event.findPointerIndex(mActiveId1);
								float x0 = getRawX(@event, index0);
								float y0 = getRawY(@event, index0);
								float x1 = getRawX(@event, index1);
								float y1 = getRawY(@event, index1);
								bool p0sloppy = x0 < edgeSlop || y0 < edgeSlop || x0 > rightSlop || y0 > bottomSlop;
								bool p1sloppy = x1 < edgeSlop || y1 < edgeSlop || x1 > rightSlop || y1 > bottomSlop;
								if (p0sloppy)
								{
									// Do we have a different pointer that isn't sloppy?
									int index = findNewActiveIndex(@event, mActiveId1, index0);
									if (index >= 0)
									{
										index0 = index;
										mActiveId0 = @event.getPointerId(index);
										x0 = getRawX(@event, index);
										y0 = getRawY(@event, index);
										p0sloppy = false;
									}
								}
								if (p1sloppy)
								{
									// Do we have a different pointer that isn't sloppy?
									int index = findNewActiveIndex(@event, mActiveId0, index1);
									if (index >= 0)
									{
										index1 = index;
										mActiveId1 = @event.getPointerId(index);
										x1 = getRawX(@event, index);
										y1 = getRawY(@event, index);
										p1sloppy = false;
									}
								}
								if (p0sloppy && p1sloppy)
								{
									mFocusX = -1;
									mFocusY = -1;
								}
								else
								{
									if (p0sloppy)
									{
										mFocusX = @event.getX(index1);
										mFocusY = @event.getY(index1);
									}
									else
									{
										if (p1sloppy)
										{
											mFocusX = @event.getX(index0);
											mFocusY = @event.getY(index0);
										}
										else
										{
											mSloppyGesture = false;
											mGestureInProgress = mListener.onScaleBegin(this);
										}
									}
								}
							}
							break;
						}

						case android.view.MotionEvent.ACTION_POINTER_UP:
						{
							if (mSloppyGesture)
							{
								int pointerCount = @event.getPointerCount();
								int actionIndex = @event.getActionIndex();
								int actionId = @event.getPointerId(actionIndex);
								if (pointerCount > 2)
								{
									if (actionId == mActiveId0)
									{
										int newIndex = findNewActiveIndex(@event, mActiveId1, actionIndex);
										if (newIndex >= 0)
										{
											mActiveId0 = @event.getPointerId(newIndex);
										}
									}
									else
									{
										if (actionId == mActiveId1)
										{
											int newIndex = findNewActiveIndex(@event, mActiveId0, actionIndex);
											if (newIndex >= 0)
											{
												mActiveId1 = @event.getPointerId(newIndex);
											}
										}
									}
								}
								else
								{
									// Set focus point to the remaining finger
									int index = @event.findPointerIndex(actionId == mActiveId0 ? mActiveId1 : mActiveId0
										);
									if (index < 0)
									{
										mInvalidGesture = true;
										android.util.Log.e(TAG, "Invalid MotionEvent stream detected.", new System.Exception
											());
										if (mGestureInProgress)
										{
											mListener.onScaleEnd(this);
										}
										return false;
									}
									mActiveId0 = @event.getPointerId(index);
									mActive0MostRecent = true;
									mActiveId1 = -1;
									mFocusX = @event.getX(index);
									mFocusY = @event.getY(index);
								}
							}
							break;
						}
					}
				}
				else
				{
					switch (action)
					{
						case android.view.MotionEvent.ACTION_POINTER_DOWN:
						{
							// Transform gesture in progress - attempt to handle it
							// End the old gesture and begin a new one with the most recent two fingers.
							mListener.onScaleEnd(this);
							int oldActive0 = mActiveId0;
							int oldActive1 = mActiveId1;
							reset();
							mPrevEvent = android.view.MotionEvent.obtain(@event);
							mActiveId0 = mActive0MostRecent ? oldActive0 : oldActive1;
							mActiveId1 = @event.getPointerId(@event.getActionIndex());
							mActive0MostRecent = false;
							int index0 = @event.findPointerIndex(mActiveId0);
							if (index0 < 0 || mActiveId0 == mActiveId1)
							{
								// Probably someone sending us a broken event stream.
								android.util.Log.e(TAG, "Got " + android.view.MotionEvent.actionToString(action) 
									+ " with bad state while a gesture was in progress. " + "Did you forget to pass an event to "
									 + "ScaleGestureDetector#onTouchEvent?");
								index0 = findNewActiveIndex(@event, mActiveId0 == mActiveId1 ? -1 : mActiveId1, index0
									);
								mActiveId0 = @event.getPointerId(index0);
							}
							setContext(@event);
							mGestureInProgress = mListener.onScaleBegin(this);
							break;
						}

						case android.view.MotionEvent.ACTION_POINTER_UP:
						{
							int pointerCount = @event.getPointerCount();
							int actionIndex = @event.getActionIndex();
							int actionId = @event.getPointerId(actionIndex);
							bool gestureEnded = false;
							if (pointerCount > 2)
							{
								if (actionId == mActiveId0)
								{
									int newIndex = findNewActiveIndex(@event, mActiveId1, actionIndex);
									if (newIndex >= 0)
									{
										mListener.onScaleEnd(this);
										mActiveId0 = @event.getPointerId(newIndex);
										mActive0MostRecent = true;
										mPrevEvent = android.view.MotionEvent.obtain(@event);
										setContext(@event);
										mGestureInProgress = mListener.onScaleBegin(this);
									}
									else
									{
										gestureEnded = true;
									}
								}
								else
								{
									if (actionId == mActiveId1)
									{
										int newIndex = findNewActiveIndex(@event, mActiveId0, actionIndex);
										if (newIndex >= 0)
										{
											mListener.onScaleEnd(this);
											mActiveId1 = @event.getPointerId(newIndex);
											mActive0MostRecent = false;
											mPrevEvent = android.view.MotionEvent.obtain(@event);
											setContext(@event);
											mGestureInProgress = mListener.onScaleBegin(this);
										}
										else
										{
											gestureEnded = true;
										}
									}
								}
								mPrevEvent.recycle();
								mPrevEvent = android.view.MotionEvent.obtain(@event);
								setContext(@event);
							}
							else
							{
								gestureEnded = true;
							}
							if (gestureEnded)
							{
								// Gesture ended
								setContext(@event);
								// Set focus point to the remaining finger
								int activeId = actionId == mActiveId0 ? mActiveId1 : mActiveId0;
								int index = @event.findPointerIndex(activeId);
								mFocusX = @event.getX(index);
								mFocusY = @event.getY(index);
								mListener.onScaleEnd(this);
								reset();
								mActiveId0 = activeId;
								mActive0MostRecent = true;
							}
							break;
						}

						case android.view.MotionEvent.ACTION_CANCEL:
						{
							mListener.onScaleEnd(this);
							reset();
							break;
						}

						case android.view.MotionEvent.ACTION_UP:
						{
							reset();
							break;
						}

						case android.view.MotionEvent.ACTION_MOVE:
						{
							setContext(@event);
							// Only accept the event if our relative pressure is within
							// a certain limit - this can help filter shaky data as a
							// finger is lifted.
							if (mCurrPressure / mPrevPressure > PRESSURE_THRESHOLD)
							{
								bool updatePrevious = mListener.onScale(this);
								if (updatePrevious)
								{
									mPrevEvent.recycle();
									mPrevEvent = android.view.MotionEvent.obtain(@event);
								}
							}
							break;
						}
					}
				}
			}
			if (!handled && mInputEventConsistencyVerifier != null)
			{
				mInputEventConsistencyVerifier.onUnhandledEvent(@event, 0);
			}
			return handled;
		}
示例#24
0
 public override bool dispatchTouchEvent(android.view.MotionEvent ev)
 {
     throw new System.NotImplementedException();
 }
示例#25
0
		private void reset()
		{
			if (mPrevEvent != null)
			{
				mPrevEvent.recycle();
				mPrevEvent = null;
			}
			if (mCurrEvent != null)
			{
				mCurrEvent.recycle();
				mCurrEvent = null;
			}
			mSloppyGesture = false;
			mGestureInProgress = false;
			mActiveId0 = -1;
			mActiveId1 = -1;
			mInvalidGesture = false;
		}
示例#26
0
 public virtual bool onTrackballEvent(android.widget.TextView arg0, android.text.Spannable arg1, android.view.MotionEvent arg2)
 {
     global::MonoJavaBridge.JNIEnv @__env = global::MonoJavaBridge.JNIEnv.ThreadEnv;
     if (!IsClrObject)
     {
         return(@__env.CallBooleanMethod(this.JvmHandle, global::android.text.method.ArrowKeyMovementMethod._onTrackballEvent8032, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg1), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg2)));
     }
     else
     {
         return(@__env.CallNonVirtualBooleanMethod(this.JvmHandle, global::android.text.method.ArrowKeyMovementMethod.staticClass, global::android.text.method.ArrowKeyMovementMethod._onTrackballEvent8032, global::MonoJavaBridge.JavaBridge.ConvertToValue(arg0), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg1), global::MonoJavaBridge.JavaBridge.ConvertToValue(arg2)));
     }
 }
示例#27
0
 private void logMotionEvent(string type, android.view.MotionEvent @event)
 {
     throw new System.NotImplementedException();
 }
示例#28
0
 /// <summary>Translate the motion event captured on screen to the application's window.
 ///     </summary>
 /// <remarks>Translate the motion event captured on screen to the application's window.
 ///     </remarks>
 public virtual void translateEventInScreenToAppWindow(android.view.MotionEvent @event
                                                       )
 {
     @event.scale(this.applicationInvertedScale);
 }
示例#29
0
 public override bool onTouchEvent(android.view.MotionEvent @event)
 {
     return(true);
 }
示例#30
0
 private bool isOutOfBounds(android.view.View v, android.view.MotionEvent @event)
 {
     throw new System.NotImplementedException();
 }
示例#31
0
        public override bool onTouchEvent(android.view.MotionEvent ev)
        {
            mVelocityTracker.addMovement(ev);
            int action = ev.getActionMasked();

            switch (action)
            {
            case android.view.MotionEvent.ACTION_DOWN:
            {
                float x = ev.getX();
                float y = ev.getY();
                if (isEnabled() && hitThumb(x, y))
                {
                    mTouchMode = TOUCH_MODE_DOWN;
                    mTouchX    = x;
                    mTouchY    = y;
                }
                break;
            }

            case android.view.MotionEvent.ACTION_MOVE:
            {
                switch (mTouchMode)
                {
                case TOUCH_MODE_IDLE:
                {
                    // Didn't target the thumb, treat normally.
                    break;
                }

                case TOUCH_MODE_DOWN:
                {
                    float x = ev.getX();
                    float y = ev.getY();
                    if (System.Math.Abs(x - mTouchX) > mTouchSlop || System.Math.Abs(y - mTouchY) > mTouchSlop)
                    {
                        mTouchMode = TOUCH_MODE_DRAGGING;
                        getParent().requestDisallowInterceptTouchEvent(true);
                        mTouchX = x;
                        mTouchY = y;
                        return(true);
                    }
                    break;
                }

                case TOUCH_MODE_DRAGGING:
                {
                    float x      = ev.getX();
                    float dx     = x - mTouchX;
                    float newPos = System.Math.Max(0, System.Math.Min(mThumbPosition + dx, getThumbScrollRange
                                                                          ()));
                    if (newPos != mThumbPosition)
                    {
                        mThumbPosition = newPos;
                        mTouchX        = x;
                        invalidate();
                    }
                    return(true);
                }
                }
                break;
            }

            case android.view.MotionEvent.ACTION_UP:
            case android.view.MotionEvent.ACTION_CANCEL:
            {
                if (mTouchMode == TOUCH_MODE_DRAGGING)
                {
                    stopDrag(ev);
                    return(true);
                }
                mTouchMode = TOUCH_MODE_IDLE;
                mVelocityTracker.clear();
                break;
            }
            }
            return(base.onTouchEvent(ev));
        }
 public override bool onTouchEvent(android.widget.TextView widget, android.text.Spannable
                                   buffer, android.view.MotionEvent @event)
 {
     throw new System.NotImplementedException();
 }
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: @Override public boolean onTouchEvent(final android.view.MotionEvent event)
        public override bool onTouchEvent(MotionEvent @event)
        {
            bool handled = false;

            OfficeThing touchedThing;
            int         xTouchLogical;
            int         yTouchLogical;
            int         pointerId;
            int         actionIndex = @event.ActionIndex;

            // get touch event coordinates and make transparent wrapper from it
            switch (@event.ActionMasked)
            {
            case MotionEvent.ACTION_DOWN:
                // first pointer, clear the pointer
                mSelectedThing = null;

                xTouchLogical = screenToModel((int)@event.getX(0));
                yTouchLogical = screenToModel((int)@event.getY(0));

                // check if we've touched inside something
                touchedThing = getTouchedThing(xTouchLogical, yTouchLogical);

                if (touchedThing == null)
                {
                    mSelectedThingChangeListener.thingChanged(null);
                    break;
                }

                mSelectedThing = touchedThing;

                if (null != mSelectedThingChangeListener)
                {
                    mSelectedThingChangeListener.thingChanged(touchedThing);
                }
                touchedThing.setzIndex(mOfficeLayout.HighestzIndex + 1);

                Log.v(TAG, "Selected " + touchedThing);
                handled = true;
                break;


            case MotionEvent.ACTION_MOVE:

                pointerId = @event.getPointerId(actionIndex);
                if (pointerId > 0)
                {
                    break;
                }

                xTouchLogical = screenToModel((int)@event.getX(actionIndex));
                yTouchLogical = screenToModel((int)@event.getY(actionIndex));

                touchedThing = mSelectedThing;

                if (null == touchedThing)
                {
                    break;
                }

                moveThing(touchedThing, xTouchLogical, yTouchLogical);

                handled = true;
                break;

            case MotionEvent.ACTION_UP:
                mSelectedThing = null;
                invalidate();
                handled = true;
                break;

            case MotionEvent.ACTION_CANCEL:
                handled = true;
                break;
            }

            return(base.onTouchEvent(@event) || handled);
        }
示例#34
0
 private void handleActionDown(android.view.MotionEvent @event)
 {
     throw new System.NotImplementedException();
 }
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: @Override public boolean onTouchEvent(final android.view.MotionEvent event)
		public override bool onTouchEvent(MotionEvent @event)
		{
			bool handled = false;

			OfficeThing touchedThing;
			int xTouchLogical;
			int yTouchLogical;
			int pointerId;
			int actionIndex = @event.ActionIndex;

			// get touch event coordinates and make transparent wrapper from it
			switch (@event.ActionMasked)
			{

				case MotionEvent.ACTION_DOWN:
					// first pointer, clear the pointer
					mSelectedThing = null;

					xTouchLogical = screenToModel((int) @event.getX(0));
					yTouchLogical = screenToModel((int) @event.getY(0));

					// check if we've touched inside something
					touchedThing = getTouchedThing(xTouchLogical, yTouchLogical);

					if (touchedThing == null)
					{
						mSelectedThingChangeListener.thingChanged(null);
						break;
					}

					mSelectedThing = touchedThing;

					if (null != mSelectedThingChangeListener)
					{
						mSelectedThingChangeListener.thingChanged(touchedThing);
					}
					touchedThing.setzIndex(mOfficeLayout.HighestzIndex + 1);

					Log.v(TAG, "Selected " + touchedThing);
					handled = true;
					break;


				case MotionEvent.ACTION_MOVE:

					pointerId = @event.getPointerId(actionIndex);
					if (pointerId > 0)
					{
						break;
					}

					xTouchLogical = screenToModel((int) @event.getX(actionIndex));
					yTouchLogical = screenToModel((int) @event.getY(actionIndex));

					touchedThing = mSelectedThing;

					if (null == touchedThing)
					{
						break;
					}

					moveThing(touchedThing, xTouchLogical, yTouchLogical);

					handled = true;
					break;

				case MotionEvent.ACTION_UP:
					mSelectedThing = null;
					invalidate();
					handled = true;
					break;

				case MotionEvent.ACTION_CANCEL:
					handled = true;
					break;
			}

			return base.onTouchEvent(@event) || handled;
		}
示例#36
0
		/// <summary>
		/// Analyzes the given motion event and if applicable triggers the
		/// appropriate callbacks on the
		/// <see cref="OnGestureListener">OnGestureListener</see>
		/// supplied.
		/// </summary>
		/// <param name="ev">The current motion event.</param>
		/// <returns>
		/// true if the
		/// <see cref="OnGestureListener">OnGestureListener</see>
		/// consumed the event,
		/// else false.
		/// </returns>
		public virtual bool onTouchEvent(android.view.MotionEvent ev)
		{
			if (mInputEventConsistencyVerifier != null)
			{
				mInputEventConsistencyVerifier.onTouchEvent(ev, 0);
			}
			int action = ev.getAction();
			float y = ev.getY();
			float x = ev.getX();
			if (mVelocityTracker == null)
			{
				mVelocityTracker = android.view.VelocityTracker.obtain();
			}
			mVelocityTracker.addMovement(ev);
			bool handled = false;
			switch (action & android.view.MotionEvent.ACTION_MASK)
			{
				case android.view.MotionEvent.ACTION_POINTER_DOWN:
				{
					if (mIgnoreMultitouch)
					{
						// Multitouch event - abort.
						cancel();
					}
					break;
				}

				case android.view.MotionEvent.ACTION_POINTER_UP:
				{
					// Ending a multitouch gesture and going back to 1 finger
					if (mIgnoreMultitouch && ev.getPointerCount() == 2)
					{
						int index = (((action & android.view.MotionEvent.ACTION_POINTER_INDEX_MASK) >> android.view.MotionEvent
							.ACTION_POINTER_INDEX_SHIFT) == 0) ? 1 : 0;
						mLastMotionX = ev.getX(index);
						mLastMotionY = ev.getY(index);
						mVelocityTracker.recycle();
						mVelocityTracker = android.view.VelocityTracker.obtain();
					}
					break;
				}

				case android.view.MotionEvent.ACTION_DOWN:
				{
					if (mDoubleTapListener != null)
					{
						bool hadTapMessage = mHandler.hasMessages(TAP);
						if (hadTapMessage)
						{
							mHandler.removeMessages(TAP);
						}
						if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage &&
							 isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev))
						{
							// This is a second tap
							mIsDoubleTapping = true;
							// Give a callback with the first tap of the double-tap
							handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
							// Give a callback with down event of the double-tap
							handled |= mDoubleTapListener.onDoubleTapEvent(ev);
						}
						else
						{
							// This is a first tap
							mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
						}
					}
					mLastMotionX = x;
					mLastMotionY = y;
					if (mCurrentDownEvent != null)
					{
						mCurrentDownEvent.recycle();
					}
					mCurrentDownEvent = android.view.MotionEvent.obtain(ev);
					mAlwaysInTapRegion = true;
					mAlwaysInBiggerTapRegion = true;
					mStillDown = true;
					mInLongPress = false;
					if (mIsLongpressEnabled)
					{
						mHandler.removeMessages(LONG_PRESS);
						mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime() + TAP_TIMEOUT
							 + LONGPRESS_TIMEOUT);
					}
					mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + TAP_TIMEOUT
						);
					handled |= mListener.onDown(ev);
					break;
				}

				case android.view.MotionEvent.ACTION_MOVE:
				{
					if (mInLongPress || (mIgnoreMultitouch && ev.getPointerCount() > 1))
					{
						break;
					}
					float scrollX = mLastMotionX - x;
					float scrollY = mLastMotionY - y;
					if (mIsDoubleTapping)
					{
						// Give the move events of the double-tap
						handled |= mDoubleTapListener.onDoubleTapEvent(ev);
					}
					else
					{
						if (mAlwaysInTapRegion)
						{
							int deltaX = (int)(x - mCurrentDownEvent.getX());
							int deltaY = (int)(y - mCurrentDownEvent.getY());
							int distance = (deltaX * deltaX) + (deltaY * deltaY);
							if (distance > mTouchSlopSquare)
							{
								handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
								mLastMotionX = x;
								mLastMotionY = y;
								mAlwaysInTapRegion = false;
								mHandler.removeMessages(TAP);
								mHandler.removeMessages(SHOW_PRESS);
								mHandler.removeMessages(LONG_PRESS);
							}
							if (distance > mBiggerTouchSlopSquare)
							{
								mAlwaysInBiggerTapRegion = false;
							}
						}
						else
						{
							if ((System.Math.Abs(scrollX) >= 1) || (System.Math.Abs(scrollY) >= 1))
							{
								handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
								mLastMotionX = x;
								mLastMotionY = y;
							}
						}
					}
					break;
				}

				case android.view.MotionEvent.ACTION_UP:
				{
					mStillDown = false;
					android.view.MotionEvent currentUpEvent = android.view.MotionEvent.obtain(ev);
					if (mIsDoubleTapping)
					{
						// Finally, give the up event of the double-tap
						handled |= mDoubleTapListener.onDoubleTapEvent(ev);
					}
					else
					{
						if (mInLongPress)
						{
							mHandler.removeMessages(TAP);
							mInLongPress = false;
						}
						else
						{
							if (mAlwaysInTapRegion)
							{
								handled = mListener.onSingleTapUp(ev);
							}
							else
							{
								// A fling must travel the minimum tap distance
								android.view.VelocityTracker velocityTracker = mVelocityTracker;
								velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
								float velocityY = velocityTracker.getYVelocity();
								float velocityX = velocityTracker.getXVelocity();
								if ((System.Math.Abs(velocityY) > mMinimumFlingVelocity) || (System.Math.Abs(velocityX
									) > mMinimumFlingVelocity))
								{
									handled = mListener.onFling(mCurrentDownEvent, ev, velocityX, velocityY);
								}
							}
						}
					}
					if (mPreviousUpEvent != null)
					{
						mPreviousUpEvent.recycle();
					}
					// Hold the event we obtained above - listeners may have changed the original.
					mPreviousUpEvent = currentUpEvent;
					mVelocityTracker.recycle();
					mVelocityTracker = null;
					mIsDoubleTapping = false;
					mHandler.removeMessages(SHOW_PRESS);
					mHandler.removeMessages(LONG_PRESS);
					break;
				}

				case android.view.MotionEvent.ACTION_CANCEL:
				{
					cancel();
					break;
				}
			}
			if (!handled && mInputEventConsistencyVerifier != null)
			{
				mInputEventConsistencyVerifier.onUnhandledEvent(ev, 0);
			}
			return handled;
		}