我正在构建一个包含街景的Android应用程序。在某些情况下,我想手动设置相机POV。
我看了导游on Google's dev website,但我似乎无法让它发挥作用。
我可以在我的应用程序中显示街景,我可以移动相机,但它不会移动到我自定义的相机/ FOV。
我的Java代码:
package com.mycompany.appname;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.model.LatLng;
import java.util.Random;
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.StreetViewPanoramaCamera;
import com.google.android.gms.maps.model.StreetViewPanoramaOrientation;
public class RaceMap extends FragmentActivity implements OnStreetViewPanoramaReadyCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_race_map);
StreetViewPanoramaFragment streetViewPanoramaFragment =
(StreetViewPanoramaFragment) getFragmentManager()
.findFragmentById(R.id.streetviewpanorama);
streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
}
@Override
public void onStreetViewPanoramaReady(StreetViewPanorama panorama) {
long duration = 20;
float tilt = 30;
float bearing = 90;
StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder()
.zoom(panorama.getPanoramaCamera().zoom)
.bearing(bearing)
.tilt(tilt)
.build();
panorama.setPosition(new LatLng(52.208818, 0.090587));
panorama.setStreetNamesEnabled(false);
panorama.setZoomGesturesEnabled(false);
panorama.animateTo(camera, duration);
}
}
我的活动:
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.mycompany.appname.RaceMap"
android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
android:id="@+id/streetviewpanorama"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
答案 0 :(得分:2)
尝试设置超过500毫秒的持续时间,你会看到你想要的。 1秒就足够了。
final long duration = 1000;
panorama.animateTo(camera, duration);
我认为这可能是StreetView的一些错误。持续时间值小于500不能正常工作。或者地图没有足够的时间制作动画。
答案 1 :(得分:2)
我遇到了类似的问题,这似乎与应用setPosition()
的延迟有关,最终会超越相机位置动画。我的解决方案是在调用animTo()
之前等待位置更改。
我同意@pengrad关于非常短暂的动画持续时间
@Override
public void onStreetViewPanoramaReady(final StreetViewPanorama panorama) {
final long duration = 1000;
float tilt = 30;
float bearing = 90;
final StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder()
.zoom(panorama.getPanoramaCamera().zoom)
.bearing(bearing)
.tilt(tilt)
.build();
panorama.setPosition(new LatLng(52.208818, 0.090587));
panorama.setStreetNamesEnabled(false);
panorama.setZoomGesturesEnabled(false);
panorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
@Override
public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
if (streetViewPanoramaLocation != null) {
panorama.animateTo(camera, duration);
}
}
});
}
答案 2 :(得分:0)
如果要继续前进,请使用以下两种方法:
float difference(StreetViewPanoramaLink link) {
return Math.abs(panorama.getPanoramaCamera().bearing % 360 - link.bearing);
}
void moveForward() {
StreetViewPanoramaLink curLink = null;
for( int i=0; i < panorama.getLocation().links.length; i++) {
float differ = difference(panorama.getLocation().links[i]);
if(curLink == null) {
curLink = panorama.getLocation().links[i];
}
if(difference(curLink) > difference(panorama.getLocation().links[i])) {
curLink = panorama.getLocation().links[i];
}
}
panorama.setPosition(curLink.panoId);
}