/// <summary>Handles touch events for dragging.</summary> /// <remarks> /// Handles touch events for dragging. You may want to do other actions /// like moving the cursor on touch as well. /// </remarks> public static bool onTouchEvent (TextView widget, Spannable buffer, MotionEvent @event) { DragState[] ds; switch (@event.getActionMasked ()) { case MotionEvent.ACTION_DOWN: { ds = buffer.getSpans<DragState> (0, buffer.Length); { for (int i = 0; i < ds.Length; i++) { buffer.removeSpan (ds [i]); } } buffer.setSpan (new DragState (@event.getX (), @event.getY (), widget.getScrollX (), widget.getScrollY ()), 0, 0, SpannedClass.SPAN_MARK_MARK); return true; } case MotionEvent.ACTION_UP: { ds = buffer.getSpans<DragState> (0, buffer.Length); { for (int i_1 = 0; i_1 < ds.Length; i_1++) { buffer.removeSpan (ds [i_1]); } } if (ds.Length > 0 && ds [0].mUsed) { return true; } else { return false; } goto case MotionEvent.ACTION_MOVE; } case android.view.MotionEvent.ACTION_MOVE: { ds = buffer.getSpans<Touch.DragState> (0, buffer.Length); if (ds.Length > 0) { if (ds [0].mFarEnough == false) { int slop = ViewConfiguration.get (widget.getContext ()).getScaledTouchSlop (); if (Math.Abs (@event.getX () - ds [0].mX) >= slop || Math.Abs (@event.getY () - ds [0].mY) >= slop) { ds [0].mFarEnough = true; } } if (ds [0].mFarEnough) { ds [0].mUsed = true; bool cap = (@event.getMetaState () & KeyEvent.META_SHIFT_ON) != 0 || MetaKeyKeyListener.getMetaState (buffer, MetaKeyKeyListener.META_SHIFT_ON) == 1 || MetaKeyKeyListener.getMetaState (buffer, MetaKeyKeyListener.META_SELECTING) != 0; float dx; float dy; if (cap) { // if we're selecting, we want the scroll to go in // the direction of the drag dx = @event.getX () - ds [0].mX; dy = @event.getY () - ds [0].mY; } else { dx = ds [0].mX - @event.getX (); dy = ds [0].mY - @event.getY (); } ds [0].mX = @event.getX (); ds [0].mY = @event.getY (); int nx = widget.getScrollX () + (int)dx; int ny = widget.getScrollY () + (int)dy; int padding = widget.getTotalPaddingTop () + widget.getTotalPaddingBottom (); Layout layout = widget.getLayout (); ny = Math.Min (ny, layout.getHeight () - (widget.getHeight () - padding)); ny = Math.Max (ny, 0); int oldX = widget.getScrollX (); int oldY = widget.getScrollY (); scrollTo (widget, layout, nx, ny); // If we actually scrolled, then cancel the up action. if (oldX != widget.getScrollX () || oldY != widget.getScrollY ()) { widget.cancelLongPress (); } return true; } } return false; } } return false; }