2016-09-26 64 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

尝试用'synchronized(mGoogleMap)'进行for循环。 –

+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() 
      { 
      } 
     }); 
    } 
} 

按预期工作 - 迭代所有标记和地图在这个地方满载后,使每个标记的屏幕截图。