1. FloatingActionButton类
FloatingActionButton
是5.0版本出现的控件,显示一个圆形悬浮按钮。需要添加Design
依赖库,并且使用Theme.AppCompat
主题。
2. FloatingActionButton配置
FloatingActionButton
的配置
属性 | 说明 |
---|---|
android:src | 显示的图标,最好是24dp的 |
app:backgroundTint | 正常的背景颜色 |
app:rippleColor | 按下时的背景颜色 |
app:elevation | 正常的阴影大小(默认6dp) |
app:pressedTranslationZ | 按下时的阴影大小(默认12dp) |
app:borderWidth | 边框宽度 |
app:layout_anchor | 设置FAB的锚点,即以哪个控件为参照设置位置 |
app:layout_anchorGravity | FAB相对于锚点的位置 |
app:fabSize | normal或mini(对应56dp和40dp) |
配置文件
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:layout_margin="20dp"
android:src="@drawable/icon_qq"
app:rippleColor="#ffe5e5e5"
app:backgroundTint="#ffffffff"
app:elevation="6dp"
app:pressedTranslationZ="6dp"
app:fabSize="mini"
app:borderWidth="0dp"/>
效果如下
3. Snackbar交互
FloatingActionButton
如果没有与Snackbar
关联,容易被Snackbar
覆盖。
设置FloatingActionButton
在CoordinatorLayout
内部,同时将这个CoordinatorLayout
作为View
参数传给Snackbar
的make()
方法。
查看了一下Snackbar
的源码,如果父视图是CoordinatorLayout
,创建Snackbar
的时候,会设置LayoutParams
的insetEdge
属性。
final void showView() {
if (mView.getParent() == null) {
final ViewGroup.LayoutParams lp = mView.getLayoutParams();
if (lp instanceof CoordinatorLayout.LayoutParams) {
// If our LayoutParams are from a CoordinatorLayout, we'll setup our Behavior
final CoordinatorLayout.LayoutParams clp = (CoordinatorLayout.LayoutParams) lp;
final Behavior behavior = new Behavior();
behavior.setStartAlphaSwipeDistance(0.1f);
behavior.setEndAlphaSwipeDistance(0.6f);
behavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_START_TO_END);
behavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
@Override
public void onDismiss(View view) {
view.setVisibility(View.GONE);
dispatchDismiss(BaseCallback.DISMISS_EVENT_SWIPE);
}
@Override
public void onDragStateChanged(int state) {
switch (state) {
case SwipeDismissBehavior.STATE_DRAGGING:
case SwipeDismissBehavior.STATE_SETTLING:
// If the view is being dragged or settling, pause the timeout
SnackbarManager.getInstance().pauseTimeout(mManagerCallback);
break;
case SwipeDismissBehavior.STATE_IDLE:
// If the view has been released and is idle, restore the timeout
SnackbarManager.getInstance()
.restoreTimeoutIfPaused(mManagerCallback);
break;
}
}
});
clp.setBehavior(behavior);
// Also set the inset edge so that views can dodge the bar correctly
clp.insetEdge = Gravity.BOTTOM;
}
mTargetParent.addView(mView);
}
... ...
}