闲话

曾经在闲逛时,看到有一个很炫的3D翻转切换图片的效果。地址在这里:https://tympanus.net/Development/Slicebox/index.html
一直想搞一个,最近撸出来一个自定义View,包含多个效果,其中一种与之相近。

正文

1.效果
话不多说,先看效果:
2d平移:

3D翻转:

3D开合:

百叶窗:

3D轮转:

是否觉得酷炫呢?
2.核心原理
如果你已经迫不及待的想知道实现的原理,那我先把源码的传送门给你:https://github.com/zhangyuChen1991/Roll3DImageView
不过直接撸代码,效率难免低,如果有介绍的文章,为什么不看呢?接下来我们一步一步来分析各种效果的实现过程。
开门见山,我们直击要点:这一系列的效果实现的基础是对两个类的使用,Camera和Matrix。这也是我们今天的主角。
先来看几个API:
camera.rotateX(float deg);
camera.rotateY(float deg);
camera.rotateZ(float deg);
camera有一个三维坐标系,x轴水平,Y轴竖直,Z轴垂直屏幕指向你。上面三个API意思很明显就是绕着三个轴旋转一定的角度,camera的处理对象是matrix,将处理后的matrix应用在图片上,就会让一个平铺在屏幕上的图片产生绕x轴或者y轴旋转过后的3D效果了。像这样(盗个图):
(图片出自另一篇将camera和matrix讲得很不错的文章:传送门在这里)

知道了camera的这个基础而关键的API,我们再来看下面一段代码:

camera.save();
camera.rotateX(-rotateDegree);
camera.getMatrix(matrix);
camera.restore();matrix.preTranslate(-currBitmap.getWidth() / 2, 0);
matrix.postTranslate(currBitmap.getWidth() / 2 + i * averageWidth, axisY);
canvas.drawBitmap(currBitmap, matrix, paint);

上面的代码做了一件事:将matrix用camera旋转处理后运用在bitmap上,将bitmap显示出来。这里显示出来的效果就如上面的图片展示,是有3D效果的。
但是这里要讲的关键不是这个,请注意其中的四行代码:

camera.rotateX(-rotateDegree);
camera.getMatrix(matrix);
matrix.preTranslate(-currBitmap.getWidth() / 2, -currBitmap.getHeight());
matrix.postTranslate(currBitmap.getWidth() / 2 , axisY);

这里的preTranslate()和postTranslate()有什么作用?
通常上理解,preTranslate()就是在一个matrix发生变化之前,给它做一个平移,postTranslate()是在一个matrix发生变化之后做平移。通过参数来看,这里的动作是把它先往左上方移动,然后往右下方移动,目的只有一个:在matrix做旋转处理时改变旋转中心的位置。
camera旋转matrix时,中心点在(0,0),这是它的旋转中心,而(0,0)点只是matrix的左上角,如果不处理就旋转的话,旋转轴就是matrix的顶边或者左边,这里竖直方向先向上移动了整个bitmap的高度,让它的旋转轴变成了bitmap的底部,如果不移动,则在bitmap的顶部。
结合一张丑图来看吧:

蓝色框的中心就是旋转操作的中心,如果移到绿框位置,则对图片进行以中心为旋转的处理。
所以这里的过程总结为:
1 移动bitmap到旋转轴合适的位置
2 进行旋转处理
3 移回原位,显示处理后的位图效果

还有一点要注意到,上面代码中移过去和移回来,参数是不一样的,也就是说,图片并不是移回原位。这点应该比较好理解,3D翻转的过程,图片的位置其实是变化的,当前图片会逐渐移出显示框,下一张图片会逐渐进来,所以参数不同为了就是造成图片位置移动而已。

上面这段内容其实就是整个所有效果实现的核心了,如果你跟着这个思路理清楚了,再看代码应该要省力得多。

3.3D翻转基本过程
那么我们梳理一下整体3D翻转的过程:
水平向左翻转,第一张图片旋转轴在最右,旋转角度不断增加,同时旋转轴逐渐往左移动;第二张图片旋转轴在自己的最左,旋转角度不断减小,同时旋转轴逐渐靠向左边;于是就产生了3D翻转切换的效果了。竖直方向类同。
如果你理解了上面讲述的过程,那么跟着这段描述来试着写出代码吧!

其实讲到这里,最关键的原理已经说完了,下面没有什么太干的货了,我们简单梳理一下分割变化的过程吧。

4.基础之上的扩展
整体3D翻转,我们处理的是图片的整个bitmap。分割翻转的道理其实是一样的,只是要先做一步:将bitmap均等分割成若干块,放到数组里备用。当启动效果时,依次拿出每个bitmap,处理它的旋转、位移,就可以了。

1.分割合并效果:这个没啥好说的,整体3D是操作一个,这里分成3个照整体3D哪样处理就可以了。唯一要注意的一点是:每一块bitmap平移回来的时候,记得算对参数,把图片完整的拼回一起。

2.百叶窗效果:唯一的不同就是每一块bitmap翻转的中心不同了,其他的旋转轴都在边沿,而它是在中心位置。

3.轮转效果:这个我认为最炫的一个效果,其实原理也就那么回事了,每块bitmap依次执行3D翻转,最后全部翻转过来,就是这样了。

结尾

最后还想说的是,在实践的过程中,我发现偏移某些参数相互搭配,其实会产生更加3D逼真绚丽的效果。我浅尝辄止,期待你们脑洞大开无限探索,只有想不到,没有做不到!

最后的最后,贴一遍项目地址吧,欢迎大家赏脸前去观看。https://github.com/zhangyuChen1991/Roll3DImageView
如发现问题,欢迎斧正!

花式实现图片3D翻转效果相关推荐

  1. html3d上下翻转4面效果,花式实现图片3D翻转效果

    闲话 曾经在闲逛时,看到有一个很炫的3D翻转切换图片的效果.地址在这里:https://tympanus.net/Development/Slicebox/index.html 一直想搞一个,最近撸出 ...

  2. CSS3之图片3D翻转效果(网页效果--每日一更)

    今天,带来的是纯CSS3的效果--图片3D翻转. 请看效果:亲,请点击这里 这个效果主要还是运用了CSS3的transform变形属性,与上个效果不同的是,这次并不是动画,所以没有采用animatio ...

  3. 图片3D翻转效果 --摘自李硕老师博客160305

    原文地址:http://blog.csdn.net/u012215170/article/details/50421023 ndroid手机上有众多的炫酷的设计风格,动画必然是APP的一大亮点,所以一 ...

  4. html5 鼠标旋转动画效果,CSS3鼠标滑过图片3D翻转动画特效

    这是一款效果非常炫酷的CSS3鼠标滑过图片3D翻转动画特效.该特效基于Bootstrap网格系统来布局,通过简单的CSS3代码,在鼠标滑过图片时对图片进行3D翻转,效果非常的酷. 使用方法 HTML结 ...

  5. html关于实现图片2D,3D翻转效果

    如何实现图片2D,3D翻转效果? 直接上代码: 一.2D翻转: /*2D翻转*/ .cartoon_0 {transition: transform 2s/*反转动画关键*/} /*利用hover设置 ...

  6. 用css实现扑克牌,图片的翻转效果

    用css实现扑克牌,图片的翻转效果 话不多说,直接上代码! 1.实现商品图片的翻转以及信息的展示(下面代码仅是个人想要效果的HTML代码,所有的class名称可根据自身需求进行改动) <!doc ...

  7. css和js实现3d图片,JavaScript_纯JS实现旋转图片3D展示效果,CSS:style type=text/cssgt - phpStudy...

    纯JS实现旋转图片3D展示效果 CSS: #show{position:relative;margin:20px auto;width:800px;} .item{position:absolute; ...

  8. android左右旋转动画效果图,Android新姿势:3D翻转效果原理

    首先,android里是没有3D翻转的动画效果的,但是呢,android有提供一个Camera的类,可以利用这个类来实现. 先看代码,Rotate3d是继承了Animation的一个动画类,多余的代码 ...

  9. css3实现翻转效果,css3 实现3D翻转效果

    css3 实现3D翻转效果. HTML源码: 前面内容,鼠标移到这,试试 用户名 密码 css源码: /* entire container, keeps perspective */ .flip-c ...

最新文章

  1. MongoDB源码概述——使用日志提升单机数据可靠性
  2. Spring-学习笔记07【银行转账案例】
  3. Java面试题之HashMap如何有效减少碰撞
  4. 如何在 GPU 上加速数据科学
  5. protected访问权限_权限修饰符 /重写
  6. t580 thinkpad_聊聊ThinkPad T580:除了大屏,还有什么
  7. Springboot Mybatis使用PageHelper实现分页查询
  8. 【Python】PyMySQL 连接 MySQL数据库
  9. java struts2教程_Struts2教程
  10. Shopee数据获取逻辑
  11. 动态规划——01背包——精卫填海
  12. js正则贪婪模式_js 正则表达式问题 贪婪与非贪婪
  13. adb运行以及adb常用命令
  14. 【微信小程序】粤语教学平台-粤言粤语
  15. 阿里云上创建Oracle RAC-静默模式
  16. oracle 存储过程带入参,oracle中带参存储过程的使用
  17. JMeter对接口进行压力测试
  18. 使用woo 语言开发 sockets4 sockets5 http https代理完整记录
  19. Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题
  20. 【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机

热门文章

  1. FPGA学习笔记2.2——用Verilog实现七段管的工作逻辑
  2. 让我摘下星星送给你_抖音摘下星星给你是什么歌_抖音想摘下星星给你歌名是什么_好特教程...
  3. 动易html在线编辑器 漏洞,动易网站管理系统vote.asp页面存在SQL注入漏洞
  4. 计算机进行科学实验报告,计算机组成原理实验报告5- PC实验
  5. android studio 引入vitamio,Android studio3.0导入vitamio结果报错,求大神看看问题怎么解决...
  6. 计算机在铁路中的应用论文800字,交通运输和交通论文,关于计算机信息网络系统在铁路交通运输管理中的应用相关参考文献资料-免费论文范文...
  7. 【信号处理】数字信号处理Matlab设计附GUI界面和报告
  8. 计算机应用基础试题文件夹,计算机应用基础试题及参考答案
  9. c语言中“函数的定义不可以嵌套,但函数的调用可以嵌套
  10. webgis期末考试试题_《WebGIS课程》期末考试复习资料