Android Перетаскивание изображений на экране?

Я работаю над пользователем проекта, чтобы переместить изображение в одной позиции в другую позицию на экране. Я написал образец кода для перемещения изображения, но проблема здесь в том, что если я перемещаю одно изображение, соседнее изображение также начинает перемещаться. Вот пример кода. Одна идея.

Main.java

public class MainActivity extends Activity { int windowwidth; int windowheight; ImageView ima1,ima2; private android.widget.RelativeLayout.LayoutParams layoutParams ; // private android.widget.RelativeLayout.LayoutParams layoutParams ; //private android.widget.RelativeLayout.LayoutParams layoutParams ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); windowwidth = getWindowManager().getDefaultDisplay().getWidth(); windowheight = getWindowManager().getDefaultDisplay().getHeight(); System.out.println("width" +windowwidth); System.out.println("height" +windowheight); ima1 = (ImageView)findViewById(R.id.imageview1); ima1.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { layoutParams = (RelativeLayout.LayoutParams) ima1.getLayoutParams(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int x_cord = (int) event.getRawX(); int y_cord = (int) event.getRawY(); System.out.println("value of x" +x_cord); System.out.println("value of y" +y_cord); if (x_cord > windowwidth) { x_cord = windowwidth; } if (y_cord > windowheight) { y_cord = windowheight; } layoutParams.leftMargin = x_cord-25; layoutParams.topMargin = y_cord-25; // layoutParams.rightMargin = x_cord-25; // layoutParams.bottomMargin = y_cord-25; ima1.setLayoutParams(layoutParams); break; default: break; } return true; } }); ima2 = (ImageView)findViewById(R.id.imageview2); ima2.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { layoutParams = (RelativeLayout.LayoutParams) ima2.getLayoutParams(); switch(event.getActionMasked()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int x_cord = (int) event.getRawX(); int y_cord = (int) event.getRawY(); System.out.println("value of x1" +x_cord); System.out.println("value of y1" +y_cord); if (x_cord > windowwidth) { x_cord = windowwidth; } if (y_cord > windowheight) { y_cord = windowheight; } layoutParams.leftMargin = x_cord - 25; layoutParams.topMargin = y_cord - 75; ima2.setLayoutParams(layoutParams); break; default: break; } return true; } }); } } 

main.xml

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageview1" android:src="@drawable/image1" /> <ImageView android:layout_width="100sp" android:layout_height="100sp" android:id="@+id/imageview2" android:src="@drawable/image2" /> </RelativeLayout> 

Впишите свой код в свой файл активности.

 windowwidth = getWindowManager().getDefaultDisplay().getWidth(); windowheight = getWindowManager().getDefaultDisplay().getHeight(); tv1 = (ImageView)findViewById(R.id.image); tv1.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { layoutParams1 = (RelativeLayout.LayoutParams) tv1.getLayoutParams(); switch(event.getActionMasked()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int x_cord = (int) event.getRawX(); int y_cord = (int) event.getRawY(); if (x_cord > windowwidth) { x_cord = windowwidth; } if (y_cord > windowheight) { y_cord = windowheight; } layoutParams1.leftMargin = x_cord - 25; layoutParams1.topMargin = y_cord - 75; tv1.setLayoutParams(layoutParams1); break; default: break; } return true; } }); tv2 = (ImageView)findViewById(R.id.image1); tv2.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { layoutParams2 = (RelativeLayout.LayoutParams) tv2.getLayoutParams(); switch(event.getActionMasked()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int x_cord = (int) event.getRawX(); int y_cord = (int) event.getRawY(); if (x_cord > windowwidth) { x_cord = windowwidth; } if (y_cord > windowheight) { y_cord = windowheight; } layoutParams2.leftMargin = x_cord - 25; layoutParams2.topMargin = y_cord - 75; tv2.setLayoutParams(layoutParams2); break; default: break; } return true; } }); 

Файл XML: –

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="50sp" android:layout_height="50sp" android:id="@+id/image" android:src="@drawable/image"> </ImageView> <ImageView android:layout_y="30dip" android:layout_x="118dip" android:layout_width="50sp" android:layout_height="50sp" android:id="@+id/image1" android:src="@drawable/image1"> </ImageView> </RelativeLayout> 

Это потому, что вы поместили все в LinearLayout , что означает, что вы не можете размещать предметы там, где вы хотите, они всегда один за другим. Вместо этого вы можете попытаться использовать RelativeLayout . Если это недостаточно гибко, вы должны посмотреть Canvas .

Причина в том, что ваш экран загружает action_move слишком лениво.

В нормальном случае действие перемещается очень часто, даже если ваш палец не перемещается по экрану. Но некоторые экраны телефона не так чувствительны.

Вы можете изменить порог своего телефона. Он нуждается в поддержке ядра.

Я взял на себя смелость чередовать свой код для управления несколькими изображениями в RelativeLayout и случайных местах. Также я добавил лучший способ получить размер окна, так как Display.getHeight() устарел.

  if(Build.VERSION.SDK_INT >= 13){ android.graphics.Point p = new android.graphics.Point(); this.getWindowManager().getDefaultDisplay().getSize(p); width = px; height = py; } else{ Display display = getWindowManager().getDefaultDisplay(); width = display.getWidth(); height = display.getHeight(); } RelativeLayout rel = new RelativeLayout(this); rel.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); rel.setBackgroundResource(R.drawable.bg); pic = new ImageView[10]; layoutParams1 = new LayoutParams[10]; for(int i = 0; i < 10; i++){ pic[i] = new ImageView(this); pic[i].setImageResource(R.drawable.img); pic[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); pic[i].setAdjustViewBounds(true); pic[i].setScaleType(ScaleType.FIT_XY); pic[i].setMaxHeight(88); pic[i].setMaxWidth(100); pic[i].setMinimumHeight(88); pic[i].setMinimumWidth(100); pic[i].setTag(i); int x = rand.nextInt(width); while(x > width - 88){ x = rand.nextInt(width); } int y = rand.nextInt(height); while(y > height - 100){ y = rand.nextInt(height); } layoutParams1[i] = (RelativeLayout.LayoutParams) pic[i].getLayoutParams(); layoutParams1[i].leftMargin = x; layoutParams1[i].topMargin = y; pic[i].setLayoutParams(layoutParams1[i]); pic[i].setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int index = Integer.valueOf(v.getTag().toString()); layoutParams1[index] = (RelativeLayout.LayoutParams) v.getLayoutParams(); switch(event.getActionMasked()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int x_cord = (int) event.getRawX(); int y_cord = (int) event.getRawY(); if (x_cord > width) { x_cord = width; } if (y_cord > height) { y_cord = height; } layoutParams1[index].leftMargin = x_cord - 44; layoutParams1[index].topMargin = y_cord - 50; pic[index].setLayoutParams(layoutParams1[index]); break; default: break; } return true; } }); rel.addView(pic[i]); } setContentView(rel); 

На самом деле вы можете избежать этой проблемы, объявив изображения программно.

 int id = getResources().getIdentifier("image1", "drawable", getPackageName()); ImageView imageView1 = new ImageView(this); LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); imageView1.setLayoutParams(vp); imageView1.setImageResource(id); someLinearLayout.addView(imageView1); int id = getResources().getIdentifier("image2", "drawable", getPackageName()); ImageView imageView2 = new ImageView(this); LinearLayout.LayoutParams vp1 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); imageView2.setLayoutParams(vp1); imageView2.setImageResource(id); someLinearLayout.addView(imageView2); 

И добавьте события касания к добавленным изображениям

Intereting Posts
Ошибка при загрузке макета при загрузке приложения NPE при получении Robolectric ShadowApplication с волейболом и кинжалом Выполнение специальных тестов с использованием эспрессо и ложки Конвертировать java.net.URI в android.net.Uri Android – несколько вертикальных прокрутки в горизонтальном прокрутке Трассировка стека Android «Размер растрового изображения превышает 32 бит» в buildDrawingCache на устройствах KitKat Как проверить, работает ли другой рекордер или нет? Что делает AsyncTaskLoader.deliverResult ()? Высота веб-страниц растет неопределенно внутри nestedScrollView При использовании genymotion, получающего пустой экран с приемом EULA Как предоставить разрешение на приложение, которое загружается из магазина воспроизведения? Как я могу использовать шаблон кода в android при создании проекта из командной строки? Ошибка Android MediaPlayer (1, -19) Как изменить цвет кнопки «Положительная и отрицательная» в диалоговом окне «Пользовательское предупреждение» в android