VR全景图片显示(本地)
1.搭建VR图片开发的环境
1.1.导入从github搜索下载的google vr sdk 里面的引用库 common,commonwidget,panowidget(全景图片控件库)1.2.当前这三个库里面缺少序列相关的api,容易引用类找不到,未定义异常1.3.依赖三个库
compile
'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
compile project(
':common')
compile project(
':commonwidget')
compile project(
':panowidget')
1.4.准备全景图片用来测试代码 放在assets目录下面,例assets/a.jpg1.5.对当前应用进行内存设置,希望应用可使用最大内存 避免OOM
<application android:largeHeap="true"
2.加载全景图片到内存中成为Bitmap(bitmap是图片在内存中的表示对象),展示在全景图片控件
public class MainActivity extends AppCompatActivity {
private VrPanoramaView vrPanoramaView;
private ImageTask imageTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vrPanoramaView = (VrPanoramaView) findViewById(R.id.vr_pano);
imageTask =
new ImageTask();
imageTask.execute(
"a.jpg");
}
private class ImageTask extends AsyncTask<String,Void,Bitmap>
{
@Override
protected Bitmap
doInBackground(String... params) {
try {
InputStream inputStream = getAssets().open(params[
0]);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if(bitmap!=
null)
{
VrPanoramaView.Options options=
new VrPanoramaView.Options() ;
options.inputType= VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
VrPanoramaEventListener listener=
new VrPanoramaEventListener(){
@Override
public void onLoadError(String errorMessage) {
super.onLoadError(errorMessage);
Toast.makeText(MainActivity.
this, errorMessage, Toast.LENGTH_SHORT).show();
}
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
Toast.makeText(MainActivity.
this,
"进入VR图片显示...", Toast.LENGTH_SHORT).show();
}
};
vrPanoramaView.setEventListener(listener);
vrPanoramaView.loadImageFromBitmap(bitmap,options);
}
}
}
3.处理全景控件展示细节
@Override
protected void onPause() {
super.onPause();
if (vrPanoramaView !=
null) {
vrPanoramaView.pauseRendering();
}
}
@Override
protected void onResume() {
super.onResume();
if (vrPanoramaView !=
null) {
vrPanoramaView.resumeRendering();
}
vrPanoramaView.setInfoButtonEnabled(
false);
vrPanoramaView.setFullscreenButtonEnabled(
false);
vrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (vrPanoramaView !=
null) {
vrPanoramaView.shutdown();
}
if (imageTask !=
null && !imageTask.isCancelled()) {
imageTask.cancel(
true);
imageTask =
null;
}
}
}
全景视频显示
1.搭建全景视频的开发环境
1.1.导入github搜索google vr sdk 的开发库 common,commonwidget,videowidget1.2.依赖 当前三个库缺少的api
compile
'com.google.android.exoplayer:exoplayer:r1.5.10'
compile
'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
compile project(
':common')
compile project(
':commonwidget')
compile project(
':videowidget')
1.3.准备全景视频来测试程序 ,放到assets下面 例 assets/b.mp41.4. 设置应用的内存选项,在内存不足时可以使用最大内存.
<application android:largeHeap="true"
2.在线程加载全景视频,显示在全景视频控件上
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent">
<com.google.vr.sdk.widgets.video.VrVideoView
android:layout_width="match_parent"
android:id="@+id/vr_video_view"
android:layout_height="match_parent">
</com.google.vr.sdk.widgets.video.VrVideoView>
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/seekbar" />
<TextView
android:background="#AEAEAE"
android:textColor="#FFFFFF"
android:text="00/100s"
android:layout_width="wrap_content"
android:gravity="center"
android:layout_height="wrap_content"
android:id="@+id/time" />
</LinearLayout>
<ProgressBar
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:id="@+id/loading"
android:layout_height="wrap_content" />
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
private VrVideoView vrVideoView;
private VideoTask videoTask;
private ProgressBar progressBar;
private TextView timeView;
private SeekBar seekBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vrVideoView = (VrVideoView) findViewById(R.id.vr_video_view);
videoTask =
new VideoTask();
videoTask.execute(
"b.mp4");
seekBar = (SeekBar) findViewById(R.id.seekbar);
timeView = (TextView) findViewById(R.id.time);
progressBar = (ProgressBar) findViewById(R.id.loading);
}
private class VideoTask extends AsyncTask<String, Void, Void> {
@Override
protected Void
doInBackground(String... params) {
VrVideoView.Options options =
new VrVideoView.Options();
options.inputType = VrVideoView.Options.TYPE_MONO;
options.inputFormat = VrVideoView.Options.FORMAT_DEFAULT;
try{
vrVideoView.loadVideoFromAsset(params[
0], options);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
3.根据用户的操作来调整显示(性能优化,防止黑屏)
@Override
protected void onPause() {
super.onPause();
if (vrVideoView !=
null) {
vrVideoView.pauseRendering();
}
}
@Override
protected void onResume() {
super.onResume();
if (vrVideoView !=
null) {
vrVideoView.resumeRendering();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (vrVideoView !=
null) {
vrVideoView.shutdown();
}
if (videoTask !=
null && !videoTask.isCancelled()) {
videoTask.cancel(
true);
videoTask =
null;
}
}
4.监听加载过程 播放过程
VrVideoEventListener listener =
new VrVideoEventListener() {
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
progressBar.setVisibility(View.GONE);
}
@Override
public void onLoadError(String errorMessage) {
super.onLoadError(errorMessage);
progressBar.setVisibility(View.GONE);
Toast.makeText(MainActivity.
this, errorMessage, Toast.LENGTH_SHORT).show();
}
@Override
public void onNewFrame() {
super.onNewFrame();
seekBar.setMax((
int) vrVideoView.getDuration());
seekBar.setProgress((
int) vrVideoView.getCurrentPosition());
String curr = String.format(
"%.2f", vrVideoView.getCurrentPosition() /
1000f);
String total = String.format(
"%.2f", vrVideoView.getDuration() /
1000f);
timeView.setText(curr +
"/" + total +
"s");
}
@Override
public void onCompletion() {
super.onCompletion();
vrVideoView.seekTo(
0);
vrVideoView.pauseVideo();
isPasuse =
true;
Toast.makeText(MainActivity.
this,
"播放完成,是否重播", Toast.LENGTH_SHORT).show();
}
private boolean isPasuse =
false;
@Override
public void onClick() {
super.onClick();
if (isPasuse) {
vrVideoView.playVideo();
isPasuse =
false;
}
else {
vrVideoView.pauseVideo();
isPasuse =
true;
}
}
};
try {
vrVideoView.setEventListener(listener);
5.界面设置
在onCreate
vrVideoView.setInfoButtonEnabled(
false);
vrVideoView.setFullscreenButtonEnabled(
false);
vrVideoView.setDisplayMode(VrWidgetView.DisplayMode.EMBEDDED);
全景图片与视频(网络)
1.要求获取网络图片
2.4.1.获取网络流是差别
vrPanoramaView =
new VrPanoramaView(
this);
setContentView(vrPanoramaView);
imageTask =
new ImageTask();
imageTask.execute(item.url);
}
private class ImageTask extends AsyncTask<String,Void,Bitmap>
{
@Override
protected Bitmap
doInBackground(String... params) {
try {
URL url=
new URL(params[
0]);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
connection.setRequestMethod(
"GET");
connection.setConnectTimeout(
10000);
InputStream inputStream =connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if(bitmap!=
null)
{
VrPanoramaView.Options options=
new VrPanoramaView.Options() ;
options.inputType= VrPanoramaView.Options.TYPE_MONO;
VrPanoramaEventListener listener=
new VrPanoramaEventListener(){
@Override
public void onLoadError(String errorMessage) {
super.onLoadError(errorMessage);
Toast.makeText(VrImagePlayActivity.
this, errorMessage, Toast.LENGTH_SHORT).show();
}
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
Toast.makeText(VrImagePlayActivity.
this,
"进入VR图片显示...", Toast.LENGTH_SHORT).show();
}
};
vrPanoramaView.setEventListener(listener);
vrPanoramaView.loadImageFromBitmap(bitmap,options);
}
}
}
2.全景的网络视频
private class VideoTask extends AsyncTask<String, Void, Void> {
@Override
protected Void
doInBackground(String... params) {
VrVideoView.Options options =
new VrVideoView.Options();
options.inputType = VrVideoView.Options.TYPE_MONO;
options.inputFormat = VrVideoView.Options.FORMAT_DEFAULT;
VrVideoEventListener listener =
new VrVideoEventListener() {
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
progressBar.setVisibility(View.GONE);
}
@Override
public void onLoadError(String errorMessage) {
super.onLoadError(errorMessage);
progressBar.setVisibility(View.GONE);
Toast.makeText(VrVideoPlayActivity.
this, errorMessage, Toast.LENGTH_SHORT).show();
}
@Override
public void onNewFrame() {
super.onNewFrame();
seekBar.setMax((
int) vrVideoView.getDuration());
seekBar.setProgress((
int) vrVideoView.getCurrentPosition());
String curr = String.format(
"%.2f", vrVideoView.getCurrentPosition() /
1000f);
String total = String.format(
"%.2f", vrVideoView.getDuration() /
1000f);
timeView.setText(curr +
"/" + total +
"s");
}
@Override
public void onCompletion() {
super.onCompletion();
vrVideoView.seekTo(
0);
vrVideoView.pauseVideo();
isPasuse =
true;
Toast.makeText(VrVideoPlayActivity.
this,
"播放完成,是否重播", Toast.LENGTH_SHORT).show();
}
private boolean isPasuse =
false;
@Override
public void onClick() {
super.onClick();
if (isPasuse) {
vrVideoView.playVideo();
isPasuse =
false;
}
else {
vrVideoView.pauseVideo();
isPasuse =
true;
}
}
};
try {
vrVideoView.setEventListener(listener);
vrVideoView.loadVideo(Uri.parse(params[
0]),options);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
vrVideoView.loadVideo(Uri.parse(params[
0]),options);
3.注意网络问题
3.1.权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3.2.手机联网 3.3.服务器开启