闲话

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

一直想搞一个,最近撸出来一个自定义View,包含多个效果,其中一种与之相近。

正文

1.效果

话不多说,先看效果:

2d平移:

2d

3D翻转:

3D

3D开合:

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逼真绚丽的效果。我浅尝辄止,期待你们脑洞大开无限探索,只有想不到,没有做不到!

html3d上下翻转4面效果,花式实现图片3D翻转效果相关推荐

  1. 花式实现图片3D翻转效果

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

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

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

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

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

  4. 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; ...

  5. java验证码效果,和图片缩略效果

    java验证码效果,和图片缩略效果 效果图:验证码 效果图:缩略 这两个效果我做在了一个类里面,可以进行调用,直接上代码 注:要是复制粘贴此代码,需要更改自己所使用的字体,也可以用我这个字体,记得更改 ...

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

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

  7. html5 相册翻转效果,HTML5 css3:3D旋转木马效果相册

    这篇博客的目的是因为上篇HTML5 CSS3专题 诱人的实例 CSS3打造百度贴吧的3D翻牌效果中有个关于CSS 3D效果的比较重要的知识点没讲到,就是perspective和tranlateY 效果 ...

  8. html鼠标滚动图片折叠,鼠标滑过图片3D折叠效果

    本教程我们将使用CSS3 3D transforms和jQuery来制作一个神奇的3D折叠效果. 在我们的demo中,图片在鼠标滑过的时候被折叠,空出来的部分将显示图片的一些信息.我们将创建一个放置图 ...

  9. html5实现立体照片墙效果,利用css制作3D照片墙效果

    利用css制作3D照片墙,具体代码如下所示: 无标题文档 以上代码是准备工作,在html代码的body主体中放了一个div,里面包着你想要显示在照片墙上的照片,数量可以任意.接着开始着手写样式. bo ...

最新文章

  1. Golang开发环境搭建-Vim篇
  2. python PyQt5 QtWidgets.QAbstractSlider类(QScrollBar,QSlider和QDial之类的小部件的公共超类)
  3. 2038问题 linux_Linux 文件系统类型导览
  4. 推荐20款基于 jQuery CSS 的文本效果插件
  5. sqlyong的一个bug(代号2013)
  6. WEB API Filter的使用以及执行顺序
  7. 176.第二高的薪水
  8. Windows XP 优化
  9. 白话空间统计二十四:地理加权回归(六)ArcGIS的GWR工具参数说明一
  10. JQuery UI 各框架总结
  11. 软件测试学习书籍8本【经典推荐】
  12. 数据结构——线性链表/单链表设计
  13. 中国牛市还会来吗,中国牛市啥时候到?
  14. JAVA复制数组的三种方法
  15. 网易微博宣布将用户迁移至轻博客Lofter
  16. 什么是外网服务器?如何搭建外网服务器
  17. 设置删除命令别名--用Enki学Linux系列(10)
  18. migo获取header sap_SAP中migo什么意思
  19. 用HTML+CSS+JS做一个漂亮的个人网页
  20. http://windowsandroid.cn.uptodown.com/download

热门文章

  1. How to judge if one model data is out of date
  2. SAP UI5是如何从浏览器读取语言设置并按照优先级排序的
  3. 使用nodejs代码在SAP C4C里创建Individual customer
  4. 为什么有的SAP CRM系统的产品搜索页面上会显示小红叉
  5. SAP Cloud for Customer里Sales Order和Sales Quote的建模方式
  6. 用代码判断当前系统是否支持某个版本的feature
  7. Kubenetes里pod和service绑定的实现方式
  8. 细胞计算机生命游戏,【图片】【20170108 其它內容】【转】生命游戏【三体吧】_百度贴吧...
  9. 华为的型号命名规则_电力电缆产品的型号命名规则
  10. 两数之和Python解法