Cómo usar el arrastrar correctamente de una vista en android

Parece que hay un montón de soluciones de cómo utilizar el arrastrar de las vistas en android.

Sin embargo, son demasiado lentos o con errores.

Una solución conocida es tener un framelayout, y la vista simplemente cambia su layoutParams a medida que se mueve usando el OnTouchListener, como se describe aquí: http://www.anddev.org/novice-tutorials-f8/android-drag-and-drop -of-normal-views-not-bitmaps-t13404.html Sin embargo, si la vista es una imageView, al alcanzar el lado más derecho (o más inferior) del framelayout, la imagen se encoge.

Otra posible solución es usar el lienzo para mostrar el contenido arrastrado, como se describe aquí: http://www.anddev.org/basic_drag_and_drop-t3095.html sin embargo, no estoy seguro de cómo usarlo para vistas complejas.

¿Alguien sabe de una buena solución, que permite que el tamaño de la vista arrastrada permanecer el mismo, no importa dónde está en su contenedor?

por favor, ayúdame .

Esta es una solución completa para un simple arrastre de imageView:

findViewById(R.id.imageView).setOnTouchListener(new OnTouchListener() { int prevX,prevY; @Override public boolean onTouch(final View v,final MotionEvent event) { final FrameLayout.LayoutParams par=(FrameLayout.LayoutParams)v.getLayoutParams(); switch(event.getAction()) { case MotionEvent.ACTION_MOVE: { par.topMargin+=(int)event.getRawY()-prevY; prevY=(int)event.getRawY(); par.leftMargin+=(int)event.getRawX()-prevX; prevX=(int)event.getRawX(); v.setLayoutParams(par); return true; } case MotionEvent.ACTION_UP: { par.topMargin+=(int)event.getRawY()-prevY; par.leftMargin+=(int)event.getRawX()-prevX; v.setLayoutParams(par); return true; } case MotionEvent.ACTION_DOWN: { prevX=(int)event.getRawX(); prevY=(int)event.getRawY(); par.bottomMargin=-2*v.getHeight(); par.rightMargin=-2*v.getWidth(); v.setLayoutParams(par); return true; } } return false; } }); 

Estoy utilizando arrastrar y soltar en un proyecto actual, donde las diferentes View s se colocan dentro de un RelativeLayout acuerdo a LayoutParams aplicado a ellos. Al igual que usted, encontré que las vistas se "encogían" al llegar a la derecha o la parte inferior del contenedor ViewGroup . Probablemente es bastante obvio que esto sucederá, realmente, considerando que durante las fases de medición y disposición, el sistema va a determinar que una determinada View repente va a tener que tener dimensiones mucho más pequeñas de lo que realmente desea si todavía va a ser Capaz de encajar en el padre cuando se coloca cerca de los extremos.

Una solución muy simple que he hecho para evitar que en este momento es simplemente sobredimensionar mi ViewGroup relación con el tamaño de la pantalla.

Además, puede decidir que en realidad no desea que View s aparezca parcialmente fuera de la pantalla, en cuyo caso utilizaría alguna lógica de programa para evitar que los márgenes de los objetos View se configuren de tal manera que se permita que los View s se apaguen El límite del contenedor principal.

Otra solución podría ser anular onMeasure() o similar para obligar a la View secundaria a forzar un tamaño mayor que el que el padre considere disponible – si es posible – para forzar que la Vista se coloque allí en el tamaño deseado, superponiéndose el borde. Eso es sólo una idea de la parte superior de mi cabeza sin embargo y no han investigado.

  • Combinación WindowManager.LayoutParams que puede pasar eventos a capas bajo TYPE_SYSTEM_ALERT o smilar
  • Expectativa de puntero nulo al configurar LayoutParams
  • Cómo encontrar el área de texto (altura / ancho) de TextView de forma programática en android
  • ¿Cómo puedo eliminar mediante programación una regla existente que se definió en XML?
  • Creación de una vista redimensionable ListAdapter-recycleable
  • Cómo agregar linealmente LinearLayout con color de fondo y peso a otro diseño
  • Cómo obtener la altura en píxeles de LinearLayout con layout_weight
  • Cómo establecer layout_span a través de código
  • Cómo establecer mediante programación el atributo layout_align_parent_right de un botón en Disposición relativa?
  • Configuración del margen del botón mediante programación
  • android setLayoutParams para webview genera ERROR
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.