android 開機動畫 漸變,[Parallax Animation]實現知乎 Android 客戶端啟動頁視差滾動效果...

前言

Parallax Scrolling (視差滾動),是一種常見的動畫效果。視差一詞來源于天文學,但在日常生活中也有它的身影。在疾馳的動車上看風景時,會發現越是離得近的,相對運動速度越快,而遠處的山川河流只是緩慢的移動著,這就是最常見的視差效果。視差動畫獨有的層次感能帶來極為逼真的視覺體驗,iOS、Android Launcher、Website 都將視差動畫作為提升用戶視覺愉悅度的不二選擇。

客戶端應用第一次打開出現引導頁也不是什么新鮮的事兒,ViewPager 配上幾張設計師精心繪制的圖片,分分鐘即可了事。但是總有人把平凡的事情做到不平凡,如本文的知乎客戶端,亦或是新浪微博賀歲版,百度貼吧某版等眾多應用里都出現了視差動畫的身影,隨著用戶手指的滑動,反饋以靈動、貼近真實的視覺以及操作體驗,對應用的初始印象登時被提升到一個極高的點。

給我印象最深的是去年新浪微博的賀歲版,引導頁是一系列的年畫,里面有紅色剪紙的小孩兒,滑動界面的時候感覺這些元素在『動』,是真正的靈動,能勾起人童年的回憶,年味兒十足。不過話說我年怎么過跟新浪微博一毛錢關系都沒有,但是這個啟動頁卻是深得我意。只是這個版本的微博找不到了,正好前兩天看到知乎的啟動頁做的也不錯,就正好拿來練練手吧。

本文就知乎 Android 客戶端啟動頁面為例,教你如何實現視差滾動效果。

2621820748c8508c0b8bd7e42773156c.gif

界面分析

細心把玩下知乎的啟動頁,不難分析出來,視差動畫主要體現在背景層漸變、內容層元素差異滾動上,動畫內容分別是:

- 內容:元素差異滾動,形成視差效果()

- 背景:隨著界面的滑動,顏色由深藍色漸變為淺藍色()

- 文字:底部提示文案會隨頁面變動而切換,有簡單的淡入淡出效果

- 界面動畫:界面打開,元素的出場動畫(第一頁以及最后一頁)

鑒于其它幾項比較簡單,本文主要講視差動畫以及背景漸變的實現,其它幾項請自行參閱代碼,見后文。

Parallax Scrolling

這里的視差滾動效果,主要表現為內容元素滾動速率的差異上。比如在 ViewPager 中滑動了 1px ,而 A 元素移動 2px , B 元素移動 1.5px ,這種移動差距的比率,我稱之為 parallaxCofficient ,即 視差系數 或者 視差速率 ,正是同一個界面中的元素,由于層級不同,賦予的視差系數不同,在移動速度上的差異形成了視差的錯覺,這就是我們要追求的效果。

那知道原理就好辦了,使用 ViewPager.OnPageChangeListener ,動態計算不就得了。 no no no ! 后面完成背景漸變效果確實需要計算這個,但是 ViewPager 已經為我們準備好了變形元素 transformium : ViewPager.PageTransformer ,它有一個抽象方法 transformPage(View page, float position) ,正是為我們完成視差動畫量身定制的。

ViewPager.PageTransformer

PageTransformer 在 ViewPager 滑動時被觸發,它為我們自定義頁面中進行視圖變換打開了一扇大門。

javapublic abstract void transformPage (View page, float position)

在 ViewPager 源碼中,我們可以很直觀的看到它的調用過程:

java// ViewPager#onPageScrolled

if (mPageTransformer != null) {

final int scrollX = getScrollX();

final int childCount = getChildCount();

for (int i = 0; i < childCount; i++) {

final View child = getChildAt(i);

final LayoutParams lp = (LayoutParams) child.getLayoutParams();

if (lp.isDecor) continue;

final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth();

mPageTransformer.transformPage(child, transformPos);

}

}

Param 1: View page

從上面的代碼中,不難看出,page 就是當前被滑動的頁面,調試得知,每一個 child view 被 NoSaveStateFrameLayout 包裝,也就是說 page.getChildAt(0) 即是每個 page 實際的 child view 。

Param 2: float position

position 這個參數不看代碼或者文檔,總會誤以為就是我們熟知的 integer position ,不過它實際上是滑動頁面的一個相對比例,本質跟 1、2、3、4 這種 position 是一樣的。

比如知乎啟動頁共有 6 個頁面,分別是 A、B、C、D、E、F 初始狀態也就是 A 頁面靜止時,A 頁面的 position 正好是 0 ,B 頁面是 1 。而后滑動頁面(B -> A),在這個過程中 A 的 position 是間于 [-1, 0] ,B 頁面則是間于 [0, 1] 。

不過這個參數的文檔卻是簡單不夠直觀,對照上面的例子,現在應該很清晰了。

Position of page relative to the current front-and-center position of the pager. 0 is front and center. 1 is one full page position to the right, and -1 is one page position to the left.

ParallaxTransformer

根據上面的分析,我們可以得出一個相對簡單的自定義 transformer ,對 page view 進行遍歷,遞增或者遞減其 parallaxCofficient ,以得到我們預期的效果,具體的系數設置請參考代碼。

javaclass ParallaxTransformer implements ViewPager.PageTransformer {

float parallaxCoefficient;

float distanceCoefficient;

public ParallaxTransformer(float parallaxCoefficient, float distanceCoefficient) {

this.parallaxCoefficient = parallaxCoefficient;

this.distanceCoefficient = distanceCoefficient;

}

@Override

public void transformPage(View page, float position) {

float scrollXOffset = page.getWidth() * parallaxCoefficient;

// ...

// layer is the id collection of views in this page

for (int id : layer) {

View view = page.findViewById(id);

if (view != null) {

view.setTranslationX(scrollXOffset * position);

}

scrollXOffset *= distanceCoefficient;

}

}

}

背景漸變

留心才會發現,從第一頁滑動到最后一頁,背景色會平滑的從深藍色過度到淺藍色,這種效果又該怎么實現呢?

用過 Property Animation 的同學應該知道,以前的 Animation 只能用在 View 上,而 Property Animation 卻可以用在任意類型屬性值上,這歸功于 TypeEvaluator 。

正好我們有 ArgbEvaluator ,它可以估算兩個顏色值之間,任意部分的色值。因此,只需要指定起始色值以及最終的色值,傳入滑動所對應的 fraction 即當前位置相對總距離的比例值,即可獲得相應的色值。

javapublic class ArgbEvaluator implements TypeEvaluator {

public Object evaluate(float fraction, Object startValue, Object endValue) {

// ...

}

}

當然,前面說到需要使用 ViewPager.OnPageChangeListener 的:

javaclass GuidePageChangeListener implements ViewPager.OnPageChangeListener {

ArgbEvaluator mColorEvaluator;

int mPageWidth, mTotalScrollWidth;

int mGuideStartBackgroundColor, mGuideEndBackgroundColor;

public GuidePageChangeListener() {

mColorEvaluator = new ArgbEvaluator();

mPageWidth = getWindowManager().getDefaultDisplay().getWidth();

mTotalScrollWidth = mPageWidth * mAdapter.getCount();

mGuideStartBackgroundColor = getResources().getColor(R.color.guide_start_background);

mGuideEndBackgroundColor = getResources().getColor(R.color.guide_end_background);

}

@Override

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

float ratio = (mPageWidth * position + positionOffsetPixels) / (float) mTotalScrollWidth;

Integer color = (Integer) mColorEvaluator.evaluate(ratio, mGuideStartBackgroundColor, mGuideEndBackgroundColor);

mPager.setBackgroundColor(color);

}

@Override

public void onPageSelected(int position) {}

@Override

public void onPageScrollStateChanged(int state) {}

}

源碼

代碼已經 push 到 Github 了,諸位自取。不過請注意,其素材均取自于知乎 Android 客戶端(你懂的),學習交流即可,請勿用作商業用途。

還求更優雅的實現方式,歡迎發起 pull request 。

參考

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533775.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js訪問對方手機文件夾_求JS大神幫我寫個利用JS來實現手機端和PC端訪問自動選擇樣式文件代碼...

展開全部現在比較流行的辦法是 一個網站2套代碼&#xff0c;一套是手機一套pc&#xff0c;在網站首頁開e68a84e8a2ad3231313335323631343130323136353331333363353735頭寫上一段識別各瀏覽器的判斷方法&#xff0c;根據結果引入不同的樣式詳細判斷如下&#xff1a;var browser{…

python可以做計量分析嗎_技術分享 - python數據分析(2)——數據特征分析(上)...

1 分布分析 分布分析能揭示數據的分布特征和分布類型。對于定量數據&#xff0c;欲了解其分布形式是對稱的還是非對稱的&#xff0c;發現某些特大或特小的可疑值&#xff0c;可通過繪制頻率分布表、繪制頻率分布直方圖、繪制莖葉圖進行直觀地分析&#xff1b;對于定性分類數據&…

android lrc 歌詞顯示,Android歌詞 AndroidLrc歌詞

[ti:Android][ar:川畑要][al:0][by:黃病病][00:00.00][00:01.69]Android[00:07.51]歌手&#xff1a;川畑要[00:10.96]作詞&#xff1a;Kaname Kawabata[00:12.64]作曲&#xff1a;UTAKaname Kawabata[00:14.06]BY:黃病病[00:15.80][00:15.66]一際目を引くまるでandroid[00:23.1…

web前端開發技術期末考試_Web前端開發技術期末試題1

絕密★啟用前Web前端開發技術期一、單項選擇題(本大題共25小題&#xff0c;每小題1分&#xff0c;共25分)1.網頁制作工具按照其工作方式可分為( )A.HTML語言和非HTML語言兩大類B.DHTML方式和JavaScript方式兩大類C.標注型網頁制作工具和所見即所得型網頁制作工具兩大類D.基于Wi…

matlab的7.3版本是什么_樂建工程寶V6.3版本升級說明公告

尊敬的樂建工程寶客戶&#xff1a;您好&#xff01;為了給客戶提供更加優質的產品和服務&#xff0c;我司已于2019年11月20日開始樂建工程寶V6.3版本升級服務。目前&#xff0c;Android系統各應用市場已基本審核完畢&#xff0c;iOS系統已上傳AppStore&#xff0c;目前蘋果官方…

魅族android 版本 6.0下載,flyme6.0內測版

由魅族開發的全新安卓系統flyme6.0系統固件已經到來&#xff0c;相對于Flyme 5系統有了眾多改變和提升&#xff0c;全新的智能服務系統&#xff0c;多達400于項全新功能&#xff0c;同時讓操作界面更加簡潔&#xff0c;易于操作&#xff0c;而系統運行速度也將有所提升&#xf…

origin設置不同區域的顏色_[測試狗]Origin入門教程(二十四):效率翻倍小技巧——修改默認字體...

在使用Origin的時候&#xff0c;對于每次繪圖都需要更改字體覺得很麻煩&#xff0c;因為Origin默認的字體為Arial&#xff0c;但是我們常用的字體一般為Times New Roman&#xff0c;在下拉框的很底部&#xff0c;每次更改都很浪費時間。那為什么不把他設置成默認字體呢&#xf…

cgi web 調用多次啟動_全面了解CGI、FastCGI、PHPFPM

一、拋個磚1、Web Server傳遞數據的方法正式說CGI之前&#xff0c;先來了解一下Web Server傳遞數據的另外一種方法&#xff1a;PHP Module加載方式。相信都會想起Apache吧&#xff0c;初學php時&#xff0c;在windows上安裝完php和Apache之后&#xff0c;為了讓Apache能夠解析p…

android群英傳神兵利器pdf,《Android群英傳:神兵利器》勘誤

1勘誤一晃&#xff0c;我的新書《Android群英傳:神兵利器》上市好多天了&#xff0c;有不少朋友已經拿到書了。本來以為&#xff0c;這次我看了不下十遍&#xff0c;再加上編輯們的校對&#xff0c;應該不會有很多勘誤了吧~ 可事實證明&#xff0c;我還是太年輕啊&#xff01;大…

datatype未定義是什么意思_TypeError:無法讀取未定義的屬性'then'

loginService.islogged()上面的函數返回一個像“失敗”的字符串 . 但是&#xff0c;當我嘗試運行然后對它運行時&#xff0c;它將返回錯誤TypeError: Cannot read property then of undefined并且光標在 connected 之后和 .then 之前指示 .以下是完整功能&#xff1a;var conne…

python運行命令_對python中執行DOS命令的3種方法總結

1. 使用os.system("cmd") 特點是執行的時候程序會打出cmd在Linux上執行的信息。 import os os.system("ls") 2. 使用Popen模塊產生新的process 現在大部分人都喜歡使用Popen。Popen方法不會打印出cmd在linux上執行的信息。的確&#xff0c;Popen非常強大&a…

android studio 不生成buildconfig,Android Studio Update 0.4.0找不到buildConfig()

將Android Studio升級到版本0.4.0后&#xff0c;出現了一個新錯誤&#xff1a;我通過gradle-wrapper.properties升級到gradle 1.9distributionUrlhttp\://services.gradle.org/distributions/gradle-1.9-all.zip并升級了build.gradle中的gradle版本dependencies {classpath com…

譚民機器人_機器人視覺伺服研究進展-中科院自動化所-譚民.

文章編號:100220446(2004 0320277206機器人視覺伺服研究進展Ξ王麟琨,徐德,譚民(中國科學院自動化研究所復雜系統與智能科學實驗室,北京100080摘要:,針對當前機器人視覺伺服所面臨的主要問題, .關鍵詞:機器人;視覺伺服;綜述中圖分類號::Survey of R esearch on Robotic Visual …

mysql 按月和年累加_廣西柳州市市場監管局公布市2020年11月(第一批)電梯按需維保試點名單...

中國質量新聞網訊 根據《柳州市改進電梯維護保養模式試點工作方案》&#xff0c;近日&#xff0c;廣西柳州市市場監管局公布柳州市首批按需維保試點電梯名單&#xff0c;冠亞藍灣國際小區和南慶安置小區共46臺電梯成為首批試點電梯&#xff0c;標志著柳州市全面啟動了按需維保改…

python默認深拷貝_Python 深拷貝與淺拷貝

首先分享Python里面的數據類型1、不可變類型&#xff1a;Number(數字)、String(字符串)、Tuple(元組)。不可變數據類型在第一次聲明賦值的時候, 會在內存中開辟一塊空間, 用來存放這個變量被賦的值, 而這個變量實際上存儲的, 并不是被賦予的這個值, 而是存放這個值所在空間的內…

上傳 mp4 格式判斷_視頻如何轉換成通用的MP4格式?按下這個鍵,10秒就能搞定...

我們在網上下載視頻的時候&#xff0c;有很多的視頻都是無法播放的&#xff0c;或者是需要特定的播放器才可以播放。其實&#xff0c;只要把這些視頻的格式轉換成通用的MP4格式即可。如果你還不知道怎么轉換視頻格式&#xff0c;下面就教大家兩個小方法&#xff0c;百試百靈。一…

android不能在主線程,安卓開發:主線程真的不能做UI操作嗎?這一點很多程序員都沒想到...

只要參與過安卓項目開發一兩年的朋友們應該清楚&#xff0c;為了避免UI渲染出現異常安卓框架限制UI操作只能在主線程中進行&#xff0c;如果貿然在子線程做了UI操作結果會怎樣&#xff1f;我們隨便寫下了如下測試代碼。不出意外的話&#xff0c;代碼執行報錯拋出了名為CalledFr…

c++注釋快捷鍵_Jupyter Notebook amp; Lab快捷鍵大全

Jupyter有兩種模式&#xff0c;命令模式和編輯模式&#xff0c;分別有不同的快捷鍵。編輯模式(按鍵 Enter 切換)&#xff1a;可以往單元中鍵入代碼或文本&#xff0c;此時單元格被藍色的框線包圍&#xff0c;且命令模式下的快捷鍵不生效&#xff1b; 命令模式 (按鍵 Esc 開啟)&…

多核cpu應用場景_CPU占用100%!PC卡頓原來可以這么解決:多場景多任務也流暢

現代生活里&#xff0c;不論是工作還是生活&#xff0c;多開軟件和處理事務可以說都是家常便飯的事情。一邊玩著醉心已久的游戲&#xff0c;一邊解壓著新的電影和游戲&#xff1b;為了查詢資料&#xff0c;一不小心打開了數十個網頁&#xff1b;復雜繁重的工作鑄就了動輒上百兆…

swot分析法案例_項目型銷售案例剖析的五大步驟

我們的案例分析方式是根據哈佛大學與中歐國際工商學院的案例分析方法來總結出我們的模式的。這種分析方法包括兩種互相關聯和依賴的方面。第一方面&#xff0c;就是要對所指定的將供集體討論的案例&#xff0c;做出深刻而有意義的分析&#xff0c;包括找出案例所描述的情景中存…