2017-02-27 63 views
1

可移動和點擊的按鈕,我是新來的Xamarin的Android和目前工作的一個浮動的操作按鈕,我實現View.IOnTouchListener和普通按鈕點擊事件(faButton.Click + = floatButtonPressed;)執行我的行動。但對於的情況MotionEventActions.Move,它不工作,因爲我想。左右移動可以正常工作,但是對於頂部和底部,只要我開始移動,它會向下移動一點點。此外,當我將按鈕移動到屏幕邊框時,它將能夠超出屏幕。因此,我試圖檢測屏幕大小,並限制它,但它仍然不夠好,有沒有其他可用的解決方案或設置?如何創建Android的

public bool OnTouch(View v, MotionEvent e) 
    { 
     switch (e.Action) 
     { 
      case MotionEventActions.Down: 
       oldXvalue = e.GetX(); 
       oldYvalue = e.GetY(); 

       if (oldXvalue == e.GetX() && oldYvalue == e.GetY()) 
       { 
        return false; 
       } 

       break; 

      case MotionEventActions.Up: 

       if (oldXvalue == e.GetX() && oldYvalue == e.GetY()) 
       { 
        return false; 
       }     
       break; 

      case MotionEventActions.Move: 
       var xleft = (int)(e.RawX - oldXvalue); 
       var xright = xleft + v.Width; 
       var ytop = (int)(e.RawY - oldYvalue); 
       var ybtm = (ytop + v.Height); 
       if (xleft + v.Width >= intWidth) 
       { 
        break; 
       } 
       if (xleft <= 0) 
       { 
        break; 
       } 

       if (ytop + v.Height >= intHeight) 
       { 
        break; 
       } 
       if (ytop <= 0) 
       { 
        break; 
       } 
       v.Layout(xleft, ytop, xright, ybtm); 
       break; 
     } 
     return true; 
    } 
+0

可以的DOI刪除和添加視圖(按鈕)觸摸 –

+0

你是什麼意思刪除,並添加觀點?你能給我一些提示嗎? @JinalPatel –

+0

你想要一個可移動的按鈕,你可以使用一個按鈕,它將添加在你觸摸並從上一個位置移開的地方 –

回答

0

您可以先獲取屏幕高度和屏幕寬度。當按鈕超過屏幕時,您需要重置按鈕位置。

試試下面的代碼:

public class MainActivity : Activity, IOnTouchListener 
    { 
     Button dragAbleBt; 
     int screenWidth = 0; 
     int screenHeight = 0; 
     int lastX = 0, lastY = 0; 
     public bool OnTouch(View v, MotionEvent e) 
     {    
      MotionEventActions ea = e.Action; 
      switch (ea) { 
       case MotionEventActions.Down: 
        lastX = (int)e.RawX; 
        lastY = (int)e.RawY;     
        break; 
       case MotionEventActions.Move: 
        int dx = (int)e.RawX - lastX; 
        int dy = (int)e.RawY - lastY; 
        int left = v.Left + dx; 
        int right = v.Right + dx; 
        int top = v.Top + dy; 
        int bottom = v.Bottom + dy; 
        if (left < 0) 
        { 
         left = 0; 
         right = left + v.Width; 
        } 
        if (right > screenWidth) 
        { 
         right = screenWidth; 
         left = right - v.Width; 
        } 
        if (top < 0) 
        { 
         top = 0; 
         bottom = top + v.Height; 
        } 
        if (bottom > screenHeight) 
        { 
         bottom = screenHeight; 
         top = bottom - v.Height; 
        } 
        v.Layout(left, top, right, bottom); 
        lastX = (int) e.RawX; 
        lastY = (int) e.RawY; 
        v.PostInvalidate(); 
        break; 
       case MotionEventActions.Up:     
        break;     
      } 
      return false; 
     } 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 
      SetContentView (Resource.Layout.Main); 
      //DisplayMetrics dm = Resources.DisplayMetrics; 
      //screenWidth = dm.WidthPixels; 
      //screenHeight = dm.HeightPixels; 
      dragAbleBt = FindViewById<Button>(Resource.Id.button1); 
      dragAbleBt.SetOnTouchListener(this); 
     } 

     public override void OnWindowFocusChanged(bool hasFocus) 
     { 
      base.OnWindowFocusChanged(hasFocus); 
      if (hasFocus) 
      { 
       Rect outRect = new Rect(); 
       this.Window.FindViewById(Window.IdAndroidContent).GetDrawingRect(outRect); 
       screenWidth = outRect.Width(); 
       screenHeight = outRect.Height(); 
      } 
     } 
    } 

我試圖檢測屏幕尺寸和限制,但它仍然不夠好,還有沒有其他可用的解決方案或設置?

你可能得到了整個屏幕寬度和高度,按鈕將超出屏幕高度,在這種情況下,你需要通過this.Window.FindViewById(Window.IdAndroidContent).GetDrawingRect(outRect)

屏幕截圖獲取視圖繪圖區域:

注:我正在使用速度較慢的仿真器,如果您使用的是真實設備,速度會更快。

enter image description here

+0

此代碼完美工作。它解決了我的兩個問題。非常感謝你的兄弟! @MikeMa –