偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何在Android中實(shí)現(xiàn)折紙動(dòng)畫

移動(dòng)開發(fā) Android
受到iOS版Facebook Paper的啟發(fā),在最近的項(xiàng)目中,我們決定在打開列表元素時(shí)實(shí)現(xiàn)一個(gè)類似風(fēng)格的動(dòng)畫效果。

creating-paper-folding-animation-in-android

受到iOS版的啟發(fā),在最近的項(xiàng)目中,我們決定在打開列表元素時(shí)實(shí)現(xiàn)一個(gè)類似風(fēng)格的動(dòng)畫效果。起初,我們?cè)噲D使用一個(gè)現(xiàn)有的實(shí)現(xiàn)——android-flip, 通過OpenGL渲染動(dòng)畫——在***的Android版本中,它只做到了在屏幕上顯示比較明顯的工件(圖片閃爍)。另外,需要對(duì)這個(gè)類庫(kù)進(jìn)行改動(dòng),因?yàn)樗?是為了滑動(dòng)列表的元素設(shè)計(jì)的,但我們的工程需要在打開列表元素的時(shí)候有動(dòng)畫效果。在下面的演示視頻中可以看出區(qū)別:android-flip實(shí)現(xiàn)的是折疊 列表,而我們實(shí)際需要的是展開詳情。

考慮到這種場(chǎng)景,我們決定自己實(shí)現(xiàn)這種效果。因?yàn)閼?yīng)用程序支持的最小Android版本為4.0,所以沒使用OpenGL,而是用了標(biāo)準(zhǔn)Android SDK中的方法:View.setRotationX(),View.setScaleX()等。當(dāng)硬件加速啟用時(shí)(如果目標(biāo)API級(jí)別>=14,默認(rèn)啟用硬件加速),這些方法可以非常高效地利用GPU。

結(jié)果看起來(lái)很***,所以決定分享我們的做法。由于本文只是介紹了基本的實(shí)現(xiàn)要點(diǎn),您可以從GitHub上下載所有的實(shí)際代碼:FoldableLayout。

布局的實(shí)現(xiàn)

設(shè)計(jì)的***個(gè)元素是可以對(duì)折的布局。我們的做法相當(dāng)大膽:主布局(FoldableItemLayout)只包含一個(gè)特定的布局(在baselayout)。在動(dòng)畫中,BaseLayout將它的內(nèi)容寫入到緩存中,這是一個(gè)根據(jù)原始布局的尺寸專門創(chuàng)建的Bitmap對(duì)象。

  1. class FoldableItemLayout extends FrameLayout { 
  2.     @Override 
  3.     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
  4.         Bitmap cacheBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
  5.         mBaseLayout.setCacheCanvas(new Canvas(cacheBitmap)); 
  6.     } 
  7.   
  8. class BaseLayout extends FrameLayout { 
  9.     private Canvas mCacheCanvas; 
  10.   
  11.     private void setCacheCanvas(Canvas cacheCanvas) { 
  12.         mCacheCanvas = cacheCanvas; 
  13.     } 
  14.   
  15.     @Override 
  16.     public void draw(Canvas canvas) { 
  17.         mCacheCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 
  18.         super.draw(mCacheCanvas); 
  19.     } 

此外,還需要兩個(gè)額外的視圖(PartView)——用于圖像的上、下兩半部分。它們將在緩存中顯示對(duì)應(yīng)的數(shù)據(jù),這些數(shù)據(jù)代表了該圖像(Bitmap)的上半部和下半部。兩個(gè)視圖填充了主布局的整個(gè)區(qū)域,但只顯示所需的部分。為了達(dá)到這種效果,我們計(jì)算了位圖的界限——在onDraw()方法中,我們讓畫布通過[drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)](http://developer.android.com/reference/android/graphics/Canvas.html#drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint))方法來(lái)繪制所需的部分。

然后通過setRotationX()方法設(shè)置相應(yīng)的角度,設(shè)法旋轉(zhuǎn)這些額外的視圖,從而實(shí)現(xiàn)圖像上半部和下半部的獨(dú)立旋轉(zhuǎn)。為了實(shí)現(xiàn)這個(gè)功能,我們?yōu)镕oldableItemLayout添加了一個(gè)名為FoldRotation的新參數(shù)。

FoldRotation參數(shù)范圍是(-180,180]:

  • FoldRotation=0:兩個(gè)部分都不旋轉(zhuǎn)。在這種情況下,我們可以跳過位圖緩存,實(shí)時(shí)的顯示原始的布局。
  • 0 <FoldRotation<90:下層的部分旋轉(zhuǎn)到 FoldRotation角度;上層部分不旋轉(zhuǎn)。
  • -90<FoldRotation<0:只有上層部分旋轉(zhuǎn)。
  • 90≤FoldRotation<180:下層部分不再顯示。在這種情況下,包含下一布局的FoldableItemLayout應(yīng)該覆蓋當(dāng)前的FoldableItemLayout。
  • -180<FoldRotation≤-90:上層部分不再顯示。在這種情況下,包含先前的布局FoldableItemLayout應(yīng)該覆蓋當(dāng)前的FoldableItemLayout。
  • FoldRotation=180:兩個(gè)部分都隱藏。

現(xiàn)在有了一個(gè)二層布局,能夠“折疊”它包含的元素,這樣就可以做出一個(gè)FoldableListLayout——一個(gè)類似列表視圖的布局,它創(chuàng)建列表元素,并通過使用BaseAdapter將其封裝成FoldableItemLayout。在這種情況下,我們還使用了FoldRotation參數(shù)用來(lái)確定元素在列表中的位置。

例如,F(xiàn)oldRotation= 30,列表***個(gè)元素(FoldableItemLayout)的FoldRotation值為30,而第二個(gè)元素——FoldRotation= 150,最多可以同時(shí)顯示不超過2個(gè)元素。FoldRotation參數(shù)值的范圍依賴于元素的數(shù)量:如果列表包含一個(gè)元素,那么取值范圍就會(huì)是 [0,0],2——[0,180],3——[0,360]等。

打開動(dòng)畫

在學(xué)會(huì)了在幾個(gè)元素之間使用折疊動(dòng)畫滾動(dòng)之后,我們解決了這個(gè)重大的挑戰(zhàn):從任意的起點(diǎn)生成元素的打開動(dòng)畫。利用已經(jīng)實(shí)現(xiàn)的 FoldableListLayout, 并使其在兩個(gè)元素之間進(jìn)行切換:封面布局和詳情布局。這兩種元素都應(yīng)該顯示在屏幕上,但詳情元素應(yīng)該是隱藏的。當(dāng)用戶點(diǎn)擊一個(gè)封面元素時(shí),應(yīng)用程序會(huì)記住 當(dāng)時(shí)的位置,并使用相同大小的空占位符視圖取代它(以免破壞屏幕上的其他元素),并移動(dòng)蓋元素的下半專門創(chuàng)建的布局。以后這種布局將被用作 FoldableListLayout的***個(gè)元素。第二個(gè)元素將被替換為空占位視圖,與封面元素的方式相同。

對(duì)齊

眼見封面元素已經(jīng)從屏幕上的最初位置展開,因此在動(dòng)畫過程中我們的FoldableListLayout需要在封面元素和詳情元素的位置之間移動(dòng)。這就是為什么要記住在動(dòng)畫初始化過程中每個(gè)元素的初始位置和大小的原因。由于封面和詳情的大小有可能不同,我們需要在動(dòng)畫期間同時(shí)擴(kuò)展它們,以便使它們的寬度一致。

我們基本已經(jīng)完工,只差一件事:縮放后,封面的高度可能看起來(lái)比下半部分的詳情小。這意味著你需要隱藏圖像的剩余部分。

下面的屏幕截圖顯示了在動(dòng)畫的開始部分有一個(gè)灰色區(qū)域,下層的詳情部分與封面的大小不符。

creating-paper-folding-animation-in-android-error (2)

我們?yōu)镕oldableItemLayoutm引入一個(gè)額外的RollingDistance參數(shù)解決了這個(gè)問題。這個(gè)參數(shù)負(fù)責(zé)從折線垂直移動(dòng)圖像。使用這個(gè)參數(shù)可以在動(dòng)畫的***部分中的不知不覺中轉(zhuǎn)換詳情的一部分,然后在第二部分中全尺寸展開。

動(dòng)畫現(xiàn)在就可以運(yùn)行了,余下的工作就是為逼真的效果添加一些暗化,或?yàn)槠交臉幼犹砑有╆幱?。本類?kù)在GitHub上可以隨意使用,在那里你還可以找到一個(gè)使用例子。一如既往的歡迎pull請(qǐng)求。

原文鏈接: azoft

譯文鏈接: http://blog.jobbole.com/68689/

責(zé)任編輯:閆佳明 來(lái)源: blog.jobbole
相關(guān)推薦

2016-08-11 08:24:39

AndroidIntentShareTestDe

2024-11-12 08:00:00

LSM樹GolangMemTable

2025-02-05 10:02:03

Locust測(cè)試異常處理

2025-01-27 12:31:23

PythonLocustWebSocket

2020-04-07 10:43:31

多云云遷移云計(jì)算

2022-09-13 07:14:29

云計(jì)算SaaS多租戶

2013-12-13 09:55:44

VDI負(fù)載均衡

2023-11-30 20:51:26

多子圖布局matplotlib

2025-08-26 08:24:04

2022-03-29 09:00:00

Angular框架REST API

2025-02-04 09:58:08

2015-10-10 10:21:26

OpenStackRegion多Region

2023-01-01 23:42:22

React框架暗黑模式

2023-09-01 08:19:21

Flask

2022-07-15 19:57:18

Cadence輪詢開源

2025-05-09 08:02:30

2021-03-29 08:01:20

JavaScript數(shù)據(jù)結(jié)構(gòu)

2020-05-25 07:00:00

雙因素認(rèn)證身份認(rèn)證密碼

2022-09-15 10:23:17

業(yè)務(wù)開發(fā)自我成長(zhǎng)

2024-07-08 09:22:16

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)