1. 程式人生 > >Android實現列表抽屜展示效果

Android實現列表抽屜展示效果

終於迎來的週末哇,深圳兩天的涼雨天終於迎來晴日。早上爬起來異常的累,哎。。每天地鐵兩小時真是強身健體啊~

今天給大家帶來一篇關於Android UI的文章:列表Item抽屜展示效果。單說沒意思,不然大家又該說我是標題黨了。我來筆墨描述下場景:

例如當我們點選某個Item項時,該Item項會有一個或多個的選擇項展開來讓我們選擇。其實這種需求場景很常見,尤其是在App的設定介面。

ok,先給大家帶來幾幅圖:

      

德瑪西亞~上面三幅圖是我從英雄聯盟助手App中擷取,從截圖可以看到,當我們點選遊戲資料Item的時候,下面會展開顯示關於遊戲資料的選擇。不過也有另外的展示效果就是點選Item項會彈出視窗展示更多的選擇:

  

兩種方式都以非常巧妙的設計來展示更多的內容。關於第二種方式相信大家都知道Android中為我們提供了很多視窗展示方式,例如:Dialog、AlertDialog、PopupWindow、DialogFragment等等。

那麼第一種方式該如何實現呢?哈哈,可能很多朋友會說ExpandedListView!對,沒錯,用ExpandedListView確實可以實現多級選單的展示效果,但是如果一個介面有多個這樣的效果,那麼我們就需要寫多個ExpandListView + Adapter,太麻煩。並且某天產品說,這種展示太死板,我想讓它伴隨動畫展示,例如漸漸下拉展開。哦買噶~如果使用ExpandedListView時沒辦法新增展開動畫的,沒辦法,為了和產品搞好地下戀情,我們也只能咬咬牙去想辦法,該如何實現呢?ok,今天就和大家分享一種實現方式,好了,廢話少說,準備開車~

主要內容我會分為以下幾個部分來展開:

(1)實現原理分析

(2)選擇實現方式

(3)封裝

首先先來看下實現的效果圖:

哈哈,是不是很炫酷。當我們點選主Item項時會伴隨動畫以展開顯示。相信大家看到這種效果第一反應就是Android屬性動畫哇!嗯,我們來分析分析使用Android屬性動畫實現的方式:

(1)主Item一個佈局,子Item項一個佈局。

(2)給主Item註冊單擊事件

(3)建立一個動畫工具類,並建立一個位移的動畫效果。

(4)在Activity中獲取子Item的高度

(5)初始化時隱藏。

(6)點選主Item項時,開啟動畫,逐漸展開到子Item項總高度。

上面就是使用Android動畫來實現的方式,相信大家看了都明白,哈哈,原來這麼簡單那~

確實,從上面的步驟來看這種效果確實很容易實現。但是如果多個介面都有類似效果,並且一個介面也不只一個Item可以展示,可能有很多。那我們一個一個實現的話,程式碼不僅多而且變的非常冗餘。ok,那麼我們就需要解決這個問題,沒錯,對它進行封裝。

先來看看我的封裝思路:

(1)既然是一個主Item項和一個或多個子Item項,那我可以分為兩個佈局來展示:MenuItem和SubMenuItem。

(2)然後我需要將兩個佈局聯絡到一起,那麼就需要一個容器來存放,沒錯,自定義佈局實現。

(3)為了複用,需要公開一些基本設定,那麼就需要自定義屬性。

(4)建立動畫,實現展示效果。

來看看核心程式碼:

(1)建立主Item佈局和子Item佈局,並關聯。

    /**
     * 初始化Menu和Item容器
     * @param context
     */
    private void addDefaultLayout(Context context) {
        View defaultView = LayoutInflater.from(context).inflate(layoutId, this,true);
        defaultView.setOnClickListener(this);
        content = new LinearLayout(context);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        content.setShowDividers(SHOW_DIVIDER_BEGINNING|SHOW_DIVIDER_MIDDLE);
        content.setDividerDrawable(ContextCompat.getDrawable(context,R.drawable.item_divider));
        content.setOrientation(VERTICAL);
        addView(content,layoutParams);
    }

(2) 新增子Item選擇項

/**
* 新增Item
* @param views
*/
public void addItemView(List<View>views) {
     this.itemList= views;
     for (int i=0; i < views.size(); i++) {
            final int position = i;
            content.addView(views.get(i));
            views.get(i).setOnClickListener(newOnClickListener() {
                          @Override
                          public void onClick(Viewv) {
                                     if(null!= mOnItemClickListener) {
                                                       mOnItemClickListener.onItemClick(v,position);
                                     }
                          }
          });
}}

使用方式很簡單:

(1)佈局檔案中:

<com.example.song.foldlayout.FoldLayout
    android:id="@+id/foldlayout1"
    android:layout_width="match_parent"
   android:layout_height="wrap_content"
   app:layoutId="@layout/layout_menu_data"//選單佈局,自定義
/>

(2)Activity:

       // 1.新增兩個子Item項

       for (int i = 0;i<2;i++) {
            views1.add(getLayoutInflater().inflate(R.layout.layout_item,null));
        }

        foldlayout.addItemView(views1);

       //  2.設定Item的單擊事件
        foldlayout.setOnItemClickListener(new FoldLayout.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(MainActivity.this, "點選了第"+position+"個", Toast.LENGTH_SHORT).show();
            }
        });

短短几行程式碼,就輕鬆實現了。哈哈,是不是很nice。

ok,今天的內容就到這裡了,核心的思路還是Android的動畫使用以及如何巧妙的實現這種方式。具體的程式碼我放到了github,大家可以下載檢視,如果覺得可以,還望賞顆星星鼓勵一下哈。今天的內容就是這些了,thks~

Demo