InstaMaterial 概念設計(2):評論介面的過度動畫

發表於2015-06-10

今天我們將要實現的是feed和評論界切換以及相關的動畫效果。(視訊中9-13秒那部分)。我將忽略涉及到的button效果(波紋、傳送完成的動畫等,在下篇文章專門討論),將重點放在comment Acitvity進入的效果上面。

初始化

我們首先將一些不太重要的東西加入前面文章所建立的專案中previously created project

.Picasso 一個圖片非同步載入庫(用於評論列表中顯示作者的頭像),

.AndroidManifest.xml中新增評論的activity

當然我們還要建立新activity的佈局檔案。除了底部的評論輸入框之外基本上和上篇文章是一致的。我們再次用到了Toolbar,RecyclerView等。沒有什麼好值得講的。

activity_comments.xml 

下一步,建立評論列表item的佈局:

item_comment.xml

評論作者圓角頭像部分的程式碼片段:

bg_comment_avatar.xml

最後一件事情是處理feed卡片底部評論按鈕的的onClick事件,這個事件將開啟顯示當前照片評論的CommentsActivity。我們暫時將卡片的整個底部區域作為點選按鈕,但是以後將會替換為真正的評論按鈕。我們在RecyclerView adapter中新增onClick的listener,將為每個卡片的底部設定這個listener。

FeedAdapter 類(只包含改動部分):

MainActivity 類(只包含改動部分):

為了防止遺漏,我們將這一部分的程式碼提交在了這裡:onClick on item in RecyclerView adapter

進入動畫

首先我們將建立進入的過度動畫,根據概念視訊上的顯示,以下是我們需要實現的效果:

1.靜態的Toolbar-新的activity開啟的時候Actionbar不能有過渡與切換效果(我們想讓使用者以為他們仍然在同一個視窗中)

2.評論列表介面要根據使用者點選的位置展開(不管列表滾動到何處)

3.在展開效果結束之後,評論列表中的每一項要依次展示

靜態的Toolbar

這是本文最簡單的部分。因為在MainActivity與CommentsActivity中Toolbar是非常相似的,所以我們只需要將Acitvity預設的切換效果遮蔽了就可以了,那樣新的視窗不會有任何移動僅僅是繪製在上個視窗的上面。這樣就實現了Toolbar的靜態顯示。下面是程式碼:

通過呼叫overridePendingTransition(0, 0);我們遮蔽了MainActivity的退出效果,以及CommentsActivity的進入效果。

從被點選的地方展開CommentsActivity

現在我們建立可以從任何點選的地方開始的擴充套件動畫。這個動畫分為:

.展開背景

.顯示內容

在我們開始動畫部分的程式碼之前,先將CommentsActivity設定成半透明。不然的話擴充套件動畫將顯示這預設的視窗背景之上,而不是MainAcitvity的view之上。這是因為每個activity的視窗背景都是定義在它所採用的主題中了的。如果我們想讓activity變半透明,我們需要修改樣式:

下面是改變背景與不改變背景的區別

 

現在我們可以開始製造展開的效果了。首先,我們需要得到動畫的Y軸初始值。我們的例子中其實完全不需要知道點選的精確位置(動畫很快,使用者不會注意到幾個畫素的差異的),我使用被點選view的Y值來替代,並且將這個Y值傳遞給CommentsActivity:

下一步,在CommentsActivity中實現background的展開動畫。為了簡便起見,我們使用Scale動畫(因為在此刻還沒有任何內容,因此沒人知道到底是縮放開來的還是展開的),別忘了使用setPivotY() 方法設定正確的初始位置。

多虧了onPreDrawListener  ,我們才可以在view樹完成測量並且分配空間而繪製過程還沒有開始的時候播放動畫。

上面的程式碼中我們已經實現了展開背景與顯示內容的動畫,下面是執行的效果:

是不是感覺還是少了點什麼東西?

還需要準備評論列表中每個評論項的動畫。很簡單,但是需要注意幾件重要的事情:

1.每個item的動畫需要有一定延時。否則所有的動畫將在瞬間結束使用者只能感受到一個動畫。

2.adapter需要有鎖定動畫的功能,因為在使用者滾動列表的時候動畫是不需要的。

3.同樣的我們還要讓每個單獨的item能鎖定與解鎖動畫(比如新增一個評論)

目前CommentsAdapter 的程式碼如下:

展示頭像我們使用帶CircleTransformationPicasso庫,我們利用了RecyclerView 的notifyItemInserted方法實現了新增一個item的動畫效果,其餘的程式碼都很簡單。

下面是在CommentsActivity 中使用的程式碼:

Item的動畫在使用者滾動RecyclerView的時候被鎖定,這就是進入動畫的所有東西了。

退出動畫

最後一件事是實現退出動畫,沒有非常特別的技巧,我們只需建立一個transition 動畫來滑出activity就可以了,記住Toolbar必須是靜止的,因此我們再次使用overridePendingTransition(0, 0);並且播放內容部分的動畫。

以上就是我們實現概念app的第二階段的所有內容。下一篇我們將討論這章遺漏的內容(按鈕的動畫效果)

原始碼

討論中例子的原始碼在這裡: repository.

相關文章