2011-12-16 16 views
14

Devo trascinare alcune visualizzazioni sullo schermo. Sto modificando la loro posizione modificando la sinistra e la parte superiore dei loro parametri di layout dall'evento di movimento su ACTION_MOVE dal listener touch. C'è un modo per "trascinare" gli oggetti più fluidi? Perché TIS sorta di "trascinamento" non è liscia a tutti ... Ecco il codiceAndroid trascinare la vista liscia

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

provare a utilizzare il mio codice qui: http://stackoverflow.com/a/18806475/878126 penso che sia abbastanza liscia. –

+0

[Vista trascinabile Android] (http://www.singhajit.com/android-draggable-view/) –

+0

Ho appena caricato un tutorial video su YouTube su come rendere trascinabile qualsiasi visualizzazione con una sola classe assistente semplice. Scoprilo: https://youtu.be/licui_5_iLk –

risposta

0

Sarebbe utile per vedere come si stanno elaborando i vostri eventi ACTION_MOVE. Stai utilizzando tutti i punti usando il metodo event.getHistorical()? Se ciò non fornisce una resistenza più fluida, un'altra idea potrebbe essere quella di interpolare i punti sul percorso. Credo che ci sarà un compromesso tra l'ottenimento di una fluidità di movimento e una rapida risposta al tocco dell'utente. HTH.

+0

per favore vedi il codice allegato –

+0

Stai usando il trascinamento all'interno di un ScrollView? @gabi – MGDroid

1

Il motivo dello spostamento non regolare è il valore intero di leftMargin e topMargin.
Per una posizione di spostamento regolare dovrebbe essere mobile.
This potrebbe aiutare.

+2

LayoutParams richiede inte qui. –

21

Provare a usare motionEvent.getRawX() e motionEvent.getRawY() al posto di Gety e GetX

+0

Mi hai salvato, grazie. –

0

Si dovrebbe arrotondare i vostri interi, utilizzando anche i margini non sta per essere molto regolare, utilizzare un layout diverso e impostare Coordinate X e Y in base alle dimensioni dello schermo.

2

Non è necessario utilizzare LayoutParameters per il trascinamento. Puoi farlo semplicemente impostando le coordinate X e Y della vista. Puoi leggere di più su questo here.

Si può fare qualcosa di simile.

@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

video stupendo bel lavoro –

+0

ma perché dovremmo aggiungere il delta non è la vista dovrebbe passare alla nuova posizione del puntatore senza quello spazio. –