Material Design學習之 Bottom Sheets (順便提提CoordinatorLayout)
來自: http://android.jobbole.com/82560/
昨天連續上了2篇介紹第三方庫的文章,正直好久沒提交自己寫東西了,那么就補一篇之前MD系列漏的部分 Bottom Sheets
Bottom Sheets–底部動作條
底部動作條(Bottom Sheets)是一個從屏幕底部邊緣向上滑出的一個面板,使用這種方式向用戶呈現一組功能。底部動作條呈現了簡單、清晰、無需額外解釋的一組操作。
在一個標準的列表樣式的底部動作條(Bottom Sheets)中,每一個操作應該有一句描述和一個左對齊的 icon。如果需要的話,也可以使用分隔符對這些操作進行邏輯分組,也可以為分組添加標題或者副標題。
像這樣:

請記得遵循MD嚴謹的設計規則,統一編劇,字體等尺寸規范,像這樣
上面那種是類似于ListView的呈現,要變成類似于GridView的樣子也行,像這樣
原文地址: http://www.google.com/design/spec/components/bottom-sheets.html
CoordinatorLayout(不知道怎么稱呼,淚目。。)
CoordinatorLayout實現了多種Material Design中提到的滾動效果(傳送門: http://www.google.com/design/spec/patterns/scrolling-techniques.html )
打不開的話我就簡單描述下,就是手勢上下滑動的一些操作,像這樣
只要使用CoordinatorLayout作為基本布局,將自動產生向上移動的動畫。
也就是這樣
Java
android.support.design.widget.CoordinatorLayout xmlns:android="RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> Button android:id="@+id/byRecycleView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:background="#c2cc" android:text="RecycleView方式" android:textColor="@android:color/white" /> RelativeLayout> ImageView android:src="@drawable/flash" android:id="@+id/fillView" android:layout_width="match_parent" android:layout_height="match_parent">ImageView> android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#fff" app:behavior_hideable="false" app:behavior_peekHeight="10dp" app:layout_behavior="@string/bottom_sheet_behavior" />
android.support.design.widget.CoordinatorLayout></pre>
android.support.design.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="sample.wjj.materialdesignbottomsheets.MainActivity"> RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> Button android:id="@+id/byRecycleView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:background="#c2cc" android:text="RecycleView方式" android:textColor="@android:color/white" /> RelativeLayout> ImageView android:src="@drawable/flash" android:id="@+id/fillView" android:layout_width="match_parent" android:layout_height="match_parent">ImageView> android.support.v7.widget.RecyclerViewxmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#fff" app:behavior_hideable="false" app:behavior_peekHeight="10dp" app:layout_behavior="@string/bottom_sheet_behavior" /> android.support.design.widget.CoordinatorLayout></div>更多介紹可以看: http://blog.csdn.net/xyz_lmn/article/details/48055919
接下來我們來看今天的例子
先上下效果圖
![]()
![]()
這里把最上方的2種樣式分別實現了一下(無視具體item 還是請跟著規范走)
這樣的實現以前用PopupWindow我也寫過一篇,效果大致差不多不過,Popup那一系列方法都得自己重寫,還是比較麻煩的,這里也補下傳送門: http://blog.csdn.net/ddwhan0123/article/details/50379340
OK,那我們來看下如何實現的
包結構
![]()
如果你不需要RecycleView的分割線的話就Copy走MainActivity內的內容即可DividerItemDecoration這個類是 翔哥 之前寫的分割線
直接貼代碼,然后在 // 里做解釋
Java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static List mDatas;
public Button byRecycleView;
public BottomSheetBehavior behavior;
public RecyclerView recyclerView;
public View fillView;
public WjjAdapter wjjAdapter;@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化,業務邏輯 init(); } //綠色的按鈕,觸發隱藏和顯示RecycleView //Bottom Sheet 一共有五個狀態回調: //STATE_COLLAPSED //折疊狀態。可通過app:behavior_peekHeight來設置默認顯示的高度。 //STATE_SETTING //拖拽松開之后到達終點位置(collapsed or expanded)前的狀態。 //STATE_EXPANDED //完全展開的狀態。 //STATE_HIDDEN //隱藏狀態。默認是false,可通過app:behavior_hideable屬性設置。 //STATE_DRAGGING //被拖拽狀態 @Override public void onClick(View v) { switch (v.getId()) { case R.id.byRecycleView: //展開控件 behavior.setState(BottomSheetBehavior.STATE_EXPANDED); break; } } private void init() { initData(); byRecycleView = (Button) findViewById(R.id.byRecycleView); byRecycleView.setOnClickListener(this); recyclerView = (RecyclerView) findViewById(R.id.recyclerview); //添加分割線
// recyclerView.addItemDecoration(new DividerItemDecoration(this,
// DividerItemDecoration.VERTICAL_LIST));//設置ListView模式 recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
//設置GridView模式
//recyclerView.setLayoutManager(new GridLayoutManager(this, 3));//初始化適配器 wjjAdapter = new WjjAdapter(this); //設置監聽事件 wjjAdapter.setItemClickListener(new WjjAdapter.ItemClickListener() { @Override public void onItemClick(int pos) {
//當被點擊后隱藏控件 behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
//土司被點擊的Item的位置
Toast.makeText(MainActivity.this, "--->" + pos, Toast.LENGTH_LONG).show();
}
});
//設置適配器
recyclerView.setAdapter(wjjAdapter);
//設置動畫
recyclerView.setItemAnimator(new DefaultItemAnimator()); //這句很重要,綁定滑動操作內容給 recyclerView
behavior = BottomSheetBehavior.from(recyclerView);
//設置滑動回調
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { //狀態變化時觸發
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_COLLAPSED || newState == BottomSheetBehavior //blackView.setBackgroundColor(Color.TRANSPARENT);
fillView.setVisibility(View.GONE);
}
}@Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { // 手勢滑動時 fillView.setVisibility(View.VISIBLE); ViewCompat.setAlpha(fillView, slideOffset); } }); //顯示RecycleView時才呈現的“樹懶--閃電” fillView = findViewById(R.id.fillView); fillView.setBackgroundColor(getResources().getColor(R.color.white)); fillView.setVisibility(View.GONE); fillView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //點擊閃電時也隱藏掉ReclcyeView behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } }); } //填充數據 public void initData() { mDatas = new ArrayList(); for (int k = 0; k 6; k++) { mDatas.add("第" + k + "個"); } } //下面就是 Adapter的內容了,就不做解釋了 public static class WjjAdapter extends RecyclerView.Adapter { public ItemClickListener mItemClickListener; public void setItemClickListener(ItemClickListener listener) { mItemClickListener = listener; } public interface ItemClickListener { void onItemClick(int pos); } private Context mContext; public static class ViewHolder extends RecyclerView.ViewHolder { public final TextView mTextView; public ViewHolder(View view) { super(view); mTextView = (TextView) view.findViewById(R.id.tv); } } public WjjAdapter(Context context) { super(); mContext = context; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewHolder holder = new ViewHolder(LayoutInflater.from( parent.getContext()).inflate(R.layout.list_item, parent, false)); return holder; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { holder.mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mItemClickListener.onItemClick(position); } }); holder.mTextView.setText(mDatas.get(position)); } @Override public int getItemCount() { return mDatas.size(); } }
}</pre>
public class MainActivityextends AppCompatActivityimplements View.OnClickListener { public static ListmDatas; public ButtonbyRecycleView; public BottomSheetBehaviorbehavior; public RecyclerViewrecyclerView; public ViewfillView; public WjjAdapterwjjAdapter; @Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化,業務邏輯 init(); } //綠色的按鈕,觸發隱藏和顯示RecycleView //Bottom Sheet 一共有五個狀態回調: //STATE_COLLAPSED //折疊狀態。可通過app:behavior_peekHeight來設置默認顯示的高度。 //STATE_SETTING //拖拽松開之后到達終點位置(collapsed or expanded)前的狀態。 //STATE_EXPANDED //完全展開的狀態。 //STATE_HIDDEN //隱藏狀態。默認是false,可通過app:behavior_hideable屬性設置。 //STATE_DRAGGING //被拖拽狀態 @Override public void onClick(View v) { switch (v.getId()) { case R.id.byRecycleView: //展開控件 behavior.setState(BottomSheetBehavior.STATE_EXPANDED); break; } } private void init() { initData(); byRecycleView = (Button) findViewById(R.id.byRecycleView); byRecycleView.setOnClickListener(this); recyclerView = (RecyclerView) findViewById(R.id.recyclerview); //添加分割線 // recyclerView.addItemDecoration(new DividerItemDecoration(this, // DividerItemDecoration.VERTICAL_LIST)); //設置ListView模式 recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); //設置GridView模式 //recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); //初始化適配器 wjjAdapter = new WjjAdapter(this); //設置監聽事件 wjjAdapter.setItemClickListener(new WjjAdapter.ItemClickListener() { @Override public void onItemClick(int pos) { //當被點擊后隱藏控件 behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); //土司被點擊的Item的位置 Toast.makeText(MainActivity.this, "--->" + pos, Toast.LENGTH_LONG).show(); } }); //設置適配器 recyclerView.setAdapter(wjjAdapter); //設置動畫 recyclerView.setItemAnimator(new DefaultItemAnimator()); //這句很重要,綁定滑動操作內容給 recyclerView behavior = BottomSheetBehavior.from(recyclerView); //設置滑動回調 behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { //狀態變化時觸發 @Override public void onStateChanged(@NonNull ViewbottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_COLLAPSED || newState == BottomSheetBehavior //blackView.setBackgroundColor(Color.TRANSPARENT); fillView.setVisibility(View.GONE); } } @Override public void onSlide(@NonNull ViewbottomSheet, float slideOffset) { // 手勢滑動時 fillView.setVisibility(View.VISIBLE); ViewCompat.setAlpha(fillView, slideOffset); } }); //顯示RecycleView時才呈現的“樹懶--閃電” fillView = findViewById(R.id.fillView); fillView.setBackgroundColor(getResources().getColor(R.color.white)); fillView.setVisibility(View.GONE); fillView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //點擊閃電時也隱藏掉ReclcyeView behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } }); } //填充數據 public void initData() { mDatas = new ArrayList(); for (int k = 0; k 6; k++) { mDatas.add("第" + k + "個"); } } //下面就是 Adapter的內容了,就不做解釋了 public static class WjjAdapter extends RecyclerView.Adapter { public ItemClickListenermItemClickListener; public void setItemClickListener(ItemClickListenerlistener) { mItemClickListener = listener; } public interface ItemClickListener { void onItemClick(int pos); } private ContextmContext; public static class ViewHolderextends RecyclerView.ViewHolder { public final TextViewmTextView; public ViewHolder(Viewview) { super(view); mTextView = (TextView) view.findViewById(R.id.tv); } } public WjjAdapter(Contextcontext) { super(); mContext = context; } @Override public ViewHolderonCreateViewHolder(ViewGroupparent, int viewType) { ViewHolderholder = new ViewHolder(LayoutInflater.from( parent.getContext()).inflate(R.layout.list_item, parent, false)); return holder; } @Override public void onBindViewHolder(final ViewHolderholder, final int position) { holder.mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mItemClickListener.onItemClick(position); } }); holder.mTextView.setText(mDatas.get(position)); } @Override public int getItemCount() { return mDatas.size(); } } }</div>整體使用起來不復雜,而且拓展性好。只是對版本有一定的要求,至少21+的才可以作為.from()的寄存對象
源碼地址: https://github.com/ddwhan0123/BlogSample/blob/master/MaterialDesignBottomSheets.zip
</div>本文由用戶 Houston1756 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!