全景浏览App工程一
2016-01-30 16:06
459 查看
工程背景
由于需要做一个全景浏览App,国内外开源代码库中只找到一个叫PanoramaGL的全景浏览库,里面有一些实例图片。这个库可以显示两种球型全景图(只是分辨率不同罢了),一个cube型还有个柱形Cylinder。由于我们暂时只做球形图,所以先考虑使用能够展示更加高清分辨率的球形图,2048*1024的分辨率。万事开头难
当时由于对ios开发不熟悉,一打开PG库发现里面用的不是storyboard而是xib文件,这是什么鬼?我记得以前看人家都用storyboard,往上面拖拖控件然后跟.m连连线就ok,这个完全不知道干啥的。。于是我第一件事就是想把xib上的东西放到storyboard上去,这样我就直接用storyboard,往上面拖拖控件,连连线,多简单(尽管后来发现xib文件也可以。。反正当时就特不乐意用xib,任性。= =)。最后花了不少劲才在storyboard上显示全景图。以下是库使用的注意点。注意要显示全景图片的viewController要绑定相应的类,我这里就是要绑定panoViewController,这是一个很基础的知识,然而我当时还是too young,too simple!
后来发现咋还是没办法显示全景图片呢,后来经过多方尝试,发现viewController上的UIView要继承库里面自定义的plview(将viewController的白板部分添加继承plview),否则无法显示图片。。
如果要用到自己的全景图片,那么请注意图片到分辨率,只支持特定格式的分辨率,其余分辨率显示不出来。而且热点必须要加上,否则图片会变形~~具体原因还没未去调查。所以这里牵扯到要将图片分辨率调整的步骤
//改变图片分辨率方法 - ( UIImage *)imageWithImageSimple:( UIImage *)image scaledToSize:( CGSize )newSize { // Create a graphics image context UIGraphicsBeginImageContext (newSize); // Tell the old image to draw in this new context, with the desired // new size [image drawInRect : CGRectMake ( 0 , 0 ,newSize. width ,newSize. height )]; // Get the new image from the context UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext (); // End the context UIGraphicsEndImageContext (); // Return the new image. return newImage; }
CGSize size = CGSizeMake(2048, 1024); UIImage *newImage = [self imageWithImageSimple:img scaledToSize:size ];
如果要将PanoramaGL库导入到新建工程中,切忌注意要将PG库中.m文件在工程设置中加上”-fno-objc-arc”,否则将会冒出几十个红色的错误。。原因就是PG库不支持ARC功能,而现在的工程默认开启ARC功能。
目前本库可以支持手指滑动预览全景图片,如果要想调用陀螺仪进行旋转预览,则须在PanoramaGL中PLViewBase.m文件中作出修改。
-(void)drawViewInternally { if(scene && !isValidForFov && !isSensorialRotationRunning) { PLCamera *camera = scene.currentCamera; /**********获取陀螺仪数据然后给endPoint***************/ if (!_motionManager) { _motionManager = [[CMMotionManager alloc] init]; _motionManager.gyroUpdateInterval = CRMotionGyroUpdateInterval; } if(touchStatus == PLTouchStatusMoved || touchStatus == PLTouchEventTypeBegan) { [camera rotateWithStartPoint:startPoint endPoint:endPoint]; if(delegate && [delegate respondsToSelector:@selector(view:didRotateCamera:rotation:)]) [delegate view:self didRotateCamera:camera rotation:[camera getAbsoluteRotation]]; } //判断陀螺仪是否可用 else if([_motionManager isGyroAvailable]) { [_motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) { if(fabs(gyroData.rotationRate.y) >= CRMotionViewRotationMinimumTreshold || fabs(gyroData.rotationRate.x) >= CRMotionViewRotationMinimumTreshold ) {//旋转频率需要自己设置 endPoint.x = startPoint.x + gyroData.rotationRate.y * 70 ; endPoint.y = startPoint.y + gyroData.rotationRate.x * 70 ; [camera rotateWithStartPoint:startPoint endPoint:endPoint]; if(delegate && self) { if([delegate respondsToSelector:@selector(view:didRotateCamera:rotation:)]) [delegate view:self didRotateCamera:camera rotation:[camera getAbsoluteRotation]]; } //[self retainCount]; } }]; } } if(renderer) [renderer render]; }
总结
工程一的作用就是为工程二的核心功能做铺垫,下个博客主要分析工程二的框架,框架参考李明杰新浪微博教程中的内容。相关文章推荐
- 这些年正Android - 大学
- ios9警告视图新写法
- Xcode7 真机测试出现 "The account 'Apple ID' has no team with ID 'team ID'的解决方案
- SAE+Servlet+JSP实现微信公众平台OAuth2.0网页授权的使用
- 8.Swift 中的控制转移语句
- 仿微信滑动Tab框架
- 微信开放平台公众号第三方平台开发 教程一 平台介绍
- 监听android actionbar上overmenu是否显示
- QQ 微信抢红包
- ActiveAndroid TableInfo TypeSerializer
- Android progressBar进度条
- JavaScript的那些坑之call,apply,bind
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android6.0 按键流程(三)InputDispatcher分发输入消息
- 一个Android上的弹幕控件Open Danmaku
- Android 打包so动态库文件到APK
- Android 打包so动态库文件到APK
- Android上定义播放器控件UniversalVideoView
- Android sdk 接入时遇到的错误解决方案
- Android 学习1----控件的学习