Java 在我的应用程序中使用街景虚拟现实
我正在使用Android Studio,并尝试在VR中显示一些选定的街景路径。我已经有街景运行良好,现在我正试图在虚拟现实中显示它 我已经将Java 在我的应用程序中使用街景虚拟现实,java,android,virtual-reality,google-street-view,Java,Android,Virtual Reality,Google Street View,我正在使用Android Studio,并尝试在VR中显示一些选定的街景路径。我已经有街景运行良好,现在我正试图在虚拟现实中显示它 我已经将com.google.vr.sdk.widgets.pano.VrPanoramaView放在布局中,在我的类的onCreate中,通过findviewbyd将其引用到VrPanoramaView变量。现在我试图显示一个调用我在这个类中定义的方法loadPanoImage的图像。此方法从存储器加载图像,并通过loadImageFromBitmap显示图像 问
com.google.vr.sdk.widgets.pano.VrPanoramaView
放在布局中,在我的类的onCreate中,通过findviewbyd
将其引用到VrPanoramaView
变量。现在我试图显示一个调用我在这个类中定义的方法loadPanoImage的图像。此方法从存储器加载图像,并通过loadImageFromBitmap
显示图像
问题是它无法显示任何内容,即使我遵循了指南,并且我已经按照显示的方式完成了所有操作。我甚至尝试在代码的不同部分调用它(在执行任何其他操作之前、单击按钮之前、显示streetview之前和之后),但我不明白为什么它不工作,以及如何使用它显示从streetview拍摄的图像(我不知道我是否能够以友好的方式完成它,或者我应该下载它们并将它们放入存储器中)
我把部分代码作为参考:
public class VrExperience extends FragmentActivity {
Button buttonCitta;
Button buttonMare;
Button buttonMontagna;
TextView titleTextView;
// George St, Sydney
private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
// LatLng with no panorama
private static final LatLng INVALID = new LatLng(-45.125783, 151.276417);
//VrPanoramaView is inserted in the layout
private VrPanoramaView panoWidgetView;
//StreetViewPanorama is another class in my project which shows Street View
private StreetViewPanorama mStreetViewPanorama;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vrexperiences);
panoWidgetView = (VrPanoramaView) findViewById(R.id.pano_view);
panoWidgetView.setEventListener(new VrPanoramaEventListener());
//download image and show it, but it doesn't show anything
loadPanoImage();
titleTextView = (TextView) findViewById(R.id.titleTextView);
buttonCitta = (Button) findViewById(R.id.buttonCitta);
buttonCitta.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!checkReady()) {
return;
}
titleTextView.setVisibility(View.GONE);
buttonCitta.setVisibility(View.GONE);
buttonMare.setVisibility(View.GONE);
buttonMontagna.setVisibility(View.GONE);
loadPanoImage(); //it doesn't show anything
mStreetViewPanorama.setPosition(SYDNEY);
loadPanoImage(); //it doesn't show anything
}
}};
//code for buttonMontagna and buttonMare as well, it's identical
SupportStreetViewPanoramaFragment streetViewPanoramaFragment =
(SupportStreetViewPanoramaFragment)
getSupportFragmentManager().findFragmentById(R.id.streetviewpanorama);
streetViewPanoramaFragment.getStreetViewPanoramaAsync(
new OnStreetViewPanoramaReadyCallback() {
@Override
public void onStreetViewPanoramaReady(StreetViewPanorama panorama) {
mStreetViewPanorama = panorama;
// Only set the panorama to INVALID on startup (when no panoramas have been
// loaded which is when the savedInstanceState is null).
if (savedInstanceState == null) {
mStreetViewPanorama.setPosition(INVALID);
}
}
});
}
/**
* When the panorama is not ready the PanoramaView cannot be used. This should be called on
* all entry points that call methods on the Panorama API.
*/
private boolean checkReady() {
if (mStreetViewPanorama == null)
return false;
return true;
}
/**
* Called when the Animate To Invalid button is clicked.
*/
public void onGoToInvalid(View view) {
if (!checkReady()) {
return;
}
mStreetViewPanorama.setPosition(INVALID);
}
//retrieves image from the assets folder and loads it into the VrPanoramaView
private void loadPanoImage() {
VrPanoramaView.Options options = new VrPanoramaView.Options();
InputStream inputStream = null;
AssetManager assetManager = getAssets();
try {
inputStream = assetManager.open("demo2.jpg");
options.inputType = VrPanoramaView.Options.TYPE_MONO;
panoWidgetView.loadImageFromBitmap(
BitmapFactory.decodeStream(inputStream), options
);
inputStream.close();
} catch (IOException e) {
Log.e("Fail", "Exception in loadPanoImage" + e.getMessage());
}
}
@Override
protected void onPause() {
panoWidgetView.pauseRendering();
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
panoWidgetView.resumeRendering();
}
@Override
protected void onDestroy() {
panoWidgetView.shutdown();
super.onDestroy();
}
}
这是我的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vrExperienceActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.vr.sdk.widgets.pano.VrPanoramaView
android:id="@+id/pano_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:layout_weight="5"
android:scrollbars="none" />
<TextView
android:id="@+id/titleTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:text="VR Experience"
android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="#0000F0"
android:visibility="visible" />
<Button
android:id="@+id/buttonCitta"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Città" />
<fragment
class="com.google.android.gms.maps.SupportStreetViewPanoramaFragment"
android:id="@+id/streetviewpanorama"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
编辑:@LucioBa) 这些地方我试着称之为loadPanoImage,但它们都没有显示任何东西。当调用该方法时,程序将继续执行其他任务。我希望在点击按钮时,图像可以直接在VR中显示,或者如果无法在街景模式下添加经典的纸板按钮,则可以传递到VR视图。
b) 我的意思是代码没有达到我期望的效果。我认为,一旦我在布局中创建了VrPanoramaView,并使用它通过
显示图像。loadImageFromBitmap
它就会显示我从资产加载的图像(我有一个保存在虚拟SD上的图像),并且一旦我能够对单个图像执行此操作,我就会找到一种在整个路径上执行此操作的方法。代码没有给出任何异常,我认为我犯了一个逻辑错误,或者我不理解VR api是如何工作的
编辑:我发现java代码正在运行,问题在于布局不允许查看VrPanoramaView,因为它被StreetViewPanorama遮挡了Hi@OrokyC!为了帮助您,我需要知道一些事情:a)为什么在三个地方调用loadPanoImage()?哪一个是正确的?我想这是onClick处理器的最后一行了。b) 你说代码不起作用是什么意思?你有例外吗?您是否尝试过调试它,并查看它在哪里中断?通过编辑原始问题添加此解释,以便我们可以帮助您了解问题的原因。谢谢