原文:https://github.com/android-cjj/BottomSheets
作者:CJJ
上周Android Support Library 23.2发布,给大家简单介绍了一下,今天给各位重点介绍下其中一个非常棒的feature:BottomSheets,文末还附带其源码分析。
作者CJJ同学在Android开源领域相当活跃,文章产量也是非常高,之前我向其约稿,因种种原因没能如愿,连续熬夜写了几篇给我投稿,只为一个他口中的承诺,其实于我来说也许只是随口一说而已,没想到他如此认真。这个经常自称爱开玩笑、看似有些玩世不恭的中二少年,也让我多了几分钦佩。
Android Support Library 23.2里的 Design Support Library新增了一个Bottom Sheets控件,就是我们经常在分享或者地图、音乐等app里看到的效果
之前Support Library 23.2还没能更新时,官方视频就已经流出(英文字幕版):
从视频看出Support Library 23.2新增了:
Support Vector Drawables and Animated Vector Drawables
AppCompat DayNight theme
Design Support Library: Bottom Sheets
Support v4: MediaBrowserServiceCompat
RecyclerView
Custom Tabs
Leanback for Android TV
具体可以上官网博客看看。
http://android-developers.blogspot.com/2016/02/android-support-library-232.html
这篇文章我给大家讲讲BottomSheetBehavior的使用及注意的地方。
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<android.support.v4.widget.NestedScrollView
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:behavior_hideable="true"
app:behavior_peekHeight="50dp"
app:layout_behavior="@string/bottom_sheet_behavior"
>
<!-- NestedScrollView里设置你的底部表长什么样的-->
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ns);
// The View with the BottomSheetBehavior
CoordinatorLayout coordinatorLayout = (CoordinatorLayout) findViewById(R.id.cl);
View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
final BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
//这里是bottomSheet 状态的改变回调
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
//这里是拖拽中的回调,根据slideOffset可以做一些动画
}
});
}
其实也挺简单的,我来解释一下:
通过附加一个BottomSheetBehavior 给CoordinatorLayout的子视图,上文xml中的是NestedScrollView(adding app:layout_behavior = " android.support.design.widget.BottomSheetBehavior”),当然,RecyclerView也是可以的。如果需要BottomSheet View可以保持滚动,需要支持 nested scrolling (例如: NestedScrollView, RecyclerView, or ListView/ScrollView on API 21+)。
app:behavior_hideable="true"
app:behavior_peekHeight="50dp"
这两个属性我说说,peekHeight是当Bottom Sheets关闭的时候,底部下表我们能看到的高度,hideable 是当我们拖拽下拉的时候,bottom sheet是否能全部隐藏。
如果你需要监听Bottom Sheets回调的状态,可以通过setBottomSheetCallback来实现,onSlide方法是拖拽中的回调,根据slideOffset可以做一些动画。
onStateChanged方法可以监听状态的改变,总共5种:
STATE_COLLAPSED: 关闭Bottom Sheets,显示peekHeight的高度,默认是0
STATE_DRAGGING: 用户拖拽Bottom Sheets时的状态
STATE_SETTLING: 当Bottom Sheets view摆放时的状态。
STATE_EXPANDED: 当Bottom Sheets 展开的状态
STATE_HIDDEN: 当Bottom Sheets 隐藏的状态
我也简单的写了BottomSheetBehavior和BottomSheetDialog的demo,你可以看我源码是怎么用的
https://github.com/android-cjj/BottomSheets
接下来我们来讲讲该注意的地方,或者说如何更好地使用它。
可以通过下图的形式,拖拽、点击bottom sheet之外的地方和通过‘x’按钮
上图你可明显地看到第二幅图的设计是不合适的,空白太多,不美观,对吧!
如果Bottom Sheets 展开或者上拉覆盖了ActionBar or ToolBar 这种方式也是不合适的。
为了符合Material Design 设计,我们对尺寸有更严格的要求,当然,你想随意我也阻止不了。
我想说的就是上面这些了,如果大家还有补充,欢迎PR!
最近又写了一篇:BottomSheets源码解析,有兴趣的可以了解下:
https://github.com/android-cjj/SourceAnalysis/blob/master/README.md
Github:Android-CJJ
https://github.com/android-cjj------能 follow 下我就更好了
微博:Android_CJJ
http://weibo.com/chenjijun2011-------能 关注 下我就更好了
如果你喜欢这篇文章,记得点赞与分享给好友。
如果还想了解更多Android开发最佳实践、经验分享、最好用的工具与服务,技术前沿,请长按下方二维码或搜索微信公众号:AndroidTrending关注我,我会继续保持精品。