一、FloatingActionButton简介

FloatingActionButton是 Android design support library 中的另一个组件。

FloatingActionButtonpublic class FloatingActionButtonextends ImageButtonjava.lang.Objectandroid.view.Viewandroid.widget.ImageViewandroid.widget.ImageButtonandroid.support.design.widget.FloatingActionButton 

是一个有3D效果的悬浮按钮,继承ImageView,所以FloatingActionButton有ImageView的全部属性,你也可以把它当做一个ImageView使用。

二、FloatingActionButton属性

app:elevation ···························································设置FAB未按下时的阴影大小
app:pressedTranslationZ·····································设置FAB按下时的阴影大小(需要设置事件才能开的效*果*)
app:fabSize································································设置FAB的大小,有normal、mini、auto
app:borderWidth ···················································设置FAB的边框宽度
android:src·································································设置FAB的drawaber
app:rippleColor························································设置FAB按下时的背景色(需要设置事件才能开的效果)
app:backgroundTint··············································设置FAB未按下时的背景色
app:layout_anchor··················································设置FAB的锚点及所依赖的View
app:layout_anchorGravity···································设置FAB相对于锚点的位置
app:layout_behavior··············································设置FAB的Behavior行为属性
app:backgroundTintMode··································设置渲染模式有multiply、screen、src_atop、src_in、src_over
app:useCompatPadding······································使能够兼容padding
app:layout_insetEdge···········································(后面研究)
app:layout_dodgeInsetEdges···························(后面研究)
app:layout_keyline················································(后面研究)

注意:

  • app:borderWidth :这个一般设置为0dp,不然的话在4.1的sdk上FAB会显示为正方形,而且在5.0以后的sdk没有阴影效果
  • app:rippleColor:当我使用com.android.support:design:23.2.0 的时候这个属性会失效,建议使用最新的 com.android.support:design:23.3.0’ 或者适当的降低版本
  • app:useCompatPadding:(后面研究)
  • app:layout_insetEdge:(后面研究)
  • app:layout_dodgeInsetEdges:(后面研究)
  • app:layout_keyline:(后面研究)

三、FloatingActionButton简单使用

.support.design.widget.FloatingActionButton            android:id="@+id/fab_one"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="left|top"            android:layout_marginLeft="16dp"            android:layout_marginTop="10dp"            android:src="@mipmap/ic_launcher"            app:backgroundTint="@color/colorAccent"            app:borderWidth="0dp"            app:elevation="20dp"            app:pressedTranslationZ="20dp"            app:rippleColor="@color/colorPrimary" />

设置不同的backgroundTint、elevation、pressedTranslationZ属性的效果图如下
Android Material Design之FloatingActionButton_第1张图片

四、FloatingActionButton与SnackBar

当SnackBar出现的时候FloatingActionButton会自动留出显示区域给SnackBar

Android Material Design之FloatingActionButton_第2张图片

实现方式一:设置FAB的点击事件

 floatingActionButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Snackbar.make(v, "FloatingActionButton", Snackbar.LENGTH_SHORT).show();            }        });

实现方式二:Snackbar的容器使用CoordinatorLayout

 Snackbar.make(coordinatorLayout, "FloatingActionButton", Snackbar.LENGTH_SHORT).show();

五、FloatingActionButton与RecyclerView

就是实现向上滑动列表的时候隐藏FAB,实现向下滑动的时候显示FAB,下面的效果图可能看不出来,将就一下。。。。
Android Material Design之FloatingActionButton_第3张图片

看过源码就应该知道FAB有个内部类Behavior ,用来控制FAB的行为,但是系统自带只支持AppBarLayout改变的效果,所以我们需要自己重新Behavior

java.lang.Object   ↳    android.support.design.widget.CoordinatorLayout.Behavior.support.design.widget.FloatingActionButton>       ↳    android.support.design.widget.FloatingActionButton.Behavior 

自定义的Behavior

public class ScrollBehavior extends FloatingActionButton.Behavior {    private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();    private boolean mIsAnimatingOut = false;    public ScrollBehavior(Context context, AttributeSet attrs) {        super();    }    @Override    public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,                                       final View directTargetChild, final View target, final int nestedScrollAxes) {        // 确定是在垂直方向上滑动        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL                || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);    }    @Override    public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,                               final View target, final int dxConsumed, final int dyConsumed,                               final int dxUnconsumed, final int dyUnconsumed) {        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);        if (dyConsumed > 0 && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) {            // 不显示FAB            animateOut(child);        } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {            // 显示FAB            animateIn(child);        }    }    // 定义滑动时的属性动画效果    private void animateOut(final FloatingActionButton button) {        if (Build.VERSION.SDK_INT >= 14) {            ViewCompat.animate(button).scaleX(0.0F).scaleY(0.0F).alpha(0.0F).setInterpolator(INTERPOLATOR).withLayer()                    .setListener(new ViewPropertyAnimatorListener() {                        public void onAnimationStart(View view) {                            ScrollBehavior.this.mIsAnimatingOut = true;                        }                        public void onAnimationCancel(View view) {                            ScrollBehavior.this.mIsAnimatingOut = false;                        }                        public void onAnimationEnd(View view) {                            ScrollBehavior.this.mIsAnimatingOut = false;                            view.setVisibility(View.GONE);                        }                    }).start();        } else {            Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.fab_out);            anim.setInterpolator(INTERPOLATOR);            anim.setDuration(200L);            anim.setAnimationListener(new Animation.AnimationListener() {                public void onAnimationStart(Animation animation) {                    ScrollBehavior.this.mIsAnimatingOut = true;                }                public void onAnimationEnd(Animation animation) {                    ScrollBehavior.this.mIsAnimatingOut = false;                    button.setVisibility(View.GONE);                }                @Override                public void onAnimationRepeat(final Animation animation) {                }            });            button.startAnimation(anim);        }    }    private void animateIn(FloatingActionButton button) {        button.setVisibility(View.VISIBLE);        if (Build.VERSION.SDK_INT >= 14) {            ViewCompat.animate(button).scaleX(1.0F).scaleY(1.0F).alpha(1.0F)                    .setInterpolator(INTERPOLATOR).withLayer().setListener(null)                    .start();        } else {            Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.fab_in);            anim.setDuration(200L);            anim.setInterpolator(INTERPOLATOR);            button.startAnimation(anim);        }    }}

然后在xml中设置layout_behavior属性为我们自己写的就可以实现了

六、FloatingActionButton与AppBarLayout

借助FloatingActionButton的layout_anchor、ayout_anchorGravity属性设置FAB的位置
Android Material Design之FloatingActionButton_第4张图片

布局代码

.support.design.widget.CoordinatorLayout xmlns: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:id="@+id/coordinator_layout"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".SecondActivity">    .support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="256dp"        android:fitsSystemWindows="true">        .support.design.widget.CollapsingToolbarLayout            android:id="@+id/collapsingToolbarLayout"            android:layout_width="match_parent"            android:layout_height="match_parent"            app:contentScrim="#30469b"            app:expandedTitleMarginStart="48dp"            app:layout_scrollFlags="scroll|exitUntilCollapsed">            "match_parent"                android:layout_height="match_parent"                android:scaleType="centerCrop"                android:src="@mipmap/ic_launcher"                app:layout_collapseMode="parallax"                app:layout_collapseParallaxMultiplier="0.7" />            .support.v7.widget.Toolbar                android:id="@+id/toolbar"                android:layout_width="match_parent"                android:layout_height="?attr/actionBarSize"                app:layout_collapseMode="pin" />        .support.design.widget.CollapsingToolbarLayout>    .support.design.widget.AppBarLayout>    .support.design.widget.FloatingActionButton        android:id="@+id/fab"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@mipmap/ic_launcher"        app:backgroundTint="@color/colorAccent"        app:borderWidth="0dp"        app:elevation="6dp"        app:fabSize="normal"        app:layout_anchor="@id/collapsingToolbarLayout"        app:layout_anchorGravity="bottom|center"        app:pressedTranslationZ="12dp"        app:rippleColor="#a6a6a6" />    .support.v7.widget.RecyclerView        android:id="@+id/recyclerView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:scrollbars="none"        app:layout_behavior="@string/appbar_scrolling_view_behavior" />.support.design.widget.CoordinatorLayout>

这里用到的CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout、Toolbar后面文章会介绍

总结

FloatingActionButton是一个比较简单的控件,只要掌握几个常用属性就好了

项目源码

https://github.com/Yi520153/DesignFloatingActionButton

参考资料

http://www.tuicool.com/articles/u2aauiQ

http://blog.csdn.net/codenoodles/article/details/50898837

http://www.woshipm.com/ucd/166400.html

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1028/1857.html

http://blog.csdn.net/lmj623565791/article/details/46678867

http://blog.csdn.net/wei_smile/article/details/51375170

更多相关文章

  1. Android 导航条效果实现(三) ViewPager+PagerTabStrip
  2. android tv 实现颜色条滚动效果
  3. Android 福彩3D体彩排列(源码+算法)
  4. Android 属性动画详解
  5. android仿照ipone的弹性效果
  6. Android 4.0源码编译错误
  7. Android 源码阅读之SMS
  8. 【android-tips】android程序执行adb shell命令(实例源码)

随机推荐

  1. Android中Shape Drawable在xml中的使用
  2. android 事件模型
  3. ios 开发之基础控件
  4. Android(安卓)开发环境安装
  5. stagefright概述
  6. Android系统启动流程 -- linux kernel
  7. 【Android(安卓)声音处理】MediaPlayer和
  8. Android(安卓)View 事件分发机制详解
  9. android相对布局--计算器的例子
  10. Android(安卓)学习之- 单选按钮、复选框