2017-02-27 16 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

あなたは削除し、削除によって意味ない何タッチ –

+0

上のビュー(ボタン)を追加し、ビューを追加ドイスことができますか?あなたは私にいくつかのヒントを教えてもらえますか? @ JinalPatel –

+0

あなたは、最後の位置に触れてどこから削除するかを追加するボタンを1つ使用することができる可動ボタンをご希望です。 –

答えて

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 –

関連する問題