¿Cómo mover una vista en Android?

Tengo un proyecto en el que tengo dos desafíos:

Primero:

  • 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.

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(); } } 
  • FindViewById devuelve null - Android - setContentView
  • Adición de vistas a un grupo de vistas de Android mediante programación
  • Android OpenGL que extiende las excepciones de puntero nulo de GLSurfaceView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.