歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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



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

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