studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android drag-and-drop imageview relativelayout

para - manual de programacion android pdf



Arrastrar y colocar Android. Posicionando imagen después de arrastrar (4)

Cuando arrastro ImageView, no se coloca en el lugar donde solté el dedo. Está ubicado justo debajo y a la derecha. No entiendo lo que está mal.

Intentó varias opciones para el resultado de posicionamiento de ImageView es el mismo

Diseño

<RelativeLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/center" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF8989" tools:context=".MainActivity" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/ic_launcher" /> </RelativeLayout>

código

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.imageView1).setOnTouchListener(this); findViewById(R.id.imageView1).getRootView().setOnDragListener(this); } public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); view.startDrag(null, shadowBuilder, view, 0); view.setVisibility(View.INVISIBLE); return true; } else { return false; } } public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DROP: float X = event.getX(); float Y = event.getY(); Log.d(LOGCAT, "X " + (int) X + "Y " + (int) Y); View view = (View) event.getLocalState(); view.setX(X); view.setY(Y); view.setVisibility(View.VISIBLE); default: break; } return true; }

LogCat

12-04 23:44:40.548: D/myLogs(32658): Width image 72 Height image 72 12-04 23:44:40.558: D/myLogs(32658): ACTION_DROP X 216Y 390 12-04 23:44:40.568: D/myLogs(32658): Real position: X 180.0Y 354.0 12-04 23:44:40.598: D/myLogs(32658): Drag ended 12-04 23:44:41.928: D/myLogs(32658): Width image 72 Height image 72 12-04 23:44:41.928: D/myLogs(32658): ACTION_DROP X 442Y 329 12-04 23:44:41.948: D/myLogs(32658): Real position: X 406.0Y 293.0 12-04 23:44:41.968: D/myLogs(32658): Drag ended


Reemplazar

view.setX(X); view.setY(Y);

con

view.setX(X-(view.getWidth()/2)); view.setY(Y-(view.getHeight()/2));


v.setX (me.getRawX () - (v.getWidth () / 2));

v.setY (me.getRawY () - (float) (v.getHeight () * 1.5 / 2));

Encontré esta solución como una respuesta perfecta cuando arrastraba desde el centro del objeto.


Solo en caso de que alguien necesite ayuda con esto: lo intenté y descubrí que el problema está en la vista de raíz, si le das a tu diseño una identificación (en la que estás moviendo la imagen) y luego relaces

findViewById(R.id.imageView1).getRootView().setOnDragListener(this); findViewById(R.id.imageView1).getRootView().findViewById(R.id.yourLayout).setOnDragListener(this);

Deberias hacer eso.
para colocar imageView en el medio, pruebe lo que otros ya dijeron:

view.setX(X - iv.getWidth()/2); view.setY(Y - iv.getHeight()/2) ;

Esto colocará la imageView en el medio Happy programming :)


Es porque está colocando la esquina superior izquierda de la imagen en el lugar donde lo liberas.

Para hacer que haga lo que quiere, básicamente tendrá que restar la mitad del ancho de la imagen de X y la mitad de su altura de Y.

Entonces deberías tener algo como esto:

view.setX((X - (image.width / 2)); view.setY(Y - (image.width / 2));