Java的新视差控件(JavaFX)
介紹
視差是一種視覺(jué)效果,您可以組合以不同速度移動(dòng)的兩個(gè)分層圖像以獲得深度感。
想想一下,當(dāng)您在道路上行駛時(shí),您會(huì)看到附近的樹(shù)木在快速移動(dòng),而距離較遠(yuǎn)的樹(shù)木將沿相同的方向移動(dòng),但速度較慢,結(jié)果是您感覺(jué)到樹(shù)木在快速移動(dòng)與您和其他人更親近。
如果您是電子游戲迷,那么您肯定已經(jīng)看過(guò)這種效果:將兩張圖像放在另一張圖像上,背景移動(dòng)得較慢,而前景(可能是玩家的頭像移動(dòng)得更快)。
這是視頻游戲世界中經(jīng)常使用的技巧。 它開(kāi)始使用很久以前,例如《超級(jí)馬里奧》電子游戲系列。
超級(jí)馬里奧游戲使用視差效果
此效果已在用戶(hù)界面區(qū)域中采用,您可以在網(wǎng)站區(qū)域以及某些應(yīng)用程序中看到該效果。
網(wǎng)站上的視差–來(lái)源:https://dribbble.com/shots/1378010–GIF-Parallax-Building-animation
我的目標(biāo)是以控件的形式將其引入JavaFX,您可以在其中通過(guò)簡(jiǎn)單的API添加視差效果。
ListView中的視差
我的主要目標(biāo)是將其帶到ListView,即具有一個(gè)類(lèi)似于ListView的API的控件,您可以在其中設(shè)置背景圖像和項(xiàng)目列表,就像在JavaFX ListView中一樣。
實(shí)現(xiàn)ParallaxListView
若要產(chǎn)生視差效果,ListView中的項(xiàng)目(即單元格)需要以比背景圖像更快的速率滾動(dòng)。
這個(gè)新控件將使用具有透明背景的JavaFX ListView,該背景位于背景圖像的前面。
第一個(gè)挑戰(zhàn)是JavaFX ListView的滾動(dòng)是通過(guò)跳轉(zhuǎn)完成的,也就是說(shuō),當(dāng)您執(zhí)行滾動(dòng)操作時(shí),位置將從原始位置跳轉(zhuǎn)到結(jié)束位置,而無(wú)需經(jīng)過(guò)中間位置值。 這將破壞效果,因?yàn)闆](méi)有像現(xiàn)實(shí)世界中那樣的運(yùn)動(dòng),只有一組離散的位置。 在現(xiàn)實(shí)世界中,前景中的對(duì)象通過(guò)翻譯動(dòng)畫(huà)移動(dòng)得更快,請(qǐng)記住,這是關(guān)于模仿現(xiàn)實(shí)世界中的現(xiàn)象(如我之前給出的駕駛示例),以提供深度感。
因此,要實(shí)現(xiàn)此目的,我必須實(shí)現(xiàn)自己的ListView滾動(dòng)以及背景滾動(dòng),而背景滾動(dòng)則通過(guò)一組位置設(shè)置動(dòng)畫(huà)。
ParallaxListView示例
從哪里獲得
現(xiàn)在您可以在這里獲取它: https : //github.com/dukke/parallax-list-view
我決定堅(jiān)持使用JavaFX 8,因?yàn)镴ava 9仍然相對(duì)較新,并且有些人可能尚未遷移。 這樣,Java 8和Java 9程序就可以使用它。
我使用的是私有API,即VirtualFlow,但是在JavaFX 9中已變成公共API,因此可以輕松遷移ParallaxListView代碼。
測(cè)試文件夾包含有關(guān)如何使用控件的示例。 您必須滾動(dòng)鼠標(biāo)滾輪才能看到效果。
結(jié)論和進(jìn)一步發(fā)展
ParallaxListView可以給您的應(yīng)用程序一個(gè)很好的聯(lián)系,增加一些天賦,但是不要過(guò)度使用此效果。
在接下來(lái)的幾天里,我計(jì)劃添加以下內(nèi)容:
- 添加對(duì)滾動(dòng)條滾動(dòng)的支持。
- 添加API以更改背景圖像相對(duì)于前景的高度
- 添加指定ParallaxListView方向的功能:水平或垂直
- 添加文檔頁(yè)面
- 還提供一個(gè)通用控件,使您可以指定背景和任意可滾動(dòng)的前景控件。
翻譯自: https://www.javacodegeeks.com/2018/03/new-parallax-control-for-java-javafx.html
總結(jié)
以上是生活随笔為你收集整理的Java的新视差控件(JavaFX)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎样清理手机喇叭灰尘(怎么才能清理手机喇
- 下一篇: 在Java中使用Google的协议缓冲区