2011-12-16 21 views
14

Tengo que arrastrar algunas vistas en la pantalla. Estoy modificando su posición cambiando los parámetros izquierdo y superior de su diseño del evento de movimiento en ACTION_MOVE desde el oyente táctil. ¿Hay alguna manera de "arrastrar" los elementos más suavemente? Debido tis tipo de "arrastrar" no es lisa en todos los ... Aquí está el códigoandroid arrastre view smooth

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

tratar de usar mi código aquí: http://stackoverflow.com/a/18806475/878126 creo que es bastante suave. –

+0

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

+0

Acabo de subir un video tutorial en Youtube sobre cómo hacer que cualquier vista sea arrastrable con solo una clase de asistente simple. Compruébelo: https://youtu.be/licui_5_iLk –

Respuesta

0

Sería útil para ver cómo se va a procesar sus eventos ACTION_MOVE. ¿Está utilizando todos los puntos utilizando el método event.getHistorical()? Si eso no le da una resistencia más suave, otra idea podría ser interpolar puntos en la ruta. Creo que habrá una compensación entre lograr una suavidad de movimiento y una respuesta rápida al tacto del usuario. HTH.

+0

, consulte el código adjunto –

+0

¿Está utilizando el arrastre dentro de un ScrollView? @gabi – MGDroid

1

La razón del movimiento no suave es el valor entero de leftMargin y topMargin.
Para una posición de movimiento suave, debe flotar.
This podría ayudar.

+2

LayoutParams requiere entradas allí. –

21

Intente utilizar motionEvent.getRawX() y motionEvent.getRawY() en lugar de getY y getX

+0

Me salvaste, gracias. –

0

Usted debe redondear sus enteros, utilizando también los márgenes no va a ser muy suave, utilizar un diseño diferente y un conjunto Coordenadas X e Y según las dimensiones de la pantalla.

2

No necesita utilizar LayoutParameters para arrastrar. Puedes hacerlo simplemente configurando las coordenadas X e Y de la vista. Puede leer más en este here.

Puede hacer algo como esto.

@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 impresionante buen trabajo –

+0

pero ¿por qué deberíamos agregar que el delta no es la vista que se supone que se mueve a la nueva posición del puntero sin ese espacio? –