我有10个标记GoogleMap.我想尽可能放大并保持所有标记在视野中?在早期版本中,这可以实现,zoomToSpan()但在v2中,我不知道如何做到这一点.此外,我知道需要看到的圆的半径.
android google-maps google-maps-api-2 google-maps-android-api-2
其实我的问题是我没有得到当前的位置纬度和经度我尝试了很多方法.我知道这个问题已经问过我试过那个答案还是我还没有得到答案.请帮助我代码:
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().findFragmentById(
R.id.map)).getMap();
// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getApplicationContext(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
googleMap.setMyLocationEnabled(true);
Location myLocation = googleMap.getMyLocation(); //Nullpointer exception.........
LatLng myLatLng = new LatLng(myLocation.getLatitude(),
myLocation.getLongitude());
CameraPosition myPosition = new CameraPosition.Builder()
.target(myLatLng).zoom(17).bearing(90).tilt(30).build();
googleMap.animateCamera(
CameraUpdateFactory.newCameraPosition(myPosition));
Run Code Online (Sandbox Code Playgroud) 我的应用程序显示了一张地图,我希望用户无法滑过某个区域.所以我试图添加边界,但它会使应用程序崩溃.这是工作代码:
public class MapViewer extends Activity implements OnInfoWindowClickListener {
private LatLng defaultLatLng = new LatLng(42.564241, 12.22759);
private GoogleMap map;
private int zoomLevel = 5;
private Database db = new Database(this);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapviewer);
try {
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
if (map != null) {
map.setMyLocationEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
map.getUiSettings().setRotateGesturesEnabled(false);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(defaultLatLng, zoomLevel));
this.addMerchantMarkers(new MarkerOptions());
map.setOnInfoWindowClickListener(this);
}
} catch (NullPointerException e) {
e.printStackTrace();
}
}
@Override
public void onPause() {
if (map != null) {
map.setMyLocationEnabled(false);
map.setTrafficEnabled(false);
}
super.onPause();
} …Run Code Online (Sandbox Code Playgroud) 今天,回顾我的旧代码,我发现OnCameraChangeListener()现已弃用.
我发现很难理解如何修复我的这段代码:
mGoogleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
// Cleaning all the markers.
if (mGoogleMap != null) {
mGoogleMap.clear();
}
mPosition = cameraPosition.target;
mZoom = cameraPosition.zoom;
if (mTimerIsRunning) {
mDragTimer.cancel();
}
mDragTimer.start();
mTimerIsRunning = true;
}
});
Run Code Online (Sandbox Code Playgroud)
新的侦听器(又名OnCameraMoveListener())方法onCameraMove()没有CameraPosition cameraPosition输入变量,所以我很丢失:有没有办法回收我的旧代码?
这里有一些参考.
目前的Android Google Maps API要求您先mapFragment.getMapAsync使用a 调用OnMapReadyCallback才能访问GoogleMap.我假设一旦你有了GoogleMap它就可以安全地打电话,moveCamera()但我看到崩溃报告,IllegalStateException其中说Map size can't be 0. Most likely, layout has not yet occured for the map view.
所以我尝试添加一个ViewTreeObserver.OnPreDrawListener,并将moveCamera()调用移动到该onPreDraw方法,因为该文档说"在这一点上,树中的所有视图都已经过测量并给出了一个框架".但我仍然看到一些同样问题的崩溃报告.我找不到任何相关的文档 - 像CameraUpdateFactory.newLatLngBounds崩溃的诸如moveCamera之类的问题但它们在getMapAsyncAPI 之前已经过时,所以它们没有多大帮助.
我有一个Fragment的问题,它嵌入了新的Google Maps API中的SuportMapFragment.创建片段后,它会AsyncTask在onResume方法的开头提取一些数据.发生这种情况时,MapFragment仍然在屏幕外,而是显示进度条.
当AsyncTask完成后,我注册到onGlobalLayout的MapView的事件.然后我显示片段,这将导致地图视图显示和布局.onGlobalLayout被触发并开始动画.
这很好用了一段时间,直到我开始优化数据收集中的操作AsyncTask几乎立即完成.现在,应用程序通常会在启动时崩溃,更常见的是发布版本而不是调试版本,这就是为什么我认为我正在处理一个我不知道的竞争条件.
例外情况如下:
地图大小不应为0.很可能,地图视图尚未显示布局.
任何见解都非常感谢.
供参考:这是导致崩溃的代码:
// Hide status UI
this.progressBar.setVisibility(View.INVISIBLE);
this.statusTextView.setVisibility(View.INVISIBLE);
// Update state
this.uraDataDownloadFinished = true;
// Schedule map translation to occur when layout is complete
final View mapView = this.mapFragment.getView();
if (mapView.getViewTreeObserver().isAlive())
{
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()
{
@SuppressWarnings("deprecation")
@SuppressLint("NewApi") // We check which build version we are using.
@Override
public void onGlobalLayout()
{
Log.d(TAG, "onGlobalLayout()");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
{
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
else …Run Code Online (Sandbox Code Playgroud) 我有一个MapFragment显示地图
如果用户随地图离开活动(或设备进入睡眠状态)然后返回onResume被调用,我将地图移回标记.
但是当我移动相机时,我得到一个例外
07-23 16:28:42.725: E/AndroidRuntime(19095): java.lang.RuntimeException: Unable to resume activity {ecm2.android/ecm2.android.EMGNoteMapActivity}: java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2742)
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771)
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235)
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.os.Looper.loop(Looper.java:137)
07-23 16:28:42.725: E/AndroidRuntime(19095): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-23 16:28:42.725: E/AndroidRuntime(19095): at java.lang.reflect.Method.invokeNative(Native Method) …Run Code Online (Sandbox Code Playgroud) 在使用GoogleMap Lite的ViewHolder时,作为RecyclerView中行的一部分,我正在寻找回调来在Map准备就绪时设置引脚位置.我发现下面的两个功能.
OnMapLoadedCallback:https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback?hl = en
OnMapReadyCallback:https://developers.google.com/android/reference/com/google/android/gms/maps/OnMapReadyCallback
两者都证明有效和可用(如下所示).因此,我很困惑,如果他们确实有任何特定的不同行为,应该在不同的场合使用,或者他们确实相似,可以互换使用?
使用OnMapLoadedCallback:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), 0);
googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
googleMap.moveCamera(cameraUpdate);
}
});
Run Code Online (Sandbox Code Playgroud)
使用OnMapReadyCallback:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), 0);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.moveCamera(cameraUpdate);
}
});
Run Code Online (Sandbox Code Playgroud)
谢谢!!