Cover flow基本原理及Tapku实现方法

切换效果:coverflow 封面轮播图 文章目录前言一、最终效果二、swiper库的引入三、代码复现1. html主体2. css样式3. js脚本总结 前言 coverflow封面轮播图主要常用在一些音乐播放网站,或者视频网站中,主要是通过放大正在轮播的图片,从而实现捕获用户的眼球,减少其他未轮播到的轮播图视觉上的干扰,本文我们就通过 swiper库来简单实现一下。 一、最终效果 先来看一下我们的最终效果: 二、swiper库的引入 在 swiper中内置了四种轮播的样式,可设置为’slide’(普通切换、默认),“fade”(淡入) 阅读详情

Cover flow基本原理及Tapku实现方法   

Cover flow是 苹果首创的将多首歌曲的封面以3D界面的形式 显示出来的方式。如下图所示:


从图中可以看到,显示在中间的 图片为目标图片,两侧的图片在y轴都旋转了一定的角度,并且每两张图片之间都保持了一定的距离。在交互(如点击两侧的图片)的时候,滑动到中间的图片会逐渐放大,旋转的角度由原来的旋转角度a变为0,且位置上移动中间,变成新的目标图片;同时原处于中间位置的图片则缩小、旋转一定的角度、位置偏移到一侧。所以在整个过程中,主要有两个属性发生了变化:角度与位置(缩放只是视觉上的,并没有进行缩放操作)。
在每次点击一张图片时,如果这张图片在目标图片的左边,则所有的图片都会向右移动,同时做相应的旋转;相反,点击目标图片右侧的图片时,所有图片都会向左移动并做相应的旋转。
从如上描述的效果,可以看出在Cover Flow中最主要的的操作有两个:3D仿射变换与 动画。仿射变换实质上是一种线性变换,通常主要用到的仿射变换有平移(Translation)、旋转(Rotation)、缩放(Scale)。
对于这两种操作,iOS都提供了非常简便的接口来实现。接下来我们便以tapku的实现方法为例,来说明实现Cover Flow的基本过程。

一、图片的布局
从效果图可以看出,图片是按一条直接排列,图片与图片之间有一定的间距,目标图片是正向显示,两侧的图片则按一定的角度进行了旋转,与目标图片形成一定的角度。同时我们还能看到每个图片都有一个倒影,并且这个倒影是渐变的,由上而下逐渐透明度逐渐减小。

1、 Cover Flow单元的定义
在tapku中,每一个图片附属于一个视图(TKCoverflowCoverView),这个视图相当于UITableViewCell,它包含了三个要素:图片(imageView),倒影图片(reflected),渐变层(gradientLayer)。渐变层覆盖于倒影图片上,且大小位置一致。
TKCoverflowCoverView的声明及布局 代码如下所示:

复制代码
  1. @interface TKCoverflowCoverView : UIView {
  2. float baseline;
  3. UIImageView *imageView;
  4. UIImageView *reflected;
  5. CAGradientLayer *gradientLayer;
  6. }
  7. @end
  8. - (id)initWithFrame:(CGRect)frame {
  9.   self = [super initWithFrame:frame];
  10.  if (self) {
  11. self.opaque = NO;
  12. self.backgroundColor = [UIColor clearColor];
  13. self.layer.anchorPoint = CGPointMake(0.5, 0.5);
  14. imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.width)];
  15. [self addSubview:imageView];
  16. reflected = [[UIImageView alloc] initWithFrame:CGRectMake(0, self.frame.size.width, self.frame.size.width, self.frame.size.width)];
  17. reflected.transform = CGAffineTransformScale(reflected.transform, 1, -1);
  18. [self addSubview:reflected];
  19. gradientLayer = [CAGradientLayer layer];
  20. gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithWhite:0 alpha:0.5].CGColor,(id)[UIColor colorWithWhite:0 alpha:1].CGColor,nil];
  21. gradientLayer.startPoint = CGPointMake(0, 0);
  22. gradientLayer.endPoint = CGPointMake(0, 0.4);
  23. gradientLayer.frame = CGRectMake(0, self.frame.size.width, self.frame.size.width, self.frame.size.width);
  24. [self.layer addSublayer:gradientLayer];
  25.      }
  26. return self;
  27. }


注意:此次将视图的锚点(anchorPoint属性)设置为(0.5, 0.5),即视图的中心点,目的是让视图以中心点为基点进行旋转。
在进行仿射变换时,视图作为一个整体进行变换。

2、图片的布局
tapku中,图片的布局与交互是在TKCoverflowView类中完成的。类TKCoverflowView继承自UIScrollView,相当于是TableView。

该类中定义是两个仿射变量:
复制代码
  1. CATransform3D leftTransform, rightTransform

这两个变量分别设置了两侧图片的仿射变换,具体的设置方法为
复制代码
  1. - (void) setupTransforms{
  2.   leftTransform = CATransform3DMakeRotation(coverAngle, 0, 1, 0);
  3. leftTransform = CATransform3DConcat(leftTransform,CATransform3DMakeTranslation(-spaceFromCurrent, 0, -300));
  4.   rightTransform = CATransform3DMakeRotation(-coverAngle, 0, 1, 0);
  5. rightTransform = CATransform3DConcat(rightTransform,CATransform3DMakeTranslation(spaceFromCurrent, 0, -300));
  6. }


其中coverAngle为旋转的角度。对每个仿射变量同时设置了旋转也平移变换。

Cover Flow单元是存储在一个数组中:
复制代码
  1. NSMutableArray *coverViews;

初始化时设置数组的大小,并存入空对象。在后期获取某个索引位置的单元时,如果该单元为空,则生成一个新的TKCoverflowCoverView并放入相应位置。
复制代码
  1. if([coverViews objectAtIndex:cnt] == [NSNull null]){
  2.   TKCoverflowCoverView *cover = [dataSource coverflowView:self coverAtIndex:cnt];
  3. [coverViews replaceObjectAtIndex:cnt withObject:cover];
  4. ......
  5. }


每个Cover Flow单元的位置计算如下
复制代码
  1. CGRect r = cover.frame;
  2. r.origin.y = currentSize.height / 2 - (coverSize.height/2) - (coverSize.height/16);
  3. r.origin.x = (currentSize.width/2 - (coverSize.width/ 2)) + (coverSpacing) * cnt;
  4. cover.frame = r;

其中currentSize,coverSize,coverSpacing都是固定值。从中可以看出所有单元的y值都是一样的,而x值则与其在数组中的索引值相关,索引越大,x值也越大。而这就涉及我们之后的一个 问题。一会再讲。
假定目标图片的索引为currentIndex,则目标图片两侧的仿射属性设置如下:
复制代码
  1. if(cnt > currentIndex){
  2. cover.layer.transform = rightTransform;
  3. }
  4. else
  5. cover.layer.transform = leftTransform;

如上即为Cover Flow的基本布局,可以与UITableView比较一下。

二、交互
Cover Flow的基本交互是点击两侧的图片,则被点击的图片成为新的目标图片并移动中屏幕中间,而其它图片一起移动,在这个过程中所需要做的就两件事:旋转与平移。
方法很简单:在动画块中重新设置Cover Flow单元的transform属性,这样就可以缓动实现这个动画的过程。实际上只有新旧目标图片及中间的图片需要做这种变换,其余图片的transform属性都是不变的。
复制代码
  1. float speed = 0.3;
  2. [UIView beginAnimations:string context:nil];
  3. [UIView setAnimationDuration:speed];
  4. [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
  5. [UIView setAnimationBeginsFromCurrentState:YES];
  6. [UIView setAnimationDelegate:self];
  7. [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
  8. for(UIView *v in views){
  9. int i = [coverViews indexOfObject:v];
  10.   if(i < index) v.layer.transform = leftTransform;
  11.   else if(i > index) v.layer.transform = rightTransform;
  12.   else v.layer.transform = CATransform3DIdentity;
  13. }
  14. [UIView commitAnimations];


但这在做的只是旋转了Cover Flow的内容,并没有对Cover Flow进行水平平移,Cover Flow水平位置已由其origin.x值固定。那么水平上的平移是如何实现的呢,我们看下面的代码:
复制代码
  1. - (void) snapToAlbum:(BOOL)animated{
  2.   UIView *v = [coverViews objectAtIndex:currentIndex];
  3.  if((NSObject*)v!=[NSNull null]){
  4. [self setContentOffset:CGPointMake(v.center.x - (currentSize.width/2), 0) animated:animated];
  5. }else{  
  6. [self setContentOffset:CGPointMake(coverSpacing*currentIndex, 0) animated:animated];
  7. }
  8. }


其所做的就是以目标图片为中心,整体平移TKCoverflowView视图。

三、总结
由上可以看出,Cover Flow特效的原理很简单:对新旧目标图片及中间的图片以动画的形式做仿射变换。至于仿射变换如何处理,有不同的方法。tapku所实现的方法可以说相对简单灵活。
Android, Flash都有类似的Cover Flow特效实现方法,有兴趣的童鞋可以参考一下。
Cover Flow特效实现(2) Cover Flow特效实现(1) Cover Flow特效实现(2) 方法四:Tapku框架 Tapku库是一个开源的iOS框架,它包含CoverFlow, Calendar Grid, Char View等等API,总之还是一个比较强大的库。把Tapku 阅读详情

相关推荐

jquery-coverflow:一个 jQuery UI 小部件,用于创建 iTunes 风格的封面流

jQuery UI 覆盖流 通过 Planet Telex 为您带来了功能最齐全的 JavaScript Coverflow 插件。 它是一个 jQuery UI 小部件,它将以 iTunes:registered:“coverflow”视图的样式显示一系列带有文本标题的图像。 它可以通过多种方式进行配置,可以让您为您的网站创建独特的外观。 要求: jQuery 1.6+ jQueryUI 1.9+(核心、小部件、效果核心) 如果您想在您的网站上看到该功能,请添加“滑块”小部件。 特征: 非常简单的设置,需要最少的标记。 跨浏览器兼容优雅降级。 Chrome、Safari、Firefox 3.6+、Opera、IE7+ 通过配置、方法 API 和触发事件高度可定制。 从 DOM 或 JSON 配置或两者添加的图像。 图像反射和透视是可配置和可选的。 图像类别和完全 CSS 样式的可选菜单。

探索优雅的图片展示新方式 —— CoverFlow

探索优雅的图片展示新方式 —— CoverFlow 项目介绍 CoverFlow,一个专为呈现无限循环照片墙设计的开源项目,以其独特的滑动效果,为用户的视觉体验注入新的活力。这个项目的灵感来源于苹果经典的界面元素,让用户在浏览图片时感受到如同翻阅实体相册一般的流畅和自然。 项目技术分析 CoverFlow的核心是利用现代Web技术实现无限滚动动画。项目采用了高效的JavaScript库,通过精心...

gitblog_00071的博客 785

coverflow图片滚动浏览,倒影效果

coverflow,图片滚动浏览,倒影效果,中间突出,两边成45度角,类似于视频APP的影片选择。有按键响应

Android-CoverFlow:打造炫酷的封面流效果

# Android-CoverFlow:打造炫酷的封面流效果 ## 项目介绍 **Android-CoverFlow** 是一个基于 `ViewPager` 实现的 Android 封面流效果库。它能够为你的应用增添一抹炫酷的视觉效果,让你的用户在滑动浏览时体验到与众不同的交互感受。无论是图片展示、产品推荐还是内容导航,Android-CoverFlow 都能轻松胜任,为你的应用增色不少。

gitblog_01109的博客 1317

Android版仿iOS的CoverFlow效果

Android版仿iOS的CoverFlow效果

【数据分析/商业分析】面试题整理——SQL专题

数据分析\商业分析—面试题整理 自己总结的SQL类的面试题 文章目录数据分析\商业分析—面试题整理1.新增用户2.活跃用户数量3.连续登录4.次(n)日留存5.每个科目下分数最高的两名学生

awater_17的博客 1859

Cover Flow基本原理及Tapku实现方法

from: http://www.cocoachina.com/bbs/read.php?tid=73570&page=19 Cover Flow基本原理及Tapku实现方法 Cover Flow是苹果首创的将多首歌曲的封面以3D界面的形式显示出来的方式。如下图所示: 从图中可以看到,显示在中间的图片为目标图片,两侧的图片在y轴都旋转了一定的角度,并且每两张图片之间都保持了一

wangyx810328的专栏 799

从零实现机械臂抓取仿真:用MoveIt+Gazebo完成物体pick&place全流程

本文详细介绍了如何使用ROS的MoveIt框架与Gazebo仿真环境,从零构建机械臂抓取仿真系统。涵盖环境搭建、MoveIt配置、Gazebo集成、抓取动作实现等全流程,帮助开发者掌握机械臂控制的核心技术,实现高效的pick&place任务。

weixin_29250403的博客 477

QML实现酷炫的 Cover Flow 效果(PathView)

前言在 QML 中的 PathView 来实现一个 Cover Flow 图片切换效果,非常酷炫,并且代码也非常精简,先来看看效果图 源代码Rectangle { id:coverflow color:"black" property ListModel model property int itemCount: 5 PathView{ id......

luoyayun361的专栏 9368

OpenNARS开源通用人工智能系统:非公理推理引擎实践指南

人工智能系统从基于规则推理到深度学习模型,始终围绕如何让机器具备智能决策能力。传统逻辑系统依赖公理和完备知识,而现实世界智能体需要在资源受限、信息不完备环境下进行推理。非公理推理系统(NARS)通过动态真值计算和信念修正机制,实现了在不确定性环境下的自主学习和决策。这种推理引擎的技术价值在于模拟人类思维的核心机制——归纳、演绎和学习,为通用人工智能(AGI)提供了不同于数据驱动的新路径。在应用场景上,NARS适用于游戏NPC决策、复杂系统故障诊断和自适应机器人控制等领域。OpenNARS作为NARS理论的开

weixin_31961675的博客 408

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

qq_31444421的博客 2万+

Android中类似于IOS的CoverFlow效果实现源码分析

一、Android中的coverflow 1.在onLayout()方法中对item的放置从中间位置开始对adapter设置进来的item数量进行放置。之后在方法refillRight()和refillLeft()左右填充之后实现了item的循环显示。 2.在dispathDraw()方法进行item的绘制算出了中间位置信息。 3.事件的处理得dispathTouchEvent()对触摸的处理的分发,重要的是获取item的绘制顺序之后每个item算出了滑动的范围。在滑动时可对每个item进行平移的滑动的设置

wangyongyao1989的博客 2182

rv1126如何切换720p和1080p

切换720p和1080p可以使用modetest,但是需要将这两种模式都添加到connector中去 添加一个新的mode到connector中去,其实内核中已经有相关接口了,需要做一些小改动。 1.不采用设备树的方式去配置,将720p和1080p的timing参数配置放在数组中。 2.这里的printer和设备树中的.compatible = "printer"一致。 3.将其添加到connector中去 static int panel_simple_get_fixed_modes(struct

weixin_42097108的博客 864

Vue Coverflow 组件介绍

Vue Coverflow 组件介绍 Vue Coverflow 是一个使用 Vue.js 开发的开源项目,主要利用 Vue 的响应式和组件化特性来模拟苹果公司的 Cover Flow UI 效果。该项目主要使用 JavaScript 编写,同时也涉及到 Vue 和 CSS。 项目基础介绍 Vue Coverflow 组件旨在为用户提供一种直观的图像展示方式,用户可以左右滑动查看不同的图片及标题信...

gitblog_01177的博客 393

YOLOv11在视频流中的时序建模改进-(加入ConvLSTM或Transformer捕捉帧间关联)

本文提出了一种结合ConvLSTM和Transformer的改进YOLOv11算法,用于增强视频目标检测的时序建模能力。针对视频检测中运动模糊、遮挡等挑战,研究分析了ConvLSTM的局部时空特征建模和Transformer的全局注意力机制之间的互补性。通过数学公式详细阐述了ConvLSTM的门控机制和Transformer的自注意力计算原理,并提出分层融合策略:底层使用ConvLSTM处理高分辨率特征捕捉局部运动,高层应用Transformer建立全局时空关联。改进方案在YOLOv11架构中插入时序增强模

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 680

使用Simulink对固定翼无人机的自动起飞与降落进行仿真

本文介绍了基于Simulink的固定翼无人机自动起飞与降落控制系统设计方法。系统包含飞行器动力学模型、控制系统、环境模拟等模块,通过简化动力学方程描述无人机运动特性。详细说明了从创建模型、设置动力学方程、设计PID控制器(包括自动起飞和降落控制策略)到添加环境模拟的完整仿真流程。重点阐述了升降舵和发动机推力的控制律设计,以及性能评估要点。本方法可有效验证控制系统设计,优化飞行稳定性和安全性参数,为无人机自主控制提供仿真支持。

amy_mhd的博客 223

flash特效原理:CoverFlow 效果(2)

flash特效原理:CoverFlow 效果(2)

夏天的树人的专栏 8908

计算机组成原理(第三版)唐朔飞-第十章控制单元的设计-课后习题

计算机组成原理(第三版)唐朔飞-第十章控制单元的设计-课后习题

weixin_45735391的博客 3万+
上一篇: NSString方法用法积累
下一篇: IOS5:iOS5里面遇到的兼容性问题以及解决方法
ch_soft
博客等级 码龄17年 828粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值