2011-09-26 6 views
2

Je veux faire glisser une vue. Jusqu'à présent, je l'ai essayé avec un LinearLayout et des marges et avec un AbsoluteLayout.Monodroid - Faites glisser la vue avec un événement tactile?

exemple AbsoluteLayout:

button.Touch = (clickedView, motionEvent) => 
{ 
    Button b = (Button)clickedView; 
    if (motionEvent.Action == MotionEventActions.Move) 
    {      
     AbsoluteLayout.LayoutParams layoutParams = new AbsoluteLayout.LayoutParams(100, 35, (int)motionEvent.GetX(), (int)motionEvent.GetY()); 
     b.LayoutParameters = layoutParams;      
    } 
    return true; 
}; 

Dans tous les cas j'ai essayé, je suis un comportement curios. Voici pourquoi. La vue que je traîne suit mon doigt mais saute toujours entre deux positions. Une posture frappe mon doigt l'autre est quelque part à mes doigts gauche-haut. Si je suis en train d'écrire ma position actuelle dans une vue de texte (sans déplacer la vue), les coordonnées se comportent comme prévu. Mais si je déplace aussi la vue, ils sautent à nouveau. Comment puis-je éviter cela?

EDIT: J'ai utilisé le commentaire de sons sur ma question pour implémenter un workaging de travail pour monodroid (c'est fait pour Java/Android SDK dans le site lié). Peut-être que d'autres sont intéressés à le faire un jour, alors voici ma solution:

[Activity(Label = "Draging", MainLauncher = true, Icon = "@drawable/icon")] 
public class Activity1 : Activity 
{ 
    private View selectedItem = null; 
    private int offset_x = 0; 
    private int offset_y = 0; 

    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.Main); 

     ViewGroup vg = (ViewGroup)FindViewById(Resource.Id.vg); 
     vg.Touch = (element, motionEvent) => 
     { 
      switch (motionEvent.Action) 
      { 
       case MotionEventActions.Move: 
        int x = (int)motionEvent.GetX() - offset_x; 
        int y = (int)motionEvent.GetY() - offset_y; 
        int w = WindowManager.DefaultDisplay.Width - 100; 
        int h = WindowManager.DefaultDisplay.Height - 100; 
        if (x > w) 
         x = w; 
        if (y > h) 
         y = h; 
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
         new ViewGroup.MarginLayoutParams(
          LinearLayout.LayoutParams.WrapContent, 
          LinearLayout.LayoutParams.WrapContent)); 
        lp.SetMargins(x, y, 0, 0); 
        selectedItem.LayoutParameters = lp; 
        break; 
       default: 
        break; 
      } 
      return true; 
     }; 

     ImageView img = FindViewById<ImageView>(Resource.Id.img); 
     img.Touch = (element, motionEvent) => 
     { 
      switch (motionEvent.Action) 
      { 
       case MotionEventActions.Down: 
        offset_x = (int)motionEvent.GetX(); 
        offset_y = (int)motionEvent.GetY(); 
        selectedItem = element; 
        break; 
       default: 
        break; 
      } 
      return false; 
     }; 
    }   
} 
+1

http://www.edumobile.org/android/android-beginner-tutorials/drag-and-drop-ui-element/ – mironych

Répondre

2

Vous devriez faire comme dans l'exemple here. Ne pas oublier de lire tous les points de l'article.

+0

Pendant ce temps j'ai trouvé cet article aussi et suis passé à cette solution, qui est plus variable. – andineupert

Questions connexes