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