2010-12-09 14 views
6

जब मैं MapController.setZoom (x) का उपयोग करता हूं और, उदाहरण के लिए, स्तर 5 से 15 तक ज़ूम ज़ूम बहुत तेज़ प्रदर्शन करता है और अक्सर नए स्तर के मानचित्र टाइल्स लोड नहीं होते हैं।मैपव्यू में चिकना ज़ूम

यह उपयोगकर्ता के लिए इतना अच्छा नहीं लग रहा है। कोई भी मैप्स इसे धीमे ज़ूम में बदलने के लिए फ़ंक्शन में निर्मित करता है, इसलिए स्तर 15 तक पहुंचने से पहले टाइल्स लोड किया जा सकता है, या कम से कम लगभग लोड हो सकता है?

सादर

पी

+2

गति का एक बड़ा लाभ यह एनिमेटेड है वहाँ जाता है: बेकार भरी हुई छवियों की राशि है कम किया हुआ। नमूना @ 1ka और @ रूबेन के साथ काम करते समय, इसके परिणामस्वरूप 3 जी/यूएमटीएस नेटवर्क पर बहुत से बिटमैप लोडिंग कॉल पर 350 एमएम दूर फेंक दिया जाएगा। बैंडविड्थ का कचरा और कभी-कभी उपयोगकर्ता से शुद्ध धन होता है। यह भी सलाह दी जाती है कि पीसी-ब्राउज़र में भी Google मानचित्र इस तरह से काम करता है और हर किसी के लिए इसका उपयोग किया जाता है। कोई भी उम्मीद नहीं करता कि प्रदर्शित स्थान स्विच करते समय एक मानचित्र पहले ही लोड हो चुका है। – WarrenFaith

उत्तर

0

ऐसा करने के लिए कोई आसान तरीका है। हालांकि, मैं आपकी मदद कर सकता हूं।

import android.os.Handler; 

public class Tween { 

    public static interface TweenCallback { 
     public void onTick(float time, long duration); 
     public void onFinished(); 
    } 

    long start; 
    long duration; 
    Handler handler; 
    TweenCallback callback; 

    public Tween(TweenCallback callback) {  
     handler = new Handler(); 
     this.callback = callback; 
    } 
    public void start(final int duration) { 
     start = android.os.SystemClock.uptimeMillis(); 
     this.duration = duration; 
     tickRunnable.run(); 
    } 
    public void stop() { 
     handler.removeCallbacks(tickRunnable); 
    } 
    Runnable tickRunnable= new Runnable() { 
     public void run() { 
      long now = android.os.SystemClock.uptimeMillis(); 
      float time = now - start; 
      boolean finished = (time >= duration); 
      if (finished) { 
       time = duration; 
      } 
      callback.onTick(time, duration); 
      if (!finished) { 
       handler.post(tickRunnable); 
      } 
      else { 
       callback.onFinished(); 
      } 
     } 
    }; 

    // 
    // Tweening functions. The 4 parameters are : 
    // 
    // t - time, ranges from 0 to d 
    // b - begin, i.e. the initial value for the quantity being changed over time 
    // c - change, the amount b will be changed by at the end 
    // d - duration, of the transition, normally in milliseconds. 
    // 
    // All were adapted from http://jstween.sourceforge.net/Tween.js 
    // 
    public static float strongEaseInOut(float t, float b, float c, float d) { 
     t/=d/2; 
     if (t < 1) return c/2*t*t*t*t*t + b; 
     return c/2*((t-=2)*t*t*t*t + 2) + b; 
    } 
    public static float regularEaseIn(float t, float b, float c, float d) { 
     return c*(t/=d)*t + b; 
    } 
    public static float strongEaseIn(float t, float b, float c, float d) { 
     return c*(t/=d)*t*t*t*t + b; 
    } 
} 

मैं क्या सुझाव है कि आप एक बीच के साथ संयोजन के रूप में MapController.zoomToSpan() का उपयोग है ... यहाँ कुछ पूरी तरह से है:

सबसे पहले, यहाँ मेरी निजी उपयोगिता वर्गों में से एक की एक मुफ्त उपहार, Tween.java है अवांछित कोड जो काम करना चाहिए, शायद एक चिमटा या दो के साथ, आप इसे लक्ष्य लैट & लोन स्पैन पास कर सकते हैं। :

public void slowZoom(int latE6spanTarget, int lonE6spanTarget) { 
    final float initialLatE6span = mapView.getLatitudeSpan(); 
    final float initialLonE6span = mapView.getLongitudeSpan(); 
    final float latSpanChange = (float)(latE6spanTarget - initialLatE6span); 
    final float lonSpanChange = (float)(lonE6spanTarget - initialLonE6span); 
    Tween tween = new Tween(new Tween.TweenCallback() { 
     public void onTick(float time, long duration) { 
      float latSpan = Tween.strongEaseIn(time, initialLatE6span, latSpanChange, duration); 
      float lonSpan = Tween.strongEaseIn(time, initialLonE6span, lonSpanChange, duration); 
      mapView.getController().zoomToSpan((int)latSpan, (int)lonSpan); 
     } 
     public void onFinished() { 
     } 
    }); 
    tween.start(5000); 
} 
+0

धन्यवाद रूबेन! मैंने कोशिश की है लेकिन प्रत्येक टिक पर (ऑनट() कॉलबैक में) यह मैपव्यू अपडेट नहीं करता है, जो मैं करता हूं कि यह विधि mapView.getController()। ZoomToSpan ((int) latSpan, (int) lonSpan); अभी के लिए यह फोन में दिखता है जैसे कि यह 5 सेकंड के लिए रुकता है और ज़ूम से पिछले स्तर तक रहता है। कोई विचार? –

+1

ओह नरक, मैं शर्त लगाता हूं कि ज़ूम टॉस्पैन अपनी खुद की एनीमेशन शुरू करता है ... यह बहुत परेशान है। बहुत अफसोस। अगर आप केवल एक फ्लोटिंग-पॉइंट ज़ूम स्तर सेट कर सकते हैं तो यह काम करेगा ... Google मानचित्र कक्षाएं कितनी कमजोर हैं। –

8

एक आसान तरीका विधि MapController.zoomIn() कि एक कदम स्तर जूमिंग के लिए कुछ सरल एनीमेशन प्रदान करता है का लाभ लेने के लिए है।

यहाँ कुछ कोड है:

// a Quick runnable to zoom in 
    int zoomLevel = mapView.getZoomLevel(); 
    int targetZoomLevel = 18; 

    long delay = 0; 
    while (zoomLevel++ < targetZoomLevel) { 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mapController.zoomIn(); 
      } 
     }, delay); 

     delay += 350; // Change this to whatever is good on the device 
    } 

क्या यह करता है देरी runnables प्रत्येक जिनमें से एक का एक अनुक्रम बनाने के पिछले एक के बाद zoomin() 350ms फोन होगा।

मतलब यह है कि आप एक हैंडलर आपका मुख्य यूआई धागा से जुड़ी 'हैंडलर'

:-) कहा जाता है

+0

आप धीमी गति से महसूस करने के लिए स्तर 18 तक पहुंचने के साथ ही बड़ी देरी भी जोड़ सकते हैं। –

+0

बैंडविड्थ पर वॉरेनफैथ की टिप्पणी के संबंध में, उपर्युक्त उपयोगकर्ता स्क्रीन पर बटन का उपयोग करके मैन्युअल रूप से ज़ूम इन और आउट करने के लिए अलग नहीं है। 350 की देरी के साथ मुझे निरंतर ज़ूम मिलता है, लेकिन छवि का कोई प्रतिपादन नहीं होता है। मुझे लगता है कि नक्शा दृश्य प्रतीक्षा करने के लिए पर्याप्त चालाक है जब तक कि टाइल अनुरोध करने से पहले सभी गतिविधि बंद नहीं हो जाती है। लेकिन निश्चित रूप से आईडीके। –

संबंधित मुद्दे