2016-09-26 13 views
0

GoogleMapsで複数のスナップショットを完全にロードするにはどうすればよいですか? はこれで実験したが、もちろんのは、それが正常に動作しません:GoogleMapsの複数のスナップショット

button.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View view) 
    {    
     for (int i = 0; i < markers.size(); i++) 
     { 
      CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(new LatLng(markers.get(i).getLatitude(), markers.get(i).getLongitude())) 
        .zoom(15).build(); 
      mGoogleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

      GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() 
      { 
       Bitmap bitmap; 

       @Override 
       public void onSnapshotReady(Bitmap snapshot) 
       { 
        bitmap = snapshot; 
        try 
        { 
         String time = String.valueOf(System.currentTimeMillis()); 
         FileOutputStream out = new FileOutputStream("/mnt/sdcard/Android/data/com.app.my/files/" + time + ".png"); //just for test 
         bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
        } 
        catch (Exception e) 
        { 
         Log.e(LogTag.MY_FILTER_ERROR, "Screenshot error", e); 
        } 
       } 
      }; 

      mGoogleMap.snapshot(callback); 
     } 
    } 
}); 

それはスクリーンショットの必要量になりますが、マップを移動し、ロードする時間がありません。

+0

forループ内で 'synchronized(mGoogleMap)'を試してください。 –

+0

@PriyankPatel、ちょうど試しました。それは効果がなかった。すべてのスナップショットは同じ - 最後の場所を示します。 – badadin

答えて

0

私はそれをしました。誰も気にした場合:予想として

public void uploadScreenshots() 
{ 
    if (getRootActivity() != null) 
    { 
     iterator = 0; 
     map =... 
     sortedKeys =... 

     //move to the first marker 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(new LatLng(map.get(sortedKeys.get(iterator)).getLatitude(), map.get(sortedKeys.get(iterator)).getLongitude())) 
       .zoom(15).build(); 
     mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 1, new GoogleMap.CancelableCallback() 
     { 
      @Override 
      public void onFinish() 
      { 
       iterator++; 
       mGoogleMap.setOnMapLoadedCallback(new CallBackLoadMap()); 
      } 

      @Override 
      public void onCancel() 
      { 
      } 
     }); 

     //than recursively go to other markers 
     mGoogleMap.setOnMapLoadedCallback(new CallBackLoadMap()); 
    } 
} 

class CallBackLoadMap implements GoogleMap.OnMapLoadedCallback 
{ 
    @Override 
    public void onMapLoaded() 
    { 
     final GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() 
     { 
      Bitmap bitmap; 

      @Override 
      public void onSnapshotReady(Bitmap snapshot) 
      { 
       bitmap = snapshot; 
       try 
       { 
        String time = String.valueOf(System.currentTimeMillis()); 
        FileOutputStream out = new FileOutputStream("/mnt/sdcard/Android/data/com.app.my/files/" + time + ".png"); //just for test - do not hardcode in your project! 
        bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
        } 
        catch (Exception e) 
        { 
         Log.e(LogTag.MY_FILTER_ERROR, "Screenshot error", e); 
        } 
       } 
      }; 

     mGoogleMap.snapshot(callback); 

     if (iterator == sortedKeys.size()) 
      return; 

     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(new LatLng(map.get(sortedKeys.get(iterator)).getLatitude(), map.get(sortedKeys.get(iterator)).getLongitude())) 
       .zoom(15).build(); 

     mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 1, new GoogleMap.CancelableCallback() 
     { 
      @Override 
      public void onFinish() 
      { 
       iterator++; 
       mGoogleMap.setOnMapLoadedCallback(new CallBackLoadMap()); 
      } 

      @Override 
      public void onCancel() 
      { 
      } 
     }); 
    } 
} 

ワークス - 反復するすべてのマーカーを、マップが完全にこの場所にロードされた後、各マーカーのスクリーンショットを作成します。

関連する問題