/// <summary>
        /// Starts a drag.
        /// </summary>
        /// <param name="b"> The bitmap to display as the drag image.  It will be re-scaled to the
        ///          enlarged size. </param>
        /// <param name="screenX"> The x position on screen of the left-top of the bitmap. </param>
        /// <param name="screenY"> The y position on screen of the left-top of the bitmap. </param>
        /// <param name="textureLeft"> The left edge of the region inside b to use. </param>
        /// <param name="textureTop"> The top edge of the region inside b to use. </param>
        /// <param name="textureWidth"> The width of the region inside b to use. </param>
        /// <param name="textureHeight"> The height of the region inside b to use. </param>
        /// <param name="source"> An object representing where the drag originated </param>
        /// <param name="dragInfo"> The data associated with the object that is being dragged </param>
        /// <param name="dragAction"> The drag action: either <seealso cref="#DRAG_ACTION_MOVE"/> or
        ///        <seealso cref="#DRAG_ACTION_COPY"/> </param>
        public void StartDrag(Bitmap b, int screenX, int screenY, int textureLeft, int textureTop, int textureWidth, int textureHeight, IDragSource source, object dragInfo, int dragAction)
        {
            if (PROFILE_DRAWING_DURING_DRAG)
            {
                Debug.StartMethodTracing("Launcher");
            }

            // Hide soft keyboard, if visible
            if (mInputMethodManager == null)
            {
                mInputMethodManager = (InputMethodManager)mContext.GetSystemService(Context.InputMethodService);
            }
            mInputMethodManager.HideSoftInputFromWindow(mWindowToken, 0);

            if (mListener != null)
            {
                mListener.OnDragStart(source, dragInfo, dragAction);
            }

            int registrationX = ((int)mMotionDownX) - screenX;
            int registrationY = ((int)mMotionDownY) - screenY;

            mTouchOffsetX = mMotionDownX - screenX;
            mTouchOffsetY = mMotionDownY - screenY;

            mDragging   = true;
            mDragSource = source;
            mDragInfo   = dragInfo;

            //mVibrator.vibrate(VIBRATE_DURATION);
            DragView dragView = mDragView = new DragView(mContext, b, registrationX, registrationY, textureLeft, textureTop, textureWidth, textureHeight);

            dragView.Show(mWindowToken, (int)mMotionDownX, (int)mMotionDownY);
        }
 private void EndDrag()
 {
     if (mDragging)
     {
         mDragging = false;
         if (mOriginator != null)
         {
             mOriginator.Visibility = ViewStates.Invisible;
         }
         if (mListener != null)
         {
             mListener.OnDragEnd();
         }
         if (mDragView != null)
         {
             mDragView.Remove();
             mDragView = null;
         }
     }
 }
 /// <summary>
 /// Estimate the surface area where this object would land if dropped at the
 /// given location.
 /// </summary>
 /// <param name="source"> DragSource where the drag started </param>
 /// <param name="x"> X coordinate of the drop location </param>
 /// <param name="y"> Y coordinate of the drop location </param>
 /// <param name="xOffset"> Horizontal offset with the object being dragged where the
 ///            original touch happened </param>
 /// <param name="yOffset"> Vertical offset with the object being dragged where the
 ///            original touch happened </param>
 /// <param name="dragView"> The DragView that's being dragged around on screen. </param>
 /// <param name="dragInfo"> Data associated with the object being dragged </param>
 /// <param name="recycle"> <seealso cref="Rect"/> object to be possibly recycled. </param>
 /// <returns> Estimated area that would be occupied if object was dropped at
 ///         the given location. Should return null if no estimate is found,
 ///         or if this target doesn't provide estimations. </returns>
 public Rect EstimateDropLocation(IDragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, object dragInfo, Rect recycle)
 {
     return(null);
 }
 /// <summary>
 /// Check if a drop action can occur at, or near, the requested location.
 /// This may be called repeatedly during a drag, so any calls should return
 /// quickly.
 /// </summary>
 /// <param name="source"> DragSource where the drag started </param>
 /// <param name="x"> X coordinate of the drop location </param>
 /// <param name="y"> Y coordinate of the drop location </param>
 /// <param name="xOffset"> Horizontal offset with the object being dragged where the
 ///            original touch happened </param>
 /// <param name="yOffset"> Vertical offset with the object being dragged where the
 ///            original touch happened </param>
 /// <param name="dragView"> The DragView that's being dragged around on screen. </param>
 /// <param name="dragInfo"> Data associated with the object being dragged </param>
 /// <returns> True if the drop will be accepted, false otherwise. </returns>
 public bool AcceptDrop(IDragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, object dragInfo)
 {
     return(true);
 }
 public void OnDragExit(IDragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, object dragInfo)
 {
 }
        public void OnDragOver(IDragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, object dragInfo)
        {
            View v = (View)dragInfo;

            int w    = v.Width;
            int h    = v.Height;
            int left = x - xOffset;
            int top  = y - yOffset;

            DragLayer.LayoutParams lp = new DragLayer.LayoutParams(w, h, left, top);
            this.UpdateViewLayout(v, lp);
        }