iOS开发——加载、滑动翻阅大量图片解决方案详

来源:互联网 发布:蓝牙助手源码 编辑:程序博客网 时间:2024/05/02 08:17

今天分享一下私人相册中,读取加载、滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制。我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清大图全屏浏览界面的这短暂的1秒内(和后续的几秒),都发生了什么。


 

常规思路流程:点击任意小图后,
1.首先制作scrollview框架:大小2个scrollview,小的用于手势缩放单一图片,大的横向依次加载全部照片
2.制作好scrollview框架后,加载照片
3.一切准备就绪跳转页面呈现给用户选择的大图

 

加载图片这一步,若相册内就10几张照片,那么毫无技术挑战,但是如果是300张照片呢?直接崩溃?还是让用户等待加载? 时间紧任务重,这一步需要拆分和优化。


 
scrollview框架需要了解下API,然后动动脑子了,这里有个小窍门,很多人都问我照片与照片间的黑边间距怎么实现,贴下代码:
 
  1. #define PADDING  20   
  2. - (NSInteger)loadPhotos   
  3. {   
  4.     //清理之前照片   
  5.     for (UIView *v in [_scrollView subviews]) {   
  6.         [v removeFromSuperview];   
  7.     }   
  8.    
  9.     workingFrame = [[UIScreen mainScreen]bounds];   
  10.     workingFrame.origin.x = PADDING;   
  11.        
  12.     for (int i = 0; i < int_total; i++) {   
  13.         CGRect frame = workingFrame;   
  14.         WQPhoto *photoView = [[WQPhoto alloc] initWithFrame:frame];   
  15.         [photoView setScroller:self];   
  16.         [photoView setIndex:i];   
  17.    
  18.         WQAlbumPhoto *photo = [albumObject._photos objectAtIndex:i];   
  19.         [photo cleanThumbnail];   
  20.         if (i == int_current) {   
  21.     //加载原图   
  22.             [photoView setImage:photo.oriImage];   
  23.             [photoView setIsLoad:YES];   
  24.         }else if (int_current - 10 < i && i < int_current + 10){   
  25.     //加载左右临近的缩略图   
  26.             [photoView setImage:photo.thumbnail4view];   
  27.         }   
  28.    
  29.         [_scrollView addSubview:photoView];   
  30.         workingFrame.origin.x = workingFrame.origin.x + 2 * PADDING    
  31. + workingFrame.size.width;   
  32.     }   
  33.        
  34.     //实现可滚动   
  35.     [_scrollView setContentSize:CGSizeMake(workingFrame.origin.x, workingFrame.size.height / 2)];   
  36.     [_scrollView setContentOffset:CGPointMake(360 * int_current, 0)];   
  37.     //加载其余缩略图   
  38.     loadThread = [[NSThread alloc]initWithTarget:self selector:@selector(loadImages) object:nil];   
  39.     return 0;   
  40. }   

 

使用低分辨率图
仔细想想,其实没有必要第一时间加载全部图片的高清原图,事先存好每张图配套的低分辨率图,用空间换时间。先加载所有的图片的低分辨率图, 当用户翻阅到某一张图片时, 即时的加载原始尺寸的高清无码大图. 过程优化为:


 

多线程任务

即使是这样,当照片数量达到一定量时,需要消耗的时间也并非毫秒级,体验无法领人满意,  页面跳转时仍然会出现卡顿现象。
于是考虑使用多线程来进一步拆分任务, 执行跳转的同时再后台执行加载低分辨率图的步骤。


优化快速翻阅体验
通过这样的拆分,可以实现立即跳转,体验满意。但是翻阅浏览时,当用户很快左右滑动时, 出现黑屏的几率很高, 因为加载低分辨率图任务的线程可能还在进行大量IO操作,不能及时跟上。 为了完善它,要把加载低分辨率图的步骤再次分解,精益求精。


在页面跳转时间允许的范围内,加载用户选定的那张图片的高清原图的同时,尽可能多的加载几张左右临近的图片的低分辨率图。


 
如何加载其余的低分辨率图?
以用户点击选定的那张图为中心向两边加载, 直接想应该是两个线程一左一右的加载,再想想左右一起加载其实可以是一个循环, 免了再开线程的那些耗费了。
 
  1. -(BOOL)loadImages   
  2. {   
  3.     for (int i = int_current - 10, j = int_current + 10 ; !( i < 0 &&  int_total - 1 < j); --i, ++j) {   
  4.         if (!(i < 0)) {   
  5.             WQPhoto *photo_pre = [_scrollView.subviews objectAtIndex:i];   
  6.             WQAlbumPhoto *photoPre = [albumObject._photos objectAtIndex:i];   
  7.             [photo_pre setImage:photoPre.thumbnail4view];   
  8.         }   
  9.         if (!(int_total - 1 < j)) {   
  10.             WQPhoto *photo_next = [_scrollView.subviews objectAtIndex:j];   
  11.             WQAlbumPhoto *photoNext = [albumObject._photos objectAtIndex:j];   
  12.             [photo_next setImage:photoNext.thumbnail4view];   
  13.         }   
  14.     }   
  15.     return YES;   
  16. }   

 

 

最后
尽量减少内存占用.  因为原始图片要比低分辨率图大很多, 所以当用户从一张图片翻阅到另一张图片时,  当前图片加载为原始尺寸的高清大图, 而原来那张就被替换为低分辨率图了。 虽然读写次数增多了, 但内存确实省了不少。

实话说,市场上不少相册类的app, 翻阅时都会有卡顿的跳跃感,呵呵……

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 建行app充话费不到账怎么办 币乎账号被骗了怎么办? q币充了想返还怎么办 q币账号充值错了怎么办 淘宝乐充话费没到账怎么办 微信信用卡还款未到账怎么办 登不上qq怎么改qq密码怎么办 qq改不了以前的密码怎么办 qq微信密码都被改了怎么办 qq账号被盗一直改密码怎么办? 2018qq密码忘了怎么办 我qq密码忘记了怎么办 微信怎么办该改密码 微信改密码收不到验证码怎么办 微信不能改密码怎么办 qq钱包被限额了怎么办? 注册战网手机号被使用怎么办 电信充值卡密码刮花了怎么办 油卡充值卡密码刮花了怎么办 电费充值卡密码刮花了怎么办 手机充值卡密码刮坏了怎么办 办中石化油卡怎么办 移动代充q币没到怎么办 电信手机话费充多了怎么办 微信钱包提现提错银行卡怎么办 qq余额提现不了怎么办 qq钱包充错话费了怎么办 苹果账户扣了钱怎么办 苹果平板冲不进去电怎么办 qq红包输了钱怎么办 qq红包实名认证没有银行卡怎么办 扣扣红包发不了怎么办 qb充错账号了怎么办 q币冲错了号了怎么办 微信qb冲错号码怎么办 微信qb冲错了怎么办 qb冲到小号了怎么办 无意中充了q币怎么办 在绝地求生里打不开充值页面怎么办 电脑版迷你世界打不开怎么办 电脑的腾讯视频打不开怎么办