簡述
Material Design從Android 5.0開始引入味悄,是一種全新的設計語言,稱為“原材料設計”塌鸯,是谷歌提倡的一種設計風格侍瑟、理念、原則。結合擬物設計和扁平化設計風格涨颜,融入了一些科技理念费韭。
想深入了解的話,可以查這篇wiki:Material Design 中文版
*注:使用下文中介紹的控件庭瑰,需在項目中引入v7包的支持星持。正如上面所說,Material Design從Android 5.0開始引入弹灭,故低版本的系統(tǒng)沒有這類控件督暂。
如:使用Android Studio可以在gradle的dependencies中寫入:
compile 'com.android.support:appcompat-v7:25.3.0'
Eclipse的請自行百度吧,畢竟就算導入了v7包穷吮,若編譯版本和v7包的版本存在新舊問題時逻翁,v7包工程自身會報錯的,還有其他一些細節(jié)要注意酒来,這里就不做介紹了卢未。
一、SwipeRefreshLayout
1堰汉、使用
SwipeRefreshLayout是谷歌推出的一個下拉刷新控件辽社,符合MD設計,使用方便翘鸭,可通過其提供的方法設置控件的尺寸滴铅、顏色、刷新距頂懸浮距離等就乓,具體使用如下:
//設置 SwipeRefreshLayout 的尺寸
mSrl.setSize(SwipeRefreshLayout.LARGE);
//設置 SwipeRefreshLayout 刷新時的顏色切換(可以有無數(shù)種)
mSrl.setColorSchemeColors(Color.RED, Color.YELLOW, Color.GREEN);
//設置 SwipeRefreshLayout 的背景色
mSrl.setBackgroundColor(Color.GRAY);
//設置 SwipeRefreshLayout 的下拉距離
mSrl.setDistanceToTriggerSync(100);
//設置 SwipeRefreshLayout 正在刷新監(jiān)聽
mSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
...
刷新數(shù)據(jù)源
...
}
});
//手動停止刷新
mSrl.setRefreshing(false);
2汉匙、效果預覽:
二、ListPopupWindow
popupWindow大家都知道生蚁,是Android中彈出式菜單噩翠,而ListPopupWindow顧名思義就是列表型的彈出式菜單,使用該控件可以做到類似下拉菜單的功能邦投,但不限如此伤锚。
1、使用
mListPopupWindow = new ListPopupWindow(this);
//設置 ListPopupWindow 的數(shù)據(jù)適配器
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屯援、效果預覽:
三、PopupMenu
PopupMenu代表彈出式菜單,它會在指定組件上彈出PopupMenu,默認情況下,PopupMenu會顯示在該組件的下方或上方念脯。與ListPopupWindow的區(qū)別在于狞洋,ListPopupWindow使用適配器來填充條目,而PopupMenu則是使用menu布局來填充條目绿店。
1吉懊、使用
PopupMenu popupMenu = new PopupMenu(this, view);
//設置 PopupMenu 的顯示菜單項
popupMenu.inflate(R.menu.main);
// popupMenu.getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());//與一行沒什么區(qū)別
//默認 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、效果預覽:
四借嗽、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、效果預覽:
五羽戒、RecyclerView
RecyclerView是v7包中最重要缤沦、最常用的控件之一,可實現(xiàn)線性列表易稠、網(wǎng)格列表缸废、瀑布流列表效果,卻具有高度解耦驶社、性能優(yōu)化的優(yōu)勢企量,可以說是ListView、GridView的增強版亡电。
1届巩、使用
RecyclerViewr的使用大體分兩步:
- 設置適配器Adapter
- 設置布局管理器LayoutManager
1)設置適配器Adapter
RecyclerView使用的適配器必須繼承RecyclerView.Adapter,并指定RecyclerView.ViewHolder份乒,在onCreateViewHolder()中創(chuàng)建自定義的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:網(wǎng)格列表
- StaggeredGridLayoutManager:瀑布流列表
以LinearLayoutManager為例:
LinearLayoutManager(Context context, int orientation, boolean reverseLayout)
在創(chuàng)建LinearLayoutManage時瘾英,可以通過參數(shù)二指定列表的方向,通過參數(shù)三指定數(shù)據(jù)是否反轉(本來數(shù)據(jù)是從上到下進行填充颂暇,當設置了reverseLayout為true時缺谴,數(shù)據(jù)則從下到上進行填充),GridLayoutManager及StaggeredGridLayoutManager的使用也差不多蟀架。
調(diào)用RecyclerView的setLayoutManager()即可設置布局管理器
mRv.setLayoutManager(new LinearLayoutManager(this));
2瓣赂、效果預覽:
最后附上Demo鏈接
https://github.com/GitLqr/MaterialDesignDemo