2011-12-29 32 views
6

ここで説明するように、 マップを移動方向に回転させるマッピングアプリケーションにOSMを使用していますAndroid Rotating MapView。これはうまくいく。回転OpenStreetMapビュー - Androidで回転後に指の移動方向に地図をスワイプする方法は?

しかし、まだマップを90度回転させたとき今 ユーザの水平掃引が上下等 マップ移動するユーザのタッチ(のマップ回転効果に対抗するdispatchTouchEventコード を調整するために管理されていません)。サンプルコードは、ティーザーのみを提供しています。

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

ガイダンスをいただければ幸いです。

私がそれをしている間に - ズームの コントロールを別々に配置することは可能ですか?マップが回転しても回転しないようにしますか? getZoomControls()が推奨されなくなりました。 (なぜ?)

+0

回答があれば回答してください.... –

答えて

1

...

輸入org.osmdroid.views.overlay.MyLocationOverlayを私は手遅れに知っているが、それが誰かを助けること。ここmParentコンテキストで

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

- :

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

} 


    } 

今ちょうどこのようなあなたのXMLで、この相対的なレイアウトを使用します -

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

そして、このようにマップビューProgramatiallyを追加します。そして、あなたがイメージのピクセレーション発生した場合は、1つのより多くの事はあなただけ私はそれはのように良いあなたはそれを理解し、問題を見つけた場合、私は....お気軽にできたと説明し、それ

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

に希望を使用する必要がPROB。

ありがとうございました。

+0

K.Sharma私は自分のコードを試してみましたが、私は自分のアプリのマップにぶつかって問題に直面しています。ありがとうございます... – dharan

関連する問題