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?

Estoy utilizando el OSM para una aplicación de mapeo en la que girar el mapa en la dirección de viaje como se explica aquí Android Rotación MapView . Esto funciona bien.

Sin embargo, todavía no he logrado ajustar el código dispatchTouchEvent para contrarrestar el efecto de rotación de mapa para el usuario toca (ahora mismo cuando el mapa se gira 90 grados el barrido horizontal del usuario moverá el mapa verticalmente). El código de ejemplo sólo ofrece el teaser:

public boolean dispatchTouchEvent(MotionEvent ev) { // TODO: rotate events too return super.dispatchTouchEvent(ev); } 

Cualquier orientación sería apreciada.

Y mientras estoy en ello – ¿Es todavía posible colocar los controles de zoom por separado, de modo que no giran cuando el mapa gira? Leí que el getZoomControls () está obsoleto. (Por qué ?)

One Solution collect form web for “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?”

Sé que es demasiado tarde pero puede ayudar a alguien …

Import org.osmdroid.views.overlay.MyLocationOverlay;

 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Canvas; import android.graphics.Matrix ; import android.hardware.Sensor; import android.os.BatteryManager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.RelativeLayout; /** * Rotate the Map in accordance to the movement of user and always point to North * */ public class RotatingRelativeLayout extends RelativeLayout { private Matrix mMatrix = new Matrix(); private float[] mTemp = new float[2]; private Context context; private static final float SQ2 = 1.414213562373095f; public RotatingRelativeLayout(final Context pContext, final AttributeSet pAttrs) { super(pContext, pAttrs); this.context=pContext; } @Override protected void dispatchDraw(Canvas canvas) { long rotateTime = MyLocationOverlay.getTimeOfMovement(); float overlayBearing = MyLocationOverlay.getBearing();//this method returns current bearing from OSM long currentTime = System.currentTimeMillis(); long diffTime = currentTime-rotateTime; /* * Here we rotate map in accordance with Compass to point always North * */ if(diffTime >= (40*1000 )){ //isBearing=false; overlayBearing=0; canvas.rotate(overlayBearing, getWidth() * 0.5f, getHeight() * 0.5f); } else /* * Rotate Map According to the user movement */ canvas.rotate(-overlayBearing, getWidth() * 0.5f, getHeight() * 0.5f); canvas.getMatrix().invert(mMatrix); final float w = this.getWidth(); final float h = this.getHeight(); final float scaleFactor = (float)(Math.sqrt(h * h + w * w) / Math.min(w, h)); canvas.scale(scaleFactor, scaleFactor, getWidth() * 0.5f, getHeight() * 0.5f); super.dispatchDraw(canvas); canvas.save(Canvas.MATRIX_SAVE_FLAG); canvas.restore(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { final int width = getWidth(); final int height = getHeight(); final int count = getChildCount(); for (int i = 0; i < count; i++) { final View view = getChildAt(i); final int childWidth = view.getMeasuredWidth(); final int childHeight = view.getMeasuredHeight(); final int childLeft = (width - childWidth) / 2; final int childTop = (height - childHeight) / 2; view.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int w = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); int h = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); int sizeSpec; if (w > h) { sizeSpec = MeasureSpec.makeMeasureSpec((int) (w*SQ2), MeasureSpec.EXACTLY); } else { sizeSpec = MeasureSpec.makeMeasureSpec((int) (h*SQ2), MeasureSpec.EXACTLY); } final int count = getChildCount(); for (int i = 0; i < count; i++) { getChildAt(i).measure(sizeSpec, sizeSpec); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override public boolean dispatchTouchEvent(MotionEvent event) { final float[] temp = mTemp; temp[0] = event.getX(); temp[1] = event.getY(); mMatrix.mapPoints(temp); event.setLocation(temp[0], temp[1]); return super.dispatchTouchEvent(event); } } 

Ahora solo usa este Layout Relativo en tu xml como este: –

 <YourPackageName.RotatingRelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/rotating_layout" android:layout_marginBottom="40dip"/> 

Y agrega Vista de Mapa Programatially like this: –

  // Find target container final RelativeLayout rl=(RelativeLayout)mParent.findViewById(R.id.rotating_layout); // Create rotator mRotator=new RotatingRelativeLayout(mParent, null); // Add map to the rotating layout // Add rotator to the screen rl.addView(mMap,new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

Aquí mParent es Contexto. Y una cosa más si te encuentras Pixel de imagen problema sólo tienes que usarlo

  //Paint distortion handling.. p.setFilterBitmap(true); 

Espero que lo explicó tan bien como pude …. no dude en preguntar si usted encuentra problema entenderlo.

Gracias.

  • ¿Puedo usar AnimationDrawable en una superposición en un MapView?
  • Google Maps versión-2 de Google muestra la dirección y el icono de mapa de Google
  • ¿Cómo mostrar un globo sobre un marcador en una MapActivity? ¿No hay un widget?
  • Asociar un objeto con Marker (google map v2)
  • Cómo mostrar el pin de ubicación de la parte visible de un mapview en android?
  • Google Maps Android API v2 - MarkerOptions métodos arrastrables y visibles
  • Androide, google, mapa, marcador, colocación
  • La imagen no se carga desde la URL en infoWindow personalizado con la biblioteca de carga de imágenes de Picasso en android
  • Excepción al usar MapView - java.lang.RuntimeException: stub
  • No se encontró la clase api v2 de Google Maps
  • Cómo actualizar el mapa de Google.
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.