• VR开发基础—全景图


    1、导入谷歌官方提供的库:

    commonwidget、common、panowidget(全景图)、videowidget(视频)
    或者添加依赖:
    dependencies {
        compile project(':libraries-common')
        compile project(':libraries-commonwidget')
        compile project(':libraries-panowidget')
    }
    版本要求:
    <uses-sdkandroid:minSdkVersion="19"android:targetSdkVersion="22"/>
    2、配置清单文件:
    <uses-permissionandroid:name="android.permission.INTERNET"/>
    <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <applicationandroid:label="SimpleVrPanoramaActivity"
        android:largeHeap="true"
        android:theme="@android:style/Theme.Holo.Light">
        <activityandroid:name=".SimpleVrPanoramaActivity">
            <intent-filter>
                <actionandroid:name="android.intent.action.MAIN"/>
                <categoryandroid:name="android.intent.category.LAUNCHER"/>
                <categoryandroid:name="com.google.intent.category.CARDBOARD"/>
            </intent-filter>
        </activity>
    </application>
    3、布局加载 全景资源(图片)控件
    <com.google.vr.sdk.widgets.pano.VrPanoramaView
        android:id="@+id/picView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.google.vr.sdk.widgets.pano.VrPanoramaView>
    4、初始化控件以及监控加载事件
    publicclassSimpleVrPanoramaActivityextendsActivity {
        privatestaticfinalString TAG ="VrPanorama";
        privateVrPanoramaViewpanoWidgetView;//上面说的Google提供给我们现实全景图片的View
        privateString fileUri ="first.jpg";//assets文件夹下的文件名
        privateOptionspanoOptions =newOptions();//VrPanoramaView需要的设置
        privateImageLoaderTask backgroundImageLoaderTask;//异步加载图片
    
        @Override
        protectedvoid onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_layout);
            panoWidgetView =(VrPanoramaView) findViewById(R.id.pano_view);//初始化VrPanoramaView
            panoWidgetView.setEventListener(newActivityEventListener());//为VrPanoramaView添加监听
            //如果有任务在执行则停止它
            if(backgroundImageLoaderTask !=null) {
                backgroundImageLoaderTask.cancel(true);
            }
            //设置inputType 为TYPE_STEREO_OVER_UNDER.
            panoOptions.inputType =Options.TYPE_STEREO_OVER_UNDER;
            //创建一个任务
            backgroundImageLoaderTask =newImageLoaderTask();
                //执行任务。将图片名(根据项目实际情况传)和设置传入
            backgroundImageLoaderTask.execute(Pair.create(fileUri, panoOptions));
        }
        //异步任务
        classImageLoaderTaskextendsAsyncTask<Pair<String,Options>,Void,Boolean>{
            @Override
            protectedBoolean doInBackground(Pair<String,Options>... fileInformation) {
                InputStream istr =null;
                try {
                    istr = getAssets().open(fileInformation[0].first);//获取图片的输入流
                    Bitmap bitmap =BitmapFactory.decodeStream(istr);//创建bitmap
                    //参数一为图片的bitmap,参数二为 VrPanoramaView 所需要的设置
                    panoWidgetView.loadImageFromBitmap(bitmap, fileInformation[0].second);
                } catch(IOException e) {
                    Log.e(TAG,"Could not decode default bitmap: "+ e);
                    returnfalse;
                }
                finally {
                    try{
                        istr.close();//关闭InputStream
                    } catch(IOException e) { //...}
                    }
                    returntrue;
                }
            }
            privateclassActivityEventListenerextendsVrPanoramaEventListener{
                @Override
                publicvoid onLoadSuccess() { //图片加载成功
                    Log.e(TAG,"onLoadSuccess");
                }
                @Override
                publicvoid onLoadError(String errorMessage) { //图片加载失败
                    Log.e(TAG,"Error loading pano: "+ errorMessage);
                }
                @Override
                publicvoid onClick() { //当我们点击了VrPanoramaView 时候出发
                    super.onClick();
                    Log.e(TAG,"onClick");
                }
                @Override
                publicvoid onDisplayModeChanged(int newDisplayMode) { //改变显示模式时候出发(全屏模式和纸板模式)
                    super.onDisplayModeChanged(newDisplayMode);
                    Log.e(TAG,"onDisplayModeChanged");
                }
            }
            @Override
            protectedvoid onPause() {
                panoWidgetView.pauseRendering();//暂停3D渲染和跟踪
                super.onPause();
            }
            @Override
            protectedvoid onResume() {
                super.onResume();
                panoWidgetView.resumeRendering();//恢复3D渲染和跟踪
            }
            @Override
            protectedvoid onDestroy() {
                panoWidgetView.shutdown();//关闭渲染下并释放相关的内存
                if(backgroundImageLoaderTask !=null) {
                    backgroundImageLoaderTask.cancel(true);//停止异步任务
                }
                super.onDestroy();
            }
        }
    5、界面其他元素设置:
    setFullscreenButtonEnabled (false);//隐藏全屏模式按钮
    setVrModeButtonEnabled(false);//隐藏VR模式按钮
    vrImage.setInfoButtonEnabled(false);//隐藏信息按钮
    6、Options参数:
    public static final int TYPE_MONO = 1;
    • 图像被预期以覆盖沿着其水平轴360度,而垂直范围是根据图像的宽高比来计算。
    • 例如,如果一个1000x250像素的图像,给出所述全景将覆盖360x90度与垂直范围是-45至+45度
    public static final int TYPE_STEREO_OVER_UNDER = 2;
    • 包含两个大小相等的投影 全景图垂直叠加。顶部图像被显示给左眼、底部图像被显示给右眼
    • 图像将覆盖沿水平轴360度,而垂直范围是根据图像的宽高比来计算。
    • 例如,如果一个1000x500像素的图像中给出(即1000x250像素/每个眼睛),全景将覆盖360x90度与垂直范围是-45至+45度。
  • 相关阅读:
    Navicat建表MySQL索引类型
    Feign调用全局异常处理解决
    ShardingJDBC、Mycat、drds对比
    MySQL之索引失效分析及优化相关
    SpringBoot2.X集成spring session redis实现session共享
    Redis的消息订阅/发布 Utils工具类
    MySQL索引类型区分
    handler使用(二)
    Android开发指南中文版(七)Content Providers
    Android消息处理(一)进程内通信
  • 原文地址:https://www.cnblogs.com/cangsir/p/6092197.html
Copyright © 2020-2023  润新知