歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發教程:搜索關鍵字飛入飛出效果

Android開發教程:搜索關鍵字飛入飛出效果

日期:2017/3/1 10:40:56   编辑:Linux編程

好多應用在搜索界面都有關鍵字飛入飛出的效果。我自己也實現了下。先上效果圖:



實現該效果需要解決以下五點:

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);
當監聽事件被觸發時,即可獲取而已的寬高。

  1. public void onGlobalLayout() {
  2. int tmpW = getWidth();
  3. int tmpH = getHeight();
  4. if (width != tmpW || height != tmpH) {
  5. width = tmpW;
  6. height = tmpH;
  7. show();
  8. }
  9. }
3.對關鍵字坐標的隨機分配。
TextView坐標的隨機是否到位分配決定著整體效果的好壞。
本例設定關鍵字最多為10個,在布局的X Y軸上各自進行10等分。每個關鍵字依照其添加順序隨機各自在X軸和Y軸上選擇等分後的10點中的某個點為margin的值。此值為糙值,需要對X軸進行越界修正,對Y軸進行向中心靠攏修正。對X軸坐標的修正為如下:
  1. // 獲取文本長度
  2. Paint paint = txt.getPaint();
  3. int strWidth = (int) Math.ceil(paint.measureText(keyword));
  4. xy[IDX_TXT_LENGTH] = strWidth;
  5. // 第一次修正:修正x坐標
  6. if (xy[IDX_X] + strWidth > width - (xItem >> 1)) {
  7. int baseX = width - strWidth;
  8. // 減少文本右邊緣一樣的概率
  9. xy[IDX_X] = baseX - xItem + random.nextInt(xItem >> 1);
  10. } else if (xy[IDX_X] == 0) {
  11. // 減少文本左邊緣一樣的概率
  12. xy[IDX_X] = Math.max(random.nextInt(xItem), xItem / 3);
  13. }
Copyright © Linux教程網 All Rights Reserved