Android ¿Arrastrar y soltar imágenes en la pantalla?

Estoy trabajando en el usuario del proyecto para mover la imagen en una posición a Otra posición en la pantalla. He escrito un código de muestra para mover la imagen, pero el problema aquí es si muevo una imagen. La imagen vecina también comienza a moverse. Aquí está el código de muestra. Cualquier Idea de esto.

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

       

Escriba el código debajo en su archivo de actividad.

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

Archivo XML: –

        

Esto se debe a que ha puesto todo en LinearLayout , lo que significa que no puede colocar los artículos donde los quiere, sino que están uno detrás del otro. Puede intentar utilizar un RelativeLayout lugar. Si eso no es lo suficientemente flexible, debería mirar Canvas .

el motivo es que: la acción de subir su pantalla se mueve demasiado perezosamente.

en el caso normal, el movimiento de acción se carga con mucha frecuencia incluso si su dedo no se mueve en la pantalla. pero algunas pantallas de teléfonos no son tan sensibles.

puedes modificar el umbral de tu teléfono. Necesita soporte de kernel.

Me tomé la libertad de alternar tu código para administrar múltiples imágenes en un RelativeLayout y lugares aleatorios. También agregué una forma mejor de obtener el tamaño de la ventana, ya que Display.getHeight() está en desuso.

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

En realidad, puede evitar este problema declarando las imágenes mediante progtwigción.

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

y agrega eventos táctiles a las vistas de imagen agregadas