2011-12-29 21 views
6

Estoy usando el OSM para una aplicación de mapeo donde I gira el mapa en la dirección de desplazamiento como se explica aquí Android Rotating MapView. Esto funciona bienVista giratoria de OpenStreetMap: ¿cómo deslizar el mapa en la dirección del movimiento del dedo después de la rotación en Android?

Sin embargo, todavía no he conseguido ajustar el código dispatchTouchEvent para contrarrestar el efecto de rotación de mapas para los toques de usuario (en este momento cuando el mapa se gira 90 grados barrido horizontal de un usuario se moverá el mapa verticalmente etc.) El código de ejemplo solo ofrece el avance:

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

Cualquier orientación sería apreciada.

Y mientras estoy en ello - ¿Todavía es posible colocar los controles del zoom por separado, para que NO giren cuando el mapa gira? He leído que getZoomControls() está en desuso. (¿Por qué?)

+0

Por favor, ayude si alguien sabe las respuestas por favor responda .... –

Respuesta

1

Sé que es demasiado tarde, pero puede ayudar a alguien ... org.osmdroid.views.overlay.MyLocationOverlay

importación;

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 sólo usar la disposición relativa en el xml de esta manera: -

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

y añadir el mapa Ver Programatially así: -

// 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í es mParent Contexto. Y una cosa más si se encuentra con imagen Pixelation prob sólo hay que utilizarlo

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

Espero haberme explicado tan bien como yo podría .... no dude en preguntar si encuentra un problema comprenderla.

Gracias.

+0

K.Sharma He intentado su código está funcionando bien, me enfrenta problema con cojinete en el mapa de mi aplicación está nervioso, ¿puede decirme cómo lo manejaste esto? .Gracias... – dharan

Cuestiones relacionadas