Android Drag and Drop. Позиционирование изображения после перетаскивания

Когда я перетаскиваю ImageView, он помещается не на том месте, где я отпустил палец. Он расположен чуть ниже и направо. Я не понимаю, что случилось.

Пробовал различные параметры для позиционирования позиционирования ImageView – это то же самое

раскладка

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

код

 @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 

замещать

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

с

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

Это потому, что он помещает верхний левый угол изображения в изображение, где вы снова находитесь.

Чтобы заставить его делать то, что вы хотите, в основном вам нужно будет вычесть половину ширины изображения с X и половину ее высоты от Y.

Поэтому у вас должно быть что-то вроде этого:

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

V.setX (me.getRawX () – (v.getWidth () / 2));

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

Я нашел это решение идеальным ответом, где можно перетащить из центра объекта.

Просто помогите кому-то помочь в этом: я попробовал это и обнаружил, что проблема связана с корневым представлением, если вы даете вашему макету идентификатор (тот, на который вы перемещаете изображение), а затем ресайлинг

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

Это должно сделать это.
Для размещения imageView в середине попробуйте то, что другие уже сказали:

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

Это поместит изображение в середине Счастливое программирование 🙂

Intereting Posts
Таймер Замедляется в Сервисе, когда блокировка экрана устройства Синглтон с контекстом в Android Xamarin.Android привязка, определяющая методы Getter / Setter, используя EnumMethods.xml для интерфейса Как ссылка ImageView на веб-страницу? NullPointerException – Drawable.setBounds – возможно, из-за переходов фрагментов Постоянная навигацияНастройка свободного фокуса после выбора элемента Когда следует использовать RxJava Observable и когда просто обратный вызов на Android? Позиционирование MediaController Appium против Espresso для автоматизированной системы тестирования Отличить салфетки и щелкнуть в android (передать событие в другое представление, если это проведите) Как получить данные от намерения отправки? Ошибка 12501 аутентификация с помощью входа в google Остаток логотипа панели действий оставлен Остановите тост и запустите другой в android Как заказать мою базу данных SQLITE в порядке убывания, для приложения для Android?