日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html3d上下翻转4面效果,花式实现图片3D翻转效果 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

閑話

曾經(jīng)在閑逛時,看到有一個很炫的3D翻轉(zhuǎn)切換圖片的效果。地址在這里:https://tympanus.net/Development/Slicebox/index.html

一直想搞一個,最近擼出來一個自定義View,包含多個效果,其中一種與之相近。

正文

1.效果

話不多說,先看效果:

2d平移:

2d

3D翻轉(zhuǎn):

3D

3D開合:

3D開合

百葉窗:

百葉窗

3D輪轉(zhuǎn):

3D輪轉(zhuǎn)

是否覺得酷炫呢?

2.核心原理

如果你已經(jīng)迫不及待的想知道實現(xiàn)的原理,那我先把源碼的傳送門給你:https://github.com/zhangyuChen1991/Roll3DImageView

不過直接擼代碼,效率難免低,如果有介紹的文章,為什么不看呢?接下來我們一步一步來分析各種效果的實現(xiàn)過程。

開門見山,我們直擊要點:這一系列的效果實現(xiàn)的基礎(chǔ)是對兩個類的使用,Camera和Matrix。這也是我們今天的主角。

先來看幾個API:

camera.rotateX(float deg);

camera.rotateY(float deg);

camera.rotateZ(float deg);

camera有一個三維坐標(biāo)系,x軸水平,Y軸豎直,Z軸垂直屏幕指向你。上面三個API意思很明顯就是繞著三個軸旋轉(zhuǎn)一定的角度,camera的處理對象是matrix,將處理后的matrix應(yīng)用在圖片上,就會讓一個平鋪在屏幕上的圖片產(chǎn)生繞x軸或者y軸旋轉(zhuǎn)過后的3D效果了。像這樣(盜個圖):

(圖片出自另一篇將camera和matrix講得很不錯的文章:傳送門在這里)

這里寫圖片描述

這里寫圖片描述

知道了camera的這個基礎(chǔ)而關(guān)鍵的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旋轉(zhuǎn)處理后運用在bitmap上,將bitmap顯示出來。這里顯示出來的效果就如上面的圖片展示,是有3D效果的。

但是這里要講的關(guān)鍵不是這個,請注意其中的四行代碼:

camera.rotateX(-rotateDegree);

camera.getMatrix(matrix);

matrix.preTranslate(-currBitmap.getWidth() / 2, -currBitmap.getHeight());

matrix.postTranslate(currBitmap.getWidth() / 2 , axisY);

這里的preTranslate()和postTranslate()有什么作用?

通常上理解,preTranslate()就是在一個matrix發(fā)生變化之前,給它做一個平移,postTranslate()是在一個matrix發(fā)生變化之后做平移。通過參數(shù)來看,這里的動作是把它先往左上方移動,然后往右下方移動,目的只有一個:在matrix做旋轉(zhuǎn)處理時改變旋轉(zhuǎn)中心的位置。

camera旋轉(zhuǎn)matrix時,中心點在(0,0),這是它的旋轉(zhuǎn)中心,而(0,0)點只是matrix的左上角,如果不處理就旋轉(zhuǎn)的話,旋轉(zhuǎn)軸就是matrix的頂邊或者左邊,這里豎直方向先向上移動了整個bitmap的高度,讓它的旋轉(zhuǎn)軸變成了bitmap的底部,如果不移動,則在bitmap的頂部。

結(jié)合一張丑圖來看吧:

解釋圖片

藍(lán)色框的中心就是旋轉(zhuǎn)操作的中心,如果移到綠框位置,則對圖片進行以中心為旋轉(zhuǎn)的處理。

所以這里的過程總結(jié)為:

1 移動bitmap到旋轉(zhuǎn)軸合適的位置

2 進行旋轉(zhuǎn)處理

3 移回原位,顯示處理后的位圖效果

還有一點要注意到,上面代碼中移過去和移回來,參數(shù)是不一樣的,也就是說,圖片并不是移回原位。這點應(yīng)該比較好理解,3D翻轉(zhuǎn)的過程,圖片的位置其實是變化的,當(dāng)前圖片會逐漸移出顯示框,下一張圖片會逐漸進來,所以參數(shù)不同為了就是造成圖片位置移動而已。

上面這段內(nèi)容其實就是整個所有效果實現(xiàn)的核心了,如果你跟著這個思路理清楚了,再看代碼應(yīng)該要省力得多。

3.3D翻轉(zhuǎn)基本過程

那么我們梳理一下整體3D翻轉(zhuǎn)的過程:

水平向左翻轉(zhuǎn),第一張圖片旋轉(zhuǎn)軸在最右,旋轉(zhuǎn)角度不斷增加,同時旋轉(zhuǎn)軸逐漸往左移動;第二張圖片旋轉(zhuǎn)軸在自己的最左,旋轉(zhuǎn)角度不斷減小,同時旋轉(zhuǎn)軸逐漸靠向左邊;于是就產(chǎn)生了3D翻轉(zhuǎn)切換的效果了。豎直方向類同。

如果你理解了上面講述的過程,那么跟著這段描述來試著寫出代碼吧!

其實講到這里,最關(guān)鍵的原理已經(jīng)說完了,下面沒有什么太干的貨了,我們簡單梳理一下分割變化的過程吧。

4.基礎(chǔ)之上的擴展

整體3D翻轉(zhuǎn),我們處理的是圖片的整個bitmap。分割翻轉(zhuǎn)的道理其實是一樣的,只是要先做一步:將bitmap均等分割成若干塊,放到數(shù)組里備用。當(dāng)啟動效果時,依次拿出每個bitmap,處理它的旋轉(zhuǎn)、位移,就可以了。

1.分割合并效果:這個沒啥好說的,整體3D是操作一個,這里分成3個照整體3D哪樣處理就可以了。唯一要注意的一點是:每一塊bitmap平移回來的時候,記得算對參數(shù),把圖片完整的拼回一起。

2.百葉窗效果:唯一的不同就是每一塊bitmap翻轉(zhuǎn)的中心不同了,其他的旋轉(zhuǎn)軸都在邊沿,而它是在中心位置。

3.輪轉(zhuǎn)效果:這個我認(rèn)為最炫的一個效果,其實原理也就那么回事了,每塊bitmap依次執(zhí)行3D翻轉(zhuǎn),最后全部翻轉(zhuǎn)過來,就是這樣了。

結(jié)尾

最后還想說的是,在實踐的過程中,我發(fā)現(xiàn)偏移某些參數(shù)相互搭配,其實會產(chǎn)生更加3D逼真絢麗的效果。我淺嘗輒止,期待你們腦洞大開無限探索,只有想不到,沒有做不到!

總結(jié)

以上是生活随笔為你收集整理的html3d上下翻转4面效果,花式实现图片3D翻转效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。