2011-05-17 4 views
5

मैं एक ऐसा ऐप्लिकेशन बना रहा हूं जो मैपव्यू पर उपयोगकर्ताओं के पथ को कम करता है। उदाहरण के लिए जब उपयोगकर्ता बाएं मोड़ लेता है तो मैं इसे प्राप्त करना चाहता हूं, इसे मानचित्र को इस तरह से घूमना चाहिए कि नक्शादृश्य के प्रमुख को हमेशा ऊपर की ओर इंगित करना चाहिए। मुझे उम्मीद है कि इसका कोई अर्थ है।एंड्रॉइड घूर्णन MapView

मैं श्री रोमेन लड़का पद में आए एक वह

मैंने पहले भी यह किया है कहते हैं और यह एक कस्टम ViewGroup कि dispatchDraw() विधि में कैनवास घूमता है बनाने के लिए की आवश्यकता है। MapView के आकार को बढ़ाने के लिए आपको की आवश्यकता है (ताकि घुमाए जाने पर पर्याप्त पिक्सेल खींचें।) प्रेषण टचवेन्ट() में स्पर्श ईवेंट को घुमाने की भी आवश्यकता होगी। या यदि आप Android 3.0 का उपयोग आप बस theMapView.rotate() कॉल कर सकते हैं:

किसी को भी मेरे सवाल का कुछ समाधान समान करवाते आ गया है? एक कामकाजी उदाहरण उत्कृष्ट होगा :)

+0

मेरा उत्तर यहाँ देखें है: [एंड्रॉयड में घुमाएँ MapView] (http://stackoverflow.com/a/12126276/546054) – TouchBoarder

उत्तर

8

ध्यान रखें कि यह एक आदर्श दृष्टिकोण नहीं है, क्योंकि मानचित्र पर पाठ एक स्थिर छवि है और नक्शा टाइल्स के साथ घूमता है (कुछ बिंदु पर यह उल्टा हो जाएगा) ।

यहां एक उदाहरण है कि MapView को अपने Layout विजेट में कैसे डालें और इसे घुमाएं। मैंने इसे movMaps के साथ किया है, लेकिन यह Google मानचित्र के लिए काफी समान होना चाहिए।

पहले यह द्वारा "घूर्णन" 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)); 
    } 
} 

चारों ओर बनाने के अपने 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> 

अब में MapView, हर बार जब आप एक भू ठीक प्राप्त करते हैं, घूर्णन का असर अद्यतन लेआउट और इसे चालू करना चाहिए।

+0

हे, उत्तर के लिए धन्यवाद । मैंने घूर्णन लेआउट बनाने के लिए अपना कोड इस्तेमाल किया और यह काम करता है लेकिन दृश्य केंद्रित नहीं है। मेरा मतलब यह है कि लेआउट स्क्रीन से बड़ा है लेकिन यह केवल दाईं ओर और नीचे की तरफ से स्क्रीन से बाहर निकलता है। मैं 'RotatingLinearLayout' को केंद्रित करने के बारे में कैसे जाउंगा? – bughi

+0

@bughi मुझे प्रेषण में लगता है क्या आपको कैनवास को स्थानांतरित करने के लिए कुछ pCanvas.translate (x, y) करना होगा। हालांकि एक्स और वाई की बिल्कुल गणना कैसे करें मैं नहीं कह सकता। – Ridcully

2

यहाँ कोड है कि मेरे लिए काम किया

@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

आप 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 परियोजना का हिस्सा