2017-02-27 3 views
1

Ich bin neu in Xamarin Android und arbeitet derzeit an einer schwimmenden Aktion Schaltfläche, ich implementiert View.IOnTouchListener und normale Schaltfläche Klick-Ereignis (faButton.Click + = floatButtonPressed;) um meine Handlungen auszuführen. Aber für den Fall MotionEventActions.Move funktioniert es nicht wie ich wollte. Links und rechts bewegt es sich gut, aber für oben und unten wird es ein wenig nach unten bewegen, wenn ich es bewege. Außerdem, wenn ich den Knopf zum Bildschirmrand bewege, kann es den Bildschirm überschreiten. Daher habe ich versucht, Bildschirmgröße zu erkennen und zu beschränken, aber es ist immer noch nicht gut genug, gibt es noch andere verfügbare Lösung oder Einstellungen?So erstellen Sie eine bewegliche und anklickbare Schaltfläche in 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

können Sie dois –

+0

Ansicht (Button) auf Touch entfernen und hinzufügen Was Sie mit dem Entfernen gemeint haben und Sicht hinzufügen? Kannst du mir ein paar Hinweise geben? @JinalPatel –

+0

Sie wollen beweglichen Knopf für, dass Sie eine Taste verwenden können, die hinzugefügt wird, wo Sie berühren und von der letzten Position entfernt –

Antwort

0

Sie können zuerst die Bildschirmhöhe und Bildschirmbreite erhalten. Wenn die Schaltfläche den Bildschirm überschreitet, müssen Sie die Position der Schaltfläche zurücksetzen.

Versuchen Sie, den folgenden Code:

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(); 
      } 
     } 
    } 

Ich habe versucht, Bildschirmgröße erkennen und sie beschränken, aber es reicht noch nicht gut ist, gibt es eine andere verfügbare Lösung oder Einstellungen?

können Sie haben die ganze Bildschirmbreite und -höhe, die Taste, um die Bildschirmhöhe überschreiten, in dieser Art von Situation, die Sie die Ansicht Zeichnungsbereich this.Window.FindViewById(Window.IdAndroidContent).GetDrawingRect(outRect)

Screen Shot von bekommen müssen:

Hinweis : Ich benutze den Emulator, der langsam ist, Wenn Sie das reale Gerät verwenden, wird es schneller sein.

enter image description here

+0

Diese Codes funktionieren einwandfrei. Es löste meine beiden Fragen. Vielen Dank, Bruder! @MikeMa –

Verwandte Themen