2011-12-16 14 views
14

Muszę przeciągnąć niektóre widoki na ekranie. Modyfikuję ich pozycję, zmieniając lewy i górny ich parametry układu z zdarzenia ruchu na ACTION_MOVE z odbiornika dotyku. Czy istnieje sposób na "płynniejsze" przeciąganie przedmiotów? Ponieważ TIS rodzaju „przeciąganie” nie jest gładka w ogóle ... Oto kodprzeciągnij widok android gładki

public boolean onTouch(View view, MotionEvent motionEvent) { 
    switch (motionEvent.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      dx = (int) motionEvent.getX(); 
      dy = (int) motionEvent.getY(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      int x = (int) motionEvent.getX(); 
      int y = (int) motionEvent.getY(); 
      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
      int left = lp.leftMargin + (x - dx); 
      int top = lp.topMargin + (y - dy); 
      lp.leftMargin = left; 
      lp.topMargin = top; 
      view.setLayoutParams(lp); 
      break; 
    } 
    return true; 
} 
+1

Spróbuj użyć tutaj mój kod: http://stackoverflow.com/a/18806475/878126 myślę, że to całkiem gładka. –

+0

[Widok przeciągania z Androidem] (http://www.singhajit.com/android-draggable-view/) –

+0

Właśnie przesyłam samouczek wideo na Youtube o tym, jak sprawić, by jakikolwiek widok był przeciągany tylko z jedną prostą klasą asystenta. Sprawdź to: https://youtu.be/licui_5_iLk –

Odpowiedz

0

Dobrze byłoby, aby zobaczyć jak jesteś przetwarzanie wydarzenia ACTION_MOVE. Czy wykorzystujesz wszystkie punkty za pomocą metody event.getHistorical()? Jeśli to nie daje bardziej płynnego oporu, innym pomysłem może być interpolacja punktów na ścieżce. Uważam, że nastąpi kompromis między osiągnięciem płynności ruchu a szybką reakcją na dotyk użytkownika. HTH.

+0

zobacz dołączony kod –

+0

Czy używasz przeciągania wewnątrz ScrollView? @gabi – MGDroid

1

Przyczyną przenoszenia, które nie jest płynne, jest liczba całkowita wartości leftMargin i topMargin.
Aby płynna pozycja ruchu była płynna.
This może pomóc.

+2

LayoutParams wymaga tam int. –

21

spróbuje użyć motionEvent.getRawX() i motionEvent.getRawY() zamiast getY i getX

+0

Uratowałeś mnie, dzięki. –

0

należy zaokrąglić swoje ints, również za pomocą marginesów nie będzie bardzo gładka, użyć innego układu i ustawić Współrzędne X i Y zależą od wymiarów ekranu.

2

Nie musisz używać opcji LayoutParameters, aby przeciągać. Możesz to zrobić, ustawiając po prostu współrzędne X i Y widoku. Możesz przeczytać więcej na ten temat here.

Możesz zrobić coś takiego.

@Override 
    public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
     dX = view.getX() - event.getRawX(); 
     dY = view.getY() - event.getRawY(); 
     break; 

     case MotionEvent.ACTION_MOVE: 
     view.setY(event.getRawY() + dY); 
     view.setX(event.getRawX() + dX); 
     break; 

     default: 
     return false; 
    } 
    return true; 
    } 
+0

niesamowite wideo miła robota –

+0

, ale dlaczego powinniśmy dodać deltę, to nie widok powinien przejść do nowej pozycji wskaźnika bez tego miejsca. –