Material Design 相容性控制元件學習

GitLqr發表於2017-04-22

簡述

Material Design從Android 5.0開始引入,是一種全新的設計語言,稱為“原材料設計”,是谷歌提倡的一種設計風格、理念、原則。結合擬物設計和扁平化設計風格,融入了一些科技理念。

想深入瞭解的話,可以查這篇wiki:Material Design 中文版

*注:使用下文中介紹的控制元件,需在專案中引入v7包的支援。正如上面所說,Material Design從Android 5.0開始引入,故低版本的系統沒有這類控制元件。

如:使用Android Studio可以在gradle的dependencies中寫入:

compile 'com.android.support:appcompat-v7:25.3.0'複製程式碼

Eclipse的請自行百度吧,畢竟就算匯入了v7包,若編譯版本和v7包的版本存在新舊問題時,v7包工程自身會報錯的,還有其他一些細節要注意,這裡就不做介紹了。

一、SwipeRefreshLayout

1、使用

SwipeRefreshLayout是谷歌推出的一個下拉重新整理控制元件,符合MD設計,使用方便,可通過其提供的方法設定控制元件的尺寸、顏色、重新整理距頂懸浮距離等,具體使用如下:

//設定 SwipeRefreshLayout 的尺寸
mSrl.setSize(SwipeRefreshLayout.LARGE);
//設定 SwipeRefreshLayout 重新整理時的顏色切換(可以有無數種)
mSrl.setColorSchemeColors(Color.RED, Color.YELLOW, Color.GREEN);
//設定 SwipeRefreshLayout 的背景色
mSrl.setBackgroundColor(Color.GRAY);
//設定 SwipeRefreshLayout 的下拉距離
mSrl.setDistanceToTriggerSync(100);
//設定 SwipeRefreshLayout 正在重新整理監聽
mSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        ...
        重新整理資料來源
        ...
    }
});
//手動停止重新整理
mSrl.setRefreshing(false);複製程式碼

2、效果預覽:

Material Design 相容性控制元件學習
SwipeRefreshLayout

二、ListPopupWindow

popupWindow大家都知道,是Android中彈出式選單,而ListPopupWindow顧名思義就是列表型的彈出式選單,使用該控制元件可以做到類似下拉選單的功能,但不限如此。

1、使用

mListPopupWindow = new ListPopupWindow(this);
//設定 ListPopupWindow 的資料介面卡
mListPopupWindow.setAdapter(mAdapter);
//設定 ListPopupWindow 的顯示位置(在指定控制元件下方)
mListPopupWindow.setAnchorView(view);
//設定 ListPopupWindow 的寬度
mListPopupWindow.setWidth(200);
//設定 ListPopupWindow 的高度
mListPopupWindow.setHeight(500);
//設定 ListPopupWindow 的條目點選事件(必須在show方法前設定,否則無效)
mListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(getApplicationContext(), mItemArr[position], Toast.LENGTH_SHORT).show();
        mListPopupWindow.dismiss();
    }
});
mListPopupWindow.show();複製程式碼

2、效果預覽:

Material Design 相容性控制元件學習
ListPopupWindow

三、PopupMenu

PopupMenu代表彈出式選單,它會在指定元件上彈出PopupMenu,預設情況下,PopupMenu會顯示在該元件的下方或上方。與ListPopupWindow的區別在於,ListPopupWindow使用介面卡來填充條目,而PopupMenu則是使用menu佈局來填充條目。

1、使用

PopupMenu popupMenu = new PopupMenu(this, view);
//設定 PopupMenu 的顯示選單項
popupMenu.inflate(R.menu.main);
// popupMenu.getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());//與一行沒什麼區別

//預設 PopupMenu 不顯示條目icon,可以通過反射來強制使其顯示icon
Field field = popupMenu.getClass().getDeclaredField("mPopup");
field.setAccessible(true);
MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popupMenu);
mHelper.setForceShowIcon(true);

//設定 PopupMenu 的條目點選事件(點選後會自動dismiss)
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
        return false;
    }
});
//顯示 PopupMenu
popupMenu.show();複製程式碼

2、效果預覽:

Material Design 相容性控制元件學習
PopupMenu

四、LinearLayoutCompat

LinearLayoutCompat是對LinearLayout的擴充套件,可以為此佈局中的子View之間新增分割線divider。可以通過自定義屬性divider來指定分割線的樣式,通過自定義屬性showDividers來指定分割線的顯示位置。

1、使用

<android.support.v7.widget.LinearLayoutCompat
    android:id="@+id/llc"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="vertical"
    app:divider="@drawable/line"
    app:showDividers="beginning">
        ...
        子控制元件
        ...
</android.support.v7.widget.LinearLayoutCompat>複製程式碼

2、效果預覽:

Material Design 相容性控制元件學習
LinearLayoutCompat

五、RecyclerView

RecyclerView是v7包中最重要、最常用的控制元件之一,可實現線性列表、網格列表、瀑布流列表效果,卻具有高度解耦、效能優化的優勢,可以說是ListView、GridView的增強版。

1、使用

RecyclerViewr的使用大體分兩步:

  • 設定介面卡Adapter
  • 設定佈局管理器LayoutManager

1)設定介面卡Adapter

RecyclerView使用的介面卡必須繼承RecyclerView.Adapter,並指定RecyclerView.ViewHolder,在onCreateViewHolder()中建立自定義的RecyclerView.ViewHolder,在onBindViewHolder()中對條目進行設定,理解上相對簡單,程式碼如下:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<String> mData;

    public MyAdapter(List<String> data) {
        mData = data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = View.inflate(parent.getContext(), android.R.layout.simple_list_item_1, null);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.mTv.setText(mData.get(position));
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView mTv;

        public MyViewHolder(View itemView) {
            super(itemView);
            mTv = (TextView) itemView.findViewById(android.R.id.text1);
        }
    }

}複製程式碼

2)設定佈局管理器LayoutManager

RecyclerView可以使用佈局管理器有三種:

  • LinearLayoutManager:線性列表
  • GridLayoutManager:網格列表
  • StaggeredGridLayoutManager:瀑布流列表

以LinearLayoutManager為例:

LinearLayoutManager(Context context, int orientation, boolean reverseLayout)複製程式碼

在建立LinearLayoutManage時,可以通過引數二指定列表的方向,通過引數三指定資料是否反轉(本來資料是從上到下進行填充,當設定了reverseLayout為true時,資料則從下到上進行填充),GridLayoutManager及StaggeredGridLayoutManager的使用也差不多。

呼叫RecyclerView的setLayoutManager()即可設定佈局管理器

mRv.setLayoutManager(new LinearLayoutManager(this));複製程式碼

2、效果預覽:

Material Design 相容性控制元件學習
RecyclerView

最後附上Demo連結

github.com/GitLqr/Mate…

相關文章