Monodroid - Перетащите Просмотр с сенсорным событием? - PullRequest
2 голосов
/ 26 сентября 2011

Я хочу перетащить вид.До сих пор я пробовал это с LinearLayout и полями и с AbsoluteLayout.

Пример 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;
};

В каждом случае, когда я пытался, я получал странное поведение.Вот почемуВид, который я перетаскиваю, следует за моим пальцем, но всегда перемещается между двумя положениями.Одна позиция поражает мой палец, другая где-то слева от моих пальцев.Если я просто записываю свою текущую позицию в текстовое представление (без перемещения представления), координаты ведут себя как ожидалось.Но если я также перемещаю взгляд, они прыгают снова.Как я могу избежать этого?

РЕДАКТИРОВАТЬ: я использовал звуковой комментарий на мой вопрос для реализации рабочего перетаскивания для monodroid (это делается для Java / Android SDK на связанном сайте).Может быть, другие когда-нибудь захотят это сделать, поэтому вот мое решение:

[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 Ответ

2 голосов
/ 28 сентября 2011

Вы должны сделать как в примере здесь .Не забудьте прочитать все пункты в статье.

...