¿Cómo mover una vista en Android?
Tengo un proyecto en el que tengo dos desafíos:
Primero:
- ¿Cómo posiciono el cuadro de diálogo personalizado en coordenadas específicas?
- Cómo agregar dos campos de texto de edición o vistas en un cuadro AlertDialog?
- ¿Cómo puede detectar la vista que está pasando cuando realiza un evento táctil?
- Notificación de pantalla de bloqueo de Android Vista personalizada con ripple y doble toque
- Android: cómo crear una aplicación de pestañas compleja con vistas
- Mueva un icono a donde el dedo toque la pantalla:
Para esto, el mejor enfoque que he encontrado, es usar el método .layout()
en la vista.
Segundo:
- Tengo dos diseños, en un RelativeLayout , ambos con el ancho de la pantalla y la altura (1 se oculta detrás del otro). Quiero mover el uno por encima de unas cuantas salsas a la derecha cada vez que haga clic en un botón.
¿Hay una mejor manera de mover vistas en Android?
¿Cuáles podrían ser las desventajas de usar el método .layout()
?
public void layout (int l, int t, int r, int b) Since: API Level 1 Assign a size and position to a view and all of its descendants Parameters: l Left position, relative to parent t Top position, relative to parent r Right position, relative to parent b Bottom position, relative to parent
Gracias por adelantado.
- Android: Tablerow mezclado con columnas y texto multilínea
- Split motion events - acepta entradas simultáneamente a varias vistas
- Deshabilitar todas las vistas secundarias dentro del diseño
- Stackoverflow error en la vista
- Animación individual - vistas múltiples
- Añadir más de dos vistas a ViewSwitcher
- Android addView en hilo de fondo
- Android instanceof detectar todos los widgets?
WindowManager mantiene al menos dos instancias más de la clase LayoutParams
para cada vista, además de aquella en la View
misma.
Compruebe el método updateViewLayout
de WindowManager
, esta parte en particular:
view.setLayoutParams(wparams); synchronized (this) { int index = findViewLocked(view, true); ViewRoot root = mRoots[index]; mParams[index] = wparams; root.setLayoutParams(wparams, false); }
Creo que usted puede hacer un lío llamando directamente al layout
. En su lugar, utilice WindowManager.updateViewLayout
. Será más lento, pero seguro (sólo IMO).
ACTUALIZAR
[De: https://stackoverflow.com/a/11188273/327011 ]
WindowManager windowsManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE) WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams(); windowParams.x = <new X coord>; windowParams.y = <new Y coord> windowParams.height = myImageView.getHeight(); windowParams.width = myImageView.getWidth(); windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; windowParams.format = PixelFormat.TRANSLUCENT; windowParams.windowAnimations = 0; windowManager.updateViewLayout(myImageView, windowParams);
La forma más fácil de mover una vista con el dedo es utilizando setTranslationX y setTranslationY de la clase View.
http://developer.android.com/reference/android/view/View.html#setTranslationX(float )
También puede cambiar los márgenes de View LayoutParams para mover si apunta a api <11.
Creo que mover el elemento en la función onLayout o onDraw peor porque la vista ya tiene estas opciones arriba y dibujar su vista manualmente puede llegar a ser compleja a medida que agrega más elementos y vistas diferentes.
Puede utilizar animación de objetos
/** * The java class is used to move the widgets to the region of the touch point from its original position * * @author gfernandes * */ public class animate { /** * Variable declaration * */ private ObjectAnimator animation1; private ObjectAnimator animation2; /** * Function animate: Animates the widget Eg:Button from its position to the * position of the touch point. * * @param[in] -The coordinates of the touch point (x, y) * -The coordinates of the widget position (valx, valy) * -The widget object id * */ public void animategroup1(int x, int y, Object val, int valx, int valy ){ System.out.println("animategroup1 entered here"); System.out.println("x:"+x); System.out.println("y"+y); System.out.println("valx"+valx); System.out.println("valy"+valy); animation1 = ObjectAnimator.ofFloat(val, "x", valx, x); animation2 = ObjectAnimator.ofFloat(val, "y", valy, y); AnimatorSet set = new AnimatorSet(); set.playTogether(animation1, animation2); set.start(); } }
Puede utilizar el método View http://developer.android.com/reference/android/view/View.html#offsetTopAndBottom(int)
O http://developer.android.com/reference/android/view/View.html#offsetLeftAndRight(int)