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; } } 
  • La imagen no se carga desde la URL en infoWindow personalizado con la biblioteca de carga de imágenes de Picasso en android
  • Biblioteca de soporte: Las animaciones de FragmentTransaction no funcionan
  • MapFragment en las pestañas de barra de acción
  • Error en la autorización de Google Maps para Android API v2
  • Cómo mostrar el pin de ubicación de la parte visible de un mapview en android?
  • Cómo actualizar el mapa de Google.
  • Androide, google, mapa, marcador, colocación
  • Google Maps V2 muestra pantalla en blanco en Android 2.2
  • Guardar el estado de MapFragment (Maps v2) en Android
  • Android GoogleMap o SupportMapFragment - excepción de puntero nulo
  • Obtenga latitud y longitud de la base de datos SQLite para usarla en Android MapOverlay
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.