好多應用在搜索界面都有關鍵字飛入飛出的效果。我自己也實現了下。先上效果圖:
實現該效果需要解決以下五點:
1.布局的選用。
2.確定動畫區域,即布局的寬高。
3.對關鍵字坐標的隨機分配。
4.對隨機分配的坐標進行向中心靠攏。
5.動畫的實現。
下面各個擊破:
1.布局的選用。
在五種常用布局中,可實現此效果的有AbsoluteLayout、FrameLayout、RelativeLayout三種。一開始我選用的AbsoluteLayout,運行結果出來後,發現AbsoluteLayout下的TextView一旦超出其顯示范圍,超出的范圍將無法顯示,而余下的兩種布局,其超出的范圍會自動換行顯示出來(TextView長度超出父組件顯示范圍可在代碼中避免,此處僅是舉例,說明AbsoluteLayout的先天不足)。另,官方已不再推薦使用AbsoluteLayout,所以本處憑個人喜好我選用FrameLayout。
FrameLayout如何實現AbsoluteLayout對其子組件進行定點放置呢?答案在FrameLayout.LayoutParams上。該類有相關屬性為leftMargin及topMargin。要將子組件左上角定點放置在其父組件中的(x,y)處,僅需對leftMargin賦值為x,對topMargin賦值為y即可。
2.確定動畫區域,即布局的寬高。
在對顯示關鍵字TextView進行分配坐標之前,應該要先知道父組件的寬高各有多少可供隨機分配。
獲取寬高使用到OnGlobalLayoutListener。本例中KeywordsFlow繼承自FrameLayout,同時也實現了OnGlobalLayoutListener接口,在其初始化方法init()中設置了監聽getViewTreeObserver().addOnGlobalLayoutListener(this);
當監聽事件被觸發時,即可獲取而已的寬高。