Android 2.2 Haga clic y arrastre la imagen centrada bajo el tacto

Estoy tratando de arrastrar y soltar una cruz en un MapView . Tengo un botón ImageView en la pantalla. Cuando lo toco, el botón desaparece y aparece un nuevo ImageView . Se supone que el nuevo ImageView se sienta centrado bajo mi dedo hasta que lo suelte en alguna parte, pero por alguna razón el desplazamiento es incorrecto. La cruz mira hacia abajo a la derecha de donde estoy tocando.

La imagen se mueve proporcionalmente, así que creo que el problema es con el offset_x y offset_y que defino en la sección ACTION_DOWN . Entonces, en ACTION_UP necesito createMarker(x,y) en las coordenadas correctas debajo de mi dedo, pero eso es compensado incorrectamente también.

He intentado varias maneras de hacerlo centrado, y algunos son mejores que otros. Hasta ahora no he podido hacer que funcione sin usar números mágicos.

Como es, estoy usando la ubicación del clic y restando la mitad del tamaño de la imagen. Esto tiene sentido para mí. Está más cerca de corregir si sustraigo el tamaño completo de la imagen. He probado varios ejemplos de la web, todos ellos sufren de imprecisiones con la ubicación de View .

¿Me puedes dar algún consejo?

 crosshair = (ImageView)findViewById(R.id.crosshair); frameLayout = (FrameLayout)findViewById(R.id.mapframe); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); crosshairImage = BitmapFactory.decodeResource(getResources(), R.drawable.crosshair); crosshair.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { dragStatus = START_DRAGGING; // hide the button and grab a mobile crosshair v.setVisibility(View.INVISIBLE); image = new ImageView(getBaseContext()); image.setImageBitmap(crosshairImage); // set the image offsets to center the crosshair under my touch offset_x = (int)event.getRawX() - (int)(crosshairImage.getWidth()/2) ; offset_y = (int)event.getRawY() - (int)(crosshairImage.getHeight()/2) ; // set the image location on the screen using padding image.setPadding(offset_x, offset_y, 0, 0); // add it to the screen so it shows up frameLayout.addView(image, params); frameLayout.invalidate(); if(LOG_V) Log.v(TAG, "Pressed Crosshair"); return true; } else if (event.getAction() == MotionEvent.ACTION_UP) { if(dragStatus == START_DRAGGING) { dragStatus = STOP_DRAGGING; // place a marker on this spot makeMarker((int)event.getX() + offset_x, (int)event.getY() + offset_y); // make the button visible again v.setVisibility(View.VISIBLE); // remove the mobile crosshair frameLayout.removeView(image); if(LOG_V) Log.v(TAG, "Dropped Crosshair"); return true; } } else if (event.getAction() == MotionEvent.ACTION_MOVE) { if (dragStatus == START_DRAGGING) { // compute how far it has moved from 'start' offset int x = (int)event.getX() + offset_x; int y = (int)event.getY() + offset_y; // check that it's in bounds int w = getWindowManager().getDefaultDisplay().getWidth(); int h = getWindowManager().getDefaultDisplay().getHeight(); if(x > w) x = w; if(y > h) y = h; // set the padding to change the image loc image.setPadding(x, y, 0 , 0); // draw it image.invalidate(); frameLayout.requestLayout(); if(LOG_V) Log.v(TAG, "(" + offset_x + ", " + offset_y + ")"); return true; } } return false; } }); 

2 Solutions collect form web for “Android 2.2 Haga clic y arrastre la imagen centrada bajo el tacto”

Ha escrito este código en touch_Down .

 offset_x = (int)event.getRawX() - (int)(crosshairImage.getWidth()/2) ; offset_y = (int)event.getRawY() - (int)(crosshairImage.getHeight()/2) ; // set the image location on the screen using padding image.setPadding(offset_x, offset_y, 0, 0); 

Trate de escribir fuera de las condiciones if, sólo para asegurarse de que se aplica a todos los eventos de toque.

Puede usar la nueva API disponible en arrastrar y soltar

 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; } } 
  • Las vistas no se actualizan hasta que se toca MapView
  • Crear un archivo GPX desde GeoPoints
  • ¿Puedo usar AnimationDrawable en una superposición en un MapView?
  • Creación de superposición personalizada en el mapa
  • ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError
  • Error en la autorización de Google Maps para Android API v2
  • Evento para el cambio de posición del marcador
  • Android Cambiando dinámicamente el tamaño del círculo sólo la mitad del círculo se actualiza correctamente
  • ¿Los mapas de android admiten la superposición de tierra?
  • Vista girada de OpenStreetMap - cómo deslizar el mapa en la dirección del movimiento del dedo después de la rotación en Android?
  • ¿Cómo centrar la cámara para que el marcador esté en la parte inferior de la pantalla? (Google map api V2 Android)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.