ped*_*oca 18 android android-maps-v2
我正在使用这个布局的新Android地图V2:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"
map:cameraBearing="270"/>
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用newLatLngBounds(LatLngBounds bounds,int padding)方法来缩放和查看地图中的所有标记,但摄像机方位设置为0.
谷歌开发者文档中的描述说:
public static CameraUpdate newLatLngBounds(LatLngBounds bounds,int padding)(...).返回的CameraUpdate的轴承为0,倾斜度为0.(...)".
如何更改轴承值?
在调用newLatLngBounds之后,我尝试以编程方式设置新轴承,如下所示:
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
.target(mMap.getCameraPosition().target)
.zoom(mMap.getCameraPosition().zoom)
.bearing(270)
.build()));
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,一些标记将不会显示出来.
jQw*_*rdy 13
我有另一种选择,我有同样的问题.我将展示如何将边界转换为缩放,然后我们将简单地使用CameraPosition.builder()来创建正确的位置.
private static final double LN2 = 0.6931471805599453;
private static final int WORLD_PX_HEIGHT = 256;
private static final int WORLD_PX_WIDTH = 256;
private static final int ZOOM_MAX = 21;
public int getBoundsZoomLevel(LatLngBounds bounds, int mapWidthPx, int mapHeightPx){
LatLng ne = bounds.northeast;
LatLng sw = bounds.southwest;
double latFraction = (latRad(ne.latitude) - latRad(sw.latitude)) / Math.PI;
double lngDiff = ne.longitude - sw.longitude;
double lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;
double latZoom = zoom(mapHeightPx, WORLD_PX_HEIGHT, latFraction);
double lngZoom = zoom(mapWidthPx, WORLD_PX_WIDTH, lngFraction);
int result = Math.min((int)latZoom, (int)lngZoom);
return Math.min(result, ZOOM_MAX);
}
private double latRad(double lat) {
double sin = Math.sin(lat * Math.PI / 180);
double radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
}
private double zoom(int mapPx, int worldPx, double fraction) {
return Math.floor(Math.log(mapPx / worldPx / fraction) / LN2);
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用此代码并添加带有边界的方位/和/或倾斜:
LatLngBounds bounds = LatLngBounds.builder()
.include(swCorner)
.include(neCorner).build();
CameraPosition cp = new CameraPosition.Builder()
.bearing(randomBearing())
.tilt(randomTilt())
.target(latLng)
.zoom(getBoundsZoomLevel(bounds, findViewById(R.id.map).getMeasuredWidth(), findViewById(R.id.map).getMeasuredHeight()))
.build();
CameraUpdate cu = CameraUpdateFactory.newCameraPosition(cp);
mMap.animateCamera(cu);
Run Code Online (Sandbox Code Playgroud)
这将有效(您必须将mMap更改为实际的地图变量,将id更改为地图ID).
祝好运!我从post获得了boundZoomLevel:如何在使用map.fitBounds之前确定LatLngBounds的缩放级别? 如果你有时间,那就去那样的答案吧!
是的你可以!只需使用: https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap#animateCamera(com.google.android.gms.maps.CameraUpdate , int, com.google.android .gms.maps.GoogleMap.CancelableCallback)
并实现 CancelableCallback 并放入 onFinish() 方法: https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.CancelableCallback#onFinish()
更改轴承的代码。当然,您不会得到单个动画,而是两个动画链,但它会起作用!
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100)/*,DURATION_IN_MS_IF_NEEDED*/,new GoogleMap.CancelableCallback(){
@Override
public void onCancel() {
//DO SOMETHING HERE IF YOU WANT TO REACT TO A USER TOUCH WHILE ANIMATING
}
@Override
public void onFinish() {
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
/*.target(mMap.getCameraPosition().target)
.zoom(mMap.getCameraPosition().zoom)*/
.bearing(270)
.build()));
}
});
Run Code Online (Sandbox Code Playgroud)
我认为您不需要目标和缩放,我将它们注释掉,因为它应该由之前的动画管理
编辑 更好地查看API,我有一个可以工作的方法(我现在无法测试它,请看一下:拥有 LatLngBounds 你可以得到最适合该区域的缩放级别(这取决于在设备尺寸上,因此您必须在运行时获取视图尺寸),然后,当您进行缩放时(您还有 LatLngBounds 的中心),您可以使用一个独特的动画进行相机更新: https:// developers.google.com/android/reference/com/google/android/gms/maps/model/CameraPosition,构造函数允许设置值,或者您可以使用前面看到的构建器。
例如,您可以在网上找到各种方法来做到这一点(只需在线快速搜索即可获得javascript版本/sf/answers/929205301/)
希望这可以帮助您解决您的问题!
tom*_*man -4
Google 的 CameraUpdateFactory 上的坏问题我花了一些时间解决了它,时间跨度很小!
public void zoomToBounds() {
LatLngBounds latLngBounds = getBoundsOfInput(inputPoints);
final int PADDING = 20;
final CameraPosition now = map.getCameraPosition();
final float tilt = map.getCameraPosition().tilt;
final float bearing = map.getCameraPosition().bearing;
final LatLng[] target = new LatLng[1];
final float[] zoom = new float[1];
map.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, PADDING), 1, null);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
target[0] = map.getCameraPosition().target;
zoom[0] = map.getCameraPosition().zoom;
}
}, 10);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
map.animateCamera(CameraUpdateFactory.newCameraPosition(now), 1, null);
}
}, 30);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
map.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(target[0], zoom[0], tilt, bearing)));
}
}, 60);
}
Run Code Online (Sandbox Code Playgroud)
看起来很脏,但是有用
3 Handler 完成工作,每个后延迟必须大于前一个
| 归档时间: |
|
| 查看次数: |
10266 次 |
| 最近记录: |