google vr 入门之VrPanoramaView制作全景图列表

google vr 入门之VrPanoramaView制作全景图列表,apm应用性能管理 思路就是这么简单,这里的全景图我们需要对应的全景图控件来显示,google vr 中有对应的全景图控件VrPanoramaView,google vr 的核心是其父类VrWidgetView,VrPanoramaView和VrVideoView是一对孪生兄弟,分别用来显示全景图和播放全景视频(google vr 视频播放即VrVideoView的使用请参考google vr 入门之制作简易的VR播放器及去除界面 控制按钮),今天我们用到的是全景图的显示功能,使用VrPanoramaView非常简单: // 阅读详情


上图的效果想必大家在很多VR App中都见过,下面介绍一种简单的实现方法:

大家可以看到,其实只不过是一个展示图片效果的列表,但是当你滑动到某个位置停止时,对应的条目被激活了,这张图片的全景图便开始动态的显示活动了,原理就是这么简单,那我们如何实现呢?

思路:

1. 首先我们需要一个展示图片的列表(ListView、RecycleView)

2. 列表的每个item展示对应的平面图

3. 对列表进行滑动监听,停止滑动时对应条目的全景图激活显示

4. 页面加载,默认首先要显示第一个item的全景图

思路就是这么简单,这里的全景图我们需要对应的全景图控件来显示,google vr 中有对应的全景图控件VrPanoramaView,google vr 的核心是其父类VrWidgetView,VrPanoramaView和VrVideoView是一对孪生兄弟,分别用来显示全景图和播放全景视频(google vr 视频播放即VrVideoView的使用请参考google vr 入门之制作简易的VR播放器及去除界面控制按钮),今天我们用到的是全景图的显示功能,使用VrPanoramaView非常简单:

// 使用google vr VrPanoramaView 添加的
    compile 'com.google.vr:sdk-audio:1.40.0'
    compile 'com.google.vr:sdk-base:1.40.0'
    compile 'com.google.vr:sdk-panowidget:1.40.0'
我们要用的VrPanoramaView在sdk-panowidget库中,这里使用1.40.0版本是为了去除android 7.0手机没有使用google vr服务弹出警告对话框的问题( 详情请点击)。
准备工作已经完成下面开始写代码了:

展示图片的列表我这里使用RecycleView,activity_main.xml

<?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"
    tools:context="com.qj.vrpanoramaviewlist.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycleview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>
mRecyclerView = (RecyclerView) findViewById(R.id.recycleview);
//全景图控件初始化
 vrPanoramaView = new VrPanoramaView(this);
 vrPanoramaView.setStereoModeButtonEnabled(false);//眼镜模式按钮禁掉
 vrPanoramaView.setFullscreenButtonEnabled(false); //全屏模式按钮禁掉
 vrPanoramaView.setInfoButtonEnabled(false); //信息按钮禁掉
 vrPanoramaView.setTouchTrackingEnabled(true); //开启手触模式

 options = new VrPanoramaView.Options();
 options.inputType = VrPanoramaView.Options.TYPE_MONO;
为RecycleView准备数据,设置适配器
//准备数据,这里模拟假数据
mDatas = new ArrayList<String>();
for (int i = 'A'; i < 'M'; i++) {
    mDatas.add(String.valueOf((char) i));
}
mSize = mDatas.size();
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new HomeAdapter();
mRecyclerView.setAdapter(mAdapter);
看看HomeAdapter的内容:
class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == PANORAMA_ITEM) {
            return new VrPanoramaViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_panorama, parent, false));
        } else {
            return new FooterHolder(LayoutInflater.from(mContext).inflate(R.layout.item_footer, parent, false));
        }
    }
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (mSize - position > 2) {
            VrPanoramaViewHolder h = (VrPanoramaViewHolder) holder;
            h.tv.setText(mDatas.get(position));
            h.iv.setBackgroundResource(plan[position]);
            if (isFirstTime) {//首次进入要显示第一个item的全景
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), vr[0]);
                vrPanoramaView.loadImageFromBitmap(bitmap, options);
                h.iv.addView(vrPanoramaView);
                currentPos = 0;
                isFirstTime = false;
            }
        } else if (position == mSize - 1) {
            FooterHolder h = (FooterHolder) holder;
            h.tv.setText("到底啦...");
        }
        Log.e(TAG, "onBindViewHolder: " + position);
    }
    @Override
    public int getItemCount() {
        return mSize;
    }
    @Override
    public int getItemViewType(int position) {
        if (mSize - position > 2) {
            return PANORAMA_ITEM;//全景图类型的item
        } else {
            return FOOTER_ITEM;//底部填充的两个item
        }
    }
    class VrPanoramaViewHolder extends RecyclerView.ViewHolder {//全景图的Holder
        FrameLayout iv;
        TextView tv;
        public VrPanoramaViewHolder(View view) {
            super(view);
            iv = (FrameLayout) view.findViewById(R.id.iv_content);
            tv = (TextView) view.findViewById(R.id.content_name);
        }
    }
    class FooterHolder extends RecyclerView.ViewHolder {//底部填充的Holder
        TextView tv;
        public FooterHolder(View view) {
            super(view);
            tv = (TextView) view.findViewById(R.id.footer_tv);
        }
    }
}
对RecycleView添加滚动监听:
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
    int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
    int pos = lastVisibleItemPosition - 2;
    if (RecyclerView.SCROLL_STATE_IDLE == newState) {//停止滑动
        showPanorama(pos);
    } else {
        if (pos == currentPos || currentPos < 0)//目前正在显示不能移除
            return;
        ViewParent parent = vrPanoramaView.getParent();
        if (parent != null) {//防止在滑动过程中发现被复用的全景图控件
            ViewGroup viewGroup = (ViewGroup) parent;
            viewGroup.removeView(vrPanoramaView);
            currentPos = -1;//此处赋值表示全景图控件没有处在任何item的位置
        }
    }
    super.onScrollStateChanged(recyclerView, newState);
}
这是RecycleView滚动监听回调的方法,在回调中我们得到屏幕中最后一个可见的item的postion,即lastVisibleItemPosition,我们关心的不是这个条目,而是它的上上一个条目,故而才有了int pos = lastVisibleItemPosition - 2;这句代码,pos才是我所关心的(默认一屏幕最少显示三个item最多显示4个item,当前屏幕中最后一个可见的item位于屏幕中第3个或者是第4个的位置,该位置的上上一个item位于屏幕的中间靠上区域内,这个区域的条目显示全景图,用户看着会比较舒服),当停止滑动后,显示全景图:
private void showPanorama(int pos) {
    if (pos == currentPos)//防止重复,做无用功
        return;
    HomeAdapter.VrPanoramaViewHolder childViewHolder = (HomeAdapter.VrPanoramaViewHolder) mRecyclerView.findViewHolderForAdapterPosition(pos);
    ViewParent parent = vrPanoramaView.getParent();
    if (parent != null) {
        ViewGroup viewGroup = (ViewGroup) parent;
        viewGroup.removeView(vrPanoramaView);
    }
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), vr[pos]);
    vrPanoramaView.loadImageFromBitmap(bitmap, options);
    childViewHolder.iv.addView(vrPanoramaView);
    currentPos = pos;
}
该方法是显示RecycleView对应位置item的全景图,全景图也是一个View,只需要通过addView的形式将其添加到对应的item上即可,添加之前加载该item的全景图片。
以上是根据上面提到的思路贴出了对应的代码以及对代码做了简要的分析,实现一个全景图列表其实就是这么简单,这只是一篇入门级别的文章,我们的全景图列表是在Activity中做的,没有搭建项目框架,如果在Fragment页面中加载会比这个复杂一些,后期文章会继续跟进,欢迎大家继续关注!

.apk下载


源码下载

2024年Go最全google vr 入门之VrPanoramaView制作全景图列表(1),2024年最新Golang最新面试题及答案 class VrPanoramaViewHolder extends RecyclerView.ViewHolder {//全景图的Holder。class FooterHolder extends RecyclerView.ViewHolder {//底部填充的Holder。//全屏模式按钮禁掉。//眼镜模式按钮禁掉。if (isFirstTime) {//首次进入要显示第一个item的全景。//全景图类型的item。//底部填充的两个item。//准备数据,这里模拟假数据。//全景图控件初始化。 阅读详情

相关推荐

二、VR全景图显示器开发 ---- Android VR视频/Google VR for Android /VR Pano/VR Video

原文地址: 这篇看下SimpleVrPanorama这个栗子 SimpleVrPanorama其实这篇应该写SimpleVrPanorama和simplevideowidget 两个,但是由于篇幅过长就分开写了演示用AS录的没有触摸点显示,先凑合看吧介绍官方在这里介绍了VR view 、支持平台等。我挑几个相对重要的介绍一下: 1、图像规格 VR查看图像可以保存为PNG,JPEG或GIF。G

光光的博客 1万+

Unity插件——VR Panorama 360 PRO Renderer 全景视频录制使用入门

前言:本文章为本人自己学习总结所得,简单介绍了VR Panorama 360 PRO Renderer 录制全景视频使用方法介绍。 插件使用——VR Panorama 360 PRO Renderer 全景视频录制使用入门 一, 开发环境 VR Panorama 360 PRO Renderer 2.9.9 Unity2018.3 VS2019 二,导入插件 将插件拖拽到Project面板下即可;...

明哲的博客 8691

VR Panorama

unity3d的VR全景图截取

移动端vr技术探索之VrPanoramaView

VR技术的热度每年都在增长,在购物、旅游等方面运用度很高。该项目引用了Google的vr:sdk-panowidget依赖库,通过VrPanoramaView,简单实现在手机上查看全景照片,下面是项目介绍。 google官网开发指南 支持模式:支持vr和全景模式 输入格式 :bitmap 或 byte[] 回调:加载成功、失败 点击 切换模式 适用于场景: 手机端: 影人展示 电影海报 电影院展示等 vr硬件: vr电影院 总结 在手机端是以辅助全面展示效果的作用 (在原有的大图模...

qq_36544007的博客 1486

VRPanoramaView:适用于Android的VR PanoramaView

ZPanoramaView 单个全景图展示 全景图列表展示 使用说明 dependencies { ... //当前版本 1.0.1,可持续关注 github 上的 release 版本 implementation "com.github.androidZzT:VRPanoramaView:1.0.1" } 支持功能 1.工程中提供 demo,展示了单个全景图和全景图列表的简单用法 单个全景图像使用普通的控件一样即可 全景图列表需要根据需求决定一页最多显示几个,然后手动复用控件,否则控件对象过多会造成OOM 2.控件提供的方法 1.提供图片url,加载渲染全景图 #setBitmapUrl(String url) 2.恢复初始角度 #reCenter() 3.开关陀螺仪 #setGyroTrackingEnabled(boolean enable) 后续还会增加手势拖拽全景

手把手教你搞定爱思唯尔LaTeX投稿:从模板到PDF生成的全流程避坑指南

本文详细介绍了使用LaTeX投稿爱思唯尔期刊的全流程避坑指南,包括模板选择、文件结构规范、投稿系统文件上传策略、PDF生成与检查等关键步骤。特别强调了避免常见错误如宏包冲突、图片丢失和参考文献问题,并提供了投稿后的应急方案和高阶自动化校验脚本,帮助研究者顺利完成投稿。

weixin_42525289的博客 506

google vr 入门之VrPanoramaView制作全景图列表,斗鱼Android开发二面被刷

xmlns:tools=“http://schemas.android.com/tools” android:id="@+id/activity_main" android:layout_width=“match_parent” android:layout_height=“match_parent” tools:context=“com.qj.vrpanoramaviewlist.MainActivity”> <android.support.v7.widget.RecyclerView an

m0_65146387的博客 1220

Mask2former自定义数据集实现滑坡语义分割

先介绍一下这次用的数据集:Bijie Landslide Dataset,是武汉大学在Triplesat卫星上裁剪的数据集,包含770张滑坡(image、mask、dem、边界坐标txt)和2003张非滑坡数据(dem、image)。直接在ade20k修改,按照路径和设置将预处理数据放好,该步骤很快就能结束,打开的图片是全黑的,因为0和1在图片上肉眼较难区分。bijie的数据集可以直接使用,接下去的步骤是1、预处理数据。配置文件修改训练类别和训练类型,由于我们分割的是滑坡,所以进行语义分割。

weixin_57812838的博客 2214

最全google vr 入门之VrPanoramaView制作全景图列表(2),2024年最新附答案+考点

思路就是这么简单,这里的全景图我们需要对应的全景图控件来显示,google vr 中有对应的全景图控件VrPanoramaView,google vr 的核心是其父类VrWidgetView,VrPanoramaView和VrVideoView是一对孪生兄弟,分别用来显示全景图和播放全景视频(google vr 视频播放即VrVideoView的使用请参考。if (isFirstTime) {//首次进入要显示第一个item的全景。// 使用google vr VrPanoramaView 添加的。

2401_84910839的博客 4891

【rt-thread实战解析】从零到一:基于STM32与LAN8720A的以太网驱动配置全流程

本文详细解析了在RT-Thread操作系统上为STM32F407配置LAN8720A以太网驱动的全流程。从硬件连接自查、CubeMX工程创建、PHY复位函数编写,到RT-Thread工程配置、LwIP协议栈集成,最后进行实际上电测试与网络调试,手把手指导开发者避开常见陷阱,实现稳定的以太网连接。

m2n3b4v5c6的博客 524

Nengo神经工程框架:脉冲神经网络的实时编译与硬件部署

脉冲神经网络(SNN)作为类脑计算的核心范式,正从生物模拟走向工程落地。其本质是用离散脉冲建模神经动力学,关键在于实现可预测、可复现的神经行为而非单纯拟合函数。Nengo基于神经工程学框架(NEF),将动态系统理论与硬件约束深度融合,通过解析式权重计算、确定性时间步长(dt)和多后端编译能力,支撑从CPU仿真到Loihi/FPGA的端到端部署。它不替代深度学习框架,而是提供面向神经形态芯片的‘神经编译器’能力,使LIF神经元参数、突触动力学与硬件时序严格对齐,显著提升实时性、能效比与物理可解释性。

weixin_32533659的博客 636

google vr 入门之VrPanoramaView制作全景图列表,被逼无奈开始狂啃底层技术

/全景图控件初始化//眼镜模式按钮禁掉//全屏模式按钮禁掉//信息按钮禁掉//开启手触模式为RecycleView准备数据,设置适配器//准备数据,这里模拟假数据i < ‘M’;i++) {看看HomeAdapter的内容:@Override} else {@Overrideif (isFirstTime) {//首次进入要显示第一个item的全景h.tv.setText(“到底啦…”);

2401_84149733的博客 779

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

2024年最新google vr 入门之VrPanoramaView制作全景图列表,值得一看

这是RecycleView滚动监听回调的方法,在回调中我们得到屏幕中最后一个可见的item的postion,即lastVisibleItemPosition,我们关心的不是这个条目,而是它的上上一个条目,故而才有了int pos = lastVisibleItemPosition - 2;if (RecyclerView.SCROLL_STATE_IDLE == newState) {//停止滑动。if (pos == currentPos || currentPos < 0)//目前正在显示不能移除。

2401_84931491的博客 509

第8章 - 异构系统的协同控制及最优控制 --> 最优控制

异构系统的协同控制及最优控制 --> 协同控制

赵继超的笔记 2259

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(五)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包exp

慕羽★的博客 1510

最全google vr 入门之VrPanoramaView制作全景图列表,2024年最新写给即将正在找工作的Golang攻城狮

class VrPanoramaViewHolder extends RecyclerView.ViewHolder {//全景图的Holder。class FooterHolder extends RecyclerView.ViewHolder {//底部填充的Holder。if (isFirstTime) {//首次进入要显示第一个item的全景。// 使用google vr VrPanoramaView 添加的。//全景图类型的item。//底部填充的两个item。//准备数据,这里模拟假数据。

2401_84910839的博客 657

第38节:cesium 风场效果(含源码+视频)

cesium 风场效果

qq_29384639的博客 2329

最全google vr 入门之VrPanoramaView制作全景图列表(1),从Golang语言到AIDL使用与原理讲解

class VrPanoramaViewHolder extends RecyclerView.ViewHolder {//全景图的Holder。class FooterHolder extends RecyclerView.ViewHolder {//底部填充的Holder。//全屏模式按钮禁掉。//眼镜模式按钮禁掉。if (isFirstTime) {//首次进入要显示第一个item的全景。//全景图类型的item。//底部填充的两个item。//准备数据,这里模拟假数据。//全景图控件初始化。

2401_84910839的博客 1077

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VR全景视图 Google VrPanoramaView

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34281537的博客 1832

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android google VR全景图导航

Android google VR全景图导航       VR导航我们接入的是google vr的,其官方网站为https://github.com/googlevr/gvr-android-sdk,其VR素材地址为http://p0w477exg.bkt.clouddn.com/andes.jpg,下面看下集成的写法:一.所演示的样列为android studio新建一个空activity的只含...

诗雨远方的博客 2613

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: java反射基础知识总结
下一篇: 如何改变图片的尺寸大小得到一张缩小后的图片
github_2011
博客等级 码龄10年 116粉丝 56原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值