studio programacion herramientas fundamentos con avanzado aplicaciones android view drag smooth

programacion - vista de arrastrar de android sin problemas



manual de android en pdf (5)

Debería redondear sus puntos, también usar márgenes no será muy suave, usar un diseño diferente y establecer las coordenadas X e Y de acuerdo con las dimensiones de la pantalla.

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? Porque este tipo de "arrastre" no es para nada ... Aquí está el código

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; }


Intenta usar motionEvent.getRawX () y motionEvent.getRawY () en lugar de getY y getX


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


No necesita usar LayoutParameters para arrastrar. Puedes hacerlo simplemente configurando las coordenadas X e Y de la vista. Puedes leer más sobre esto aquí .

Puedes 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; }


Sería útil ver cómo está procesando sus eventos ACTION_MOVE. ¿Estás utilizando todos los puntos usando 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.