Android三种姿势带你玩转360度全景图功能

大家好我是张鹏辉(道长)人如其名,我是天桥上算命的,转发这条博文,接下来一个月会有意想不到的惊喜发生。最近微博上的全景图火了,所以决定实现一下。工程里面图片资源来自网络,如有侵权请联系我,马上删除当然实现的方式很多比如OpenCV、u3d等。这里提供三种方式实现:

先看下三种实现的效果:

1.OpenGLES

第一种方式使用OpenGL来实现(上面gif图截取因为博客限制上传图片的大小,我压缩了,看起来有些卡其实很流畅的)可以看到支持旋转手机查看、或者拖动图片查看、可以看到右边中心部分有个指示器会随着角度变化而变化并且点击可以还原起始位置。

有些小伙伴懒得看原理,直接就想拿来用所以我先说集成方式吧!

在build.gradle文件中添加库依赖:

dependencies{compile'com.github.CN-ZPH:weibo360panorama:v1.0.1'}build.gradle完整代码:

publicclassMainActivityextendsAppCompatActivity{privateGLPanoramamGLPanorama;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化全景控件mGLPanorama=(GLPanorama)findViewById(R.id.mGLPanorama);//传入你的全景图mGLPanorama.setGLPanorama(R.drawable.imggugong);}}OK现在你可以测试玩玩了(别用模拟器玩咔咔报错就来找我)。二.分析首先我们需要了解全景图是什么东西,全景图是一种广角图。通过全景播放器可以让观看者身临其境地进入到全景图所记录的场景中去,通常标准的全景图是一张2:1的图像,其背后的实质就是等距圆柱投影。等距圆柱投影是一种将球体上的各个点投影到圆柱体的侧面上的一种投影方式,投影完之后再将它展开就是一张2:1的长方形的图像。比较常见的就是应用在地图上的投影。

得到全景图后那我们就需要展示了,看到旁边地球了吗?

怎么展示呢简单来说就是把全景图片整个贴到一个球体上。好了知道原理那我们就该考虑在android上怎么实现了,在android中绘制3d图形可以使用OpenGL(就不说OpenGL基础了想看的自己百度一大堆资料)。

纹理和图片绑定绘制到屏幕上

int[]textures=newint[1];glGenTextures(1,textures,0);inttextureId=textures[0];glBindTexture(GL_TEXTURE_2D,textureId);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);InputStreamis=context.getResources().openRawResource(drawableId);BitmapbitmapTmp;try{bitmapTmp=BitmapFactory.decodeStream(is);}finally{try{is.close();}catch(IOExceptione){e.printStackTrace();}}GLUtils.texImage2D(GL_TEXTURE_2D,0,bitmapTmp,0);bitmapTmp.recycle();2.利用传感器让球随着手机转动而转动第一想到的就是重力感应传感器,可是只能获得我们向那个位置偏移的方向,显然不可能满足我们旋转的需求,使用陀螺仪传感器。陀螺仪就是内部有一个陀螺,它的轴由于陀螺效应始终与初始方向平行,这样就可以通过与初始方向的偏差计算出实际方向。陀螺仪对设备旋转角度的检测是瞬时的而且是非常精确的。

首先注册陀螺仪传感器根据具体需要自己设置灵敏度,当然越灵敏,越耗电。

我这里为了测试设置了SENSOR_DELAY_FASTEST,实际使用建议用SENSOR_DELAY_GAME

privatevoidinitSensor(){sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);gyroscopeSensor=sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);sensorManager.registerListener(this,gyroscopeSensor,SensorManager.SENSOR_DELAY_FASTEST);}2.获得传感器数据当传感器的值发生变化时,例如磁阻传感器方向改变时会调用OnSensorChanged().当传感器的精度发生变化时会调用OnAccuracyChanged()方法。

@OverridepublicvoidonSensorChanged(SensorEventsensorEvent){if(sensorEvent.sensor.getType()==Sensor.TYPE_GYROSCOPE){if(timestamp!=0){finalfloatdT=(sensorEvent.timestamp-timestamp)*NS2S;angle[0]+=sensorEvent.values[0]*dT;angle[1]+=sensorEvent.values[1]*dT;angle[2]+=sensorEvent.values[2]*dT;floatanglex=(float)Math.toDegrees(angle[0]);floatangley=(float)Math.toDegrees(angle[1]);floatanglez=(float)Math.toDegrees(angle[2]);Sensordtinfo=newSensordt();info.setSensorX(angley);info.setSensorY(anglex);info.setSensorZ(anglez);Messagemsg=newMessage();msg.what=101;msg.obj=info;mHandler.sendMessage(msg);}timestamp=sensorEvent.timestamp;}}3.设置填充球的Y,X的角度每次获得角度数据后只需要y,x的值计算位移的值

因为全景图上下旋转会翻转整个图所以我这里设置了上下只能偏移50f,如果不限制你可以去掉

mBall.yAngle+=dx*2.0f;这里*2.0也就是陀螺仪传过来的值乘以得出偏移的角度,数值越大,每次偏移更快!

Sensordtinfo=(Sensordt)msg.obj;floaty=info.getSensorY();floatx=info.getSensorX();floatdy=y-mPreviousY;//计算触控笔Y位移floatdx=x-mPreviousX;//计算触控笔X位移mBall.yAngle+=dx*2.0f;//设置填充椭圆绕y轴旋转的角度mBall.xAngle+=dy*0.5f;//设置填充椭圆绕x轴旋转的角度if(mBall.xAngle<-50f){mBall.xAngle=-50f;}elseif(mBall.xAngle>50f){mBall.xAngle=50f;}mPreviousY=y;mPreviousX=x;3.加入手势操控,拖动图片转动加入手势这里没什么好说的了,就是重写onTouchEvent()方法。这里唯一要注意的就是,当手指点击屏幕的时候要关闭陀螺仪传感器的监听不然会引起冲突。当手指离开屏幕,重新监听陀螺仪传感器。和上面也一样只是这里换成获取手指偏移角度,而不是传感器的数值,直接看代码。

publicbooleanonTouchEvent(MotionEvente){sensorManager.unregisterListener(this);floaty=e.getY();floatx=e.getX();switch(e.getAction()){caseMotionEvent.ACTION_MOVE:floatdy=y-mPreviousYs;//计算触控笔Y位移floatdx=x-mPreviousXs;//计算触控笔X位移mBall.yAngle+=dx*0.3f;//设置填充椭圆绕y轴旋转的角度mBall.xAngle+=dy*0.3f;//设置填充椭圆绕x轴旋转的角度if(mBall.xAngle<-50f){mBall.xAngle=-50f;}elseif(mBall.xAngle>50f){mBall.xAngle=50f;}Log.i("zphsas","mHandler***mPreviousY"+mBall.yAngle);Log.i("zphsas","mHandler***mPreviousx"+mBall.xAngle);rotate();break;caseMotionEvent.ACTION_UP:sensorManager.registerListener(this,gyroscopeSensor,SensorManager.SENSOR_DELAY_FASTEST);break;}mPreviousYs=y;//记录触控笔位置mPreviousXs=x;//记录触控笔位置returntrue;}4.加入指示器指示器这里弄了一个角标指示当前在全景图的角度,并且点击还原起始角度。可以想象同样是获取角度,我们直接放在全景图改变的地方,让指示器一起改变,而我们改变的地方只有2个陀螺仪和拖动屏幕。我这里指示器放了一张图也就是一个ImageView控件

1.为指示器加入动画跟随全景图一起转

privatevoidrotate(){RotateAnimationanim=newRotateAnimation(predegrees,-mBall.yAngle,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);anim.setDuration(200);img.startAnimation(anim);predegrees=-mBall.yAngle;//记录这一次的起始角度作为下次旋转的初始角度}2.点击指示器还原起始位置

当点击还原的时候,我一开始是直接恢复起始位置可是太生硬了,通过获取当前旋转的角度,逆向旋转,慢慢还原,让其有个过渡的效果。Y轴=旋转的角度-90f(起始角度)/10f(每次偏移多少,经过我多次尝试10f在我的手机上刚刚好);得到我们总共偏移几次可以复位;X轴同理,因为我上面限制了X轴的最大偏移,这里就不就算X轴了,不过在完成的同时直接复位X轴。(只是没有过渡的效果),你可以加上。我设置的起始角度是90f和0f,也就是X,Y轴的起始点mHandlers.postDelayed(this,16);这行代码就是多少毫秒复位一次。

看代码:

privatevoidzero(){yy=(int)((mBall.yAngle-90f)/10f);mHandlers.post(newRunnable(){@Overridepublicvoidrun(){if(yy!=0){if(yy>0){mBall.yAngle=mBall.yAngle-10f;mHandlers.postDelayed(this,16);yy--;}if(yy<0){mBall.yAngle=mBall.yAngle+10f;mHandlers.postDelayed(this,16);yy++;}}else{mBall.yAngle=90f;}mBall.xAngle=0f;}});}至此第一种OpenGLES方式核心代码分析完毕,有不明白的地方可以找我第二种GoogleVR第二种也就是谷歌官方为移动平台下VR解决方案,有兴趣的可以点开下面链接玩玩,我们只使用其中全景图模块。

目前GitHub上最新版本号为1.8.0,我这里也用最新的了。最低支持到minSdkVersion19也就是Android4.4.0在build.gradle文件中添加库依赖:

考虑到在多种机型兼容性,还有原生WebView的一些坑,我这里使用腾讯的X5内核的WebView。

到x5官网下载最新的sdk得到一个jar包我在这的是3.3.0版本的。将下载好的jar包放到你的工程libs目录下在build.gradle文件中添加库依赖:

你可以使用js交互将你的地址传到HTML上

直接上代码了:

publicclassWebViewActivityextendsAppCompatActivity{privatecom.tencent.smtt.sdk.WebViewtencent_webview;privateStringurl="file:///android_asset/admin.html";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_web_view);initView();}@SuppressLint("SetJavaScriptEnabled")privatevoidinitView(){tencent_webview=(WebView)findViewById(R.id.web);tencent_webview.loadUrl(url);WebSettingswebSettings=tencent_webview.getSettings();webSettings.setJavaScriptEnabled(true);tencent_webview.setWebViewClient(newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){returntrue;}});}}

THE END
1.故宫app下载故宫博物院门票预约官方app故宫博物院讲解手机电子导游内置北京故宫的AR全景地图,内置226个知识点为您完整解读故宫的古往今来,多元化的主题讲解系统,还可以自动定位跟随讲解,还有多个参观线路推荐!故宫电子导游讲解app简介故宫博物院电子语音讲解,这是一款专门为北京故宫打造的智能导游http://www.danji100.com/k/gugongapp/
2.故宫展览app下载故宫展览app安卓尽情参观故宫景貌和欣赏故宫藏品。 故宫出品,打造7×24小时的线上展厅,邀您指尖访古,看遍宫廷原状、常设专馆、专题特展,让故宫博物院精品展览一览无余,深度体验传统艺术与宫廷文化的丰富内涵。 主要特点: 1.展览展品信息全方位呈现,导览地图实现快速定位,以图搜图让搜索变得更有趣; 2.展厅全景虚拟漫游,更https://liqucn.com/article/762926.wml
3.最新iMuseum安卓版app下载iMuseum安卓版app0.4.0下载iMuseum安卓版app下载-iMuseum安卓版app0.4.0下载在这个信息爆炸的时代,我们渴望走进历史的长河,体验文化的魅力,思考人类智慧的传承。而现在,一款名为iMuseum的安卓版app正式发布,为我们打开了一扇通往历史与文化的大门。这款0.4.0版本的iMuseum安卓版app,将为您带来无与伦比的博物馆体验,让您尽情领略艺术与历史的魅力http://www.hbrzfw.com/m/article/6455405720250131.shtml
4.AppStore上的“故宫展览”打开Mac App Store 购买和下载 App。 故宫展览4+ The Palace Museum 专为iPhone 设计 4.3 ? 420 个评分 免费 iPhone 截屏 简介 故宫出品,打造7×24小时的线上展厅,邀您指尖访古,看遍宫廷原状、常设专馆、专题特展,让故宫博物院精品展览一览无余,深度体验传统艺术与宫廷文化的丰富内涵。 https://apps.apple.com/cn/app/%E6%95%85%E5%AE%AB%E5%B1%95%E8%A7%88/id1051633498
5.综述iMuseum安卓版app下载iMuseum安卓版app0.4.0下载南方网02月04日讯“iMuseum安卓版app下载-iMuseum安卓版app0.4.0下载”02月04日哥布林下载-哥布林app下载v1.3.7 随着智能手机的普及,移动应用程序已经成为人们日常生活中不可或缺的一部分。无论是社交娱乐、生活购物还是工作学习,都有着各种各样的应用程序可以满足我们的需求。而在这众多的应用程序中,哥布林app无疑https://www.ztsnkj.com/m/article/2025-02-03/doc-AFZkBFTSX583183635.shtml?id=1911475-364568.scm
6.Alibaba杏MAP视频app下载杏MAP视频安卓版下载V1.0.0而在众多视频app中,杏MAP视频app无疑是备受关注的焦点。作为一款全新推出的安卓版视频app,杏MAP视频app以其丰富的内容和优质的体验,备受用户青睐。今天,我们就来深入了解一下这款备受瞩目的视频app。首先,杏MAP视频app拥有丰富多样的视频内容。无论是电影、电视剧、综艺节目还是短视频,用户都可以在杏MAP视频app中http://www.leondns.com/m/article/20250202/336031837NFMwr.shtml?id=8800817620250202.scm
7.小黑盒18.全景故宫 中文 线上体验游览故宫,360° 查看各个宫殿,支持搜索,有文字介绍 https://pano.dpm.org.cn/ 19.地球模型 中文 网站模拟了地球自转运动,同时提供了大量的模拟操作,如查看太阳光照、昼夜平分面黄道面赤道面与内部结构等 https://3d-app.yunser.com/earth 20.蚂蚁网(怕的慎入啊) 中文 全球最大的https://www.xiaoheihe.cn/community/1/list/114940977
8.故宫全景游iPhone版免费下载【故宫全景游】 【基本介绍】全球首款中英双语故宫虚拟旅游App,采用3D高清全景技术,全方位展现故宫的精美建筑艺术和悠久历史文化。 45张高清实景,中英文语音讲解,手绘导游图,体感变换全周视角,令您尽情享受超炫的全景体验,身临其境漫游故宫。1.中英文语音讲解,详尽了解故宫历史2.支持离线欣赏,无需使用流量3.支持重力https://m.duote.com/ios/608352.html
9.为什么宋画之美,千年难以超越?南方周末每个月的23日,南周用户可在南方周末App上,用南瓜积分换购各种不同的礼品——可能是书籍、可能是小家电,总之,都是我们为你准备的种种惊喜。会员使用南瓜积分换购商品时,可以比普通用户享受更多优惠。 第一次的活动在此,点击可看:明天,是个大日子! https://www.infzm.com/contents/246533?source=202&source_1=246531
10.全景故宫下载全景故宫最新版下载全景故宫app下载全景故宫下载栏目提供了最全的全景故宫版本内容,喜欢这款软件的用户,可以下载最新的官方版本,还能够找到相同类型的APP,保证每一位来到这里的玩家都能够找到感兴趣软件版本。 更新时间:2024-12-28 全景故宫版本大全 官方版 全景故宫相关软件 每日故宫 安卓版 小说漫画|69.29MB 星全景 安卓版 拍照摄影|26.83MB https://shouyou.3dmgame.com/zt/86210_game/
11.www.di2ke.com/mmmj/801480.shtml故宫大班美术教案 56.11MB 38好评 ?XX日本中国老人性生活乄X乄 又黄又肉到湿的爽文 欧美app 956.14MB 5671好评 哦用力别停使劲干花心 乡村淫乱大奶小说 日本黄色91. 73.27MB 8902好评 乖张开腿吸允着 2024自拍偷拍无码视频 mm131美女 371.05MB 8375好评 厨房从后面http://www.di2ke.com/mmmj/801480.shtml
12.故宫上新App全景式展现紫禁城前朝后寝在新上线的App中,故宫摄影师们多年来拍摄的美景按照季节、地点等分类,用户可在不同“时空”中走进并分享美景,故宫前朝后寝所有宫区全部“开放”。用户可学习宫殿建筑知识,了解宫廷历史故事,还可享受全景建筑的沉浸式体验,近距离领略紫禁城建筑之美。为适应大家的阅读习惯,每段小知识都是浓缩版,三五分钟内即可读完https://article.xuexi.cn/articles/index.html?art_id=9457459932913957166&reco_id=101ce987ac26c0a8843c000p
13.www.sz裸女视频app 地支双亥女命 国产精品特黄淫片 347.50MB 55好评 巨大黑人亡夫人妻 从澳门带什么回来可以赚钱 曰本久久强奷精美视频 844.81MB 933好评 污污污网站在线观看 佐山爱丰满教练在线播放 国产高清无码一区二区三区在线观看 402.17MB 5560好评 精品一二区永久网址在线规看 男男操死骚逼了https://www.sz-jiada.com/go/74116066.htm
14.www.hnsdgs.com/airpods/2024121683767580.shtml看老黄片免费91 黑人强上人妻电影 女人脱了内裤给男人桶30分钟 男人的坤坤又插进女人的坤坤里 av色亚洲 天天本子在线 460.19MB 940好评 一级黄色肥痳枇操逼 日本精品导航 可以操人的网站在线观看 43.4MB 898好评 德国性复古性HD 草莓综合操骚平台 http://www.hnsdgs.com/airpods/2024121683767580.shtml
15.景山公园可以看到紫禁城的全景,就凭这一点景山公园可以看到紫禁城的全景,就凭这一点,满分推荐之。本来也不知道北京有这么个地方,可是当我周一傻乎乎的跑到故宫去看故宫的时候发现被坑了故宫周一闭馆,于是恍惚间想起昨晚一个伙伴跟我提到过说故宫后面有个公园可以看到故宫全景,我一想,看不到故宫,看看全景也好啊,于是就一路打听着过去了。面向故宫左转,从中山https://m.dianping.com/review/187927521
16.全景故宫故宫概览故宫博物院 外朝 内廷 故宫博物院 THE PALACE MUSEUM 故宫博物院,是一座特殊的博物馆。成立于1925年的故宫博物院,建立在明清两朝皇宫--紫禁城的基础上。 故宫博物院拥有绝无仅有的独特藏品,是世界上规模最大、保存最完整的木结构宫殿建筑群。它是中华民族的骄傲所在,也是全人类的珍贵文化遗产。如今,昔日皇宫https://pano.dpm.org.cn/
17.www.bashu.com.cn/moksee/326435.aspx曼联周日官方宣布,27岁的拉什福德出租加盟阿斯顿维拉,租借期至今年6月,届时维拉可以选择4000万英镑买断。据悉,维拉将承担拉什福德32.5万英镑周薪的75%,即超过24万英镑,吉姆·拉特克里夫爵士可以节省一大笔工资开销。 不仅如此,在租借合同中,维拉还规定了与绩效相关的奖金,如果达标他们将承担拉什福德高达90%的工资,也就是https://www.bashu.com.cn/moksee/326435.aspx
18.想在日出的时候看故宫全景,想知道一大早能不能进景山公园?打开APP想在日出的时候看故宫全景,想知道一大早能不能进景山公园?马蜂窝用户·怪咖帝 55浏览· 12回答 举报 想在日出的时候看故宫全景,想知道一大早能不能进景山公园?马蜂窝用户·米乐 Lv.45 2022-04-22 顶起 评论 收藏 更多北京玩法 立即查看 马蜂窝用户· Lv. 顶起 评论 收藏 全部回答(12条) 马蜂窝https://m.mafengwo.cn/wenda/detail-23521477.html
19.您有一份“花式带娃指南”,请注意查收!招数三:精品云展览——云看展丰内涵 这个寒假不出门,看展览,把博物馆装回家,和家人一起“云看展”。 1.全景故宫——故宫博物院 故宫博物院 http://webapp.vizen.cn/gugong_app_pc/index.html 2.归来——意大利返还中国流失文物展 中国国家博物馆 http://www.fhc.edu.sh.cn/P/C/118574.htm