Android Вращающийся MapView - PullRequest
5 голосов
/ 17 мая 2011

Я создаю приложение, которое отслеживает путь пользователя в просмотре карты.То, чего я хочу достичь, когда пользователь делает левый поворот, например, карта должна вращаться самостоятельно таким образом, чтобы верхняя часть вида карты всегда указывала в направлении вверх.Я надеюсь, что это имеет смысл.

Я натолкнулся на пост мистера Ромена Гая, и он говорит:

Я делал это в прошлом, и для этого требуется создать собственную группу ViewGroup, которая вращаетХолст в методе dispatchDraw ().Вам также нужно увеличить размер MapView (чтобы при повороте он рисовал достаточно пикселей). Вам также нужно будет вращать сенсорные события в dispatchTouchEvent ().Или, если вы используете Android 3.0, вы можете просто вызвать theMapView.rotate ():

Кто-нибудь сталкивался с каким-то решением, похожим на мой вопрос?Рабочий пример был бы превосходен:)

Ответы [ 3 ]

8 голосов
/ 17 мая 2011

Имейте в виду, что это не идеальный подход, поскольку текст на карте является статичным изображением и будет вращаться вместе с фрагментами карты (в какой-то момент он будет перевернут).

Вот пример того, как поместить MapView в свой собственный Layout виджет и повернуть его. Я сделал это с OpenStreetMaps, но это должно быть то же самое для Google Maps.

Сначала создайте «вращающийся» Layout виджет

package com.eli.util;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.widget.LinearLayout;

public class RotatingLinearLayout extends LinearLayout {

    private final int mDiagonal;
    private float mBearing;

    public RotatingLinearLayout(final Context pContext, final AttributeSet pAttrs) {
        super(pContext, pAttrs);
        final DisplayMetrics dm = pContext.getResources().getDisplayMetrics();
        mDiagonal = (int) Math.hypot(dm.widthPixels, dm.heightPixels);
    }

    public void setBearing(final float pBearing) {
        mBearing = pBearing;
    }

    @Override
    protected void dispatchDraw(final Canvas pCanvas) {
        pCanvas.rotate(-mBearing, getWidth() >> 1, getHeight() >> 1);
        super.dispatchDraw(pCanvas);
    }

    @Override
    protected void onMeasure(final int pWidthMeasureSpec,
            final int pHeightMeasureSpec) {
        final int widthMode = MeasureSpec.getMode(pWidthMeasureSpec);
        final int heightMode = MeasureSpec.getMode(pHeightMeasureSpec);
        super.onMeasure(MeasureSpec.makeMeasureSpec(mDiagonal, widthMode), MeasureSpec.makeMeasureSpec(mDiagonal, heightMode));
    }
}

Окружите его своим MapView в layout.xml

<com.eli.util.RotatingLinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/rotating_layout">
    <org.osmdroid.views.MapView
        android:id="@+id/map_view"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"/>
</com.eli.util.RotatingLinearLayout>

Теперь, каждый раз, когда вы получаете геопривязку, обновляйте направление вращающейся компоновки, и оно должно повернуться.

2 голосов
/ 27 августа 2012

Вот код, который работал для меня, чтобы иметь правильное центрирование вида

@Override
protected void dispatchDraw(final Canvas pCanvas) {
    int translateX = mDiagonal / 2 - screenWidth / 2;
    int translateY = mDiagonal / 2 - screenHeight / 2;

    pCanvas.translate(- translateX, - translateY);
    pCanvas.rotate(-mBearing, mDiagonal / 2, mDiagonal / 2);

    super.dispatchDraw(pCanvas);
}
0 голосов
/ 07 сентября 2012

Пример можно найти при установке android sdk

android-sdks/add-ons/addon-google_apis-google_inc_-8/samples/MapDemo

Но, возможно, вам придется изменить метод два бита, чтобы получить правильную ориентацию при касании события.

private class RotateView extends ViewGroup implements SensorListener {

/* ...  */

    private Matrix invertedMatrix = new Matrix();
    private float[] tempLocation = new float[2];


    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        canvas.rotate(mHeading, getWidth() * 0.5f, getHeight() * 0.5f);
        canvas.getMatrix().invert(invertedMatrix);
        mCanvas.delegate = canvas;
        super.dispatchDraw(mCanvas);
        canvas.restore();
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        centeringAllowed = false;

        float[] location = tempLocation;
        location[0] = ev.getX();
        location[1] = ev.getY();
        invertedMatrix.mapPoints(location);
        ev.setLocation(location[0], location[1]);
        return super.dispatchTouchEvent(ev);
    }
}

Этот класс является частью проекта MapDemo

...