1.PrefaceDesignSupportLibrary是Google发布的一个新的兼容函数库,可以在Android2.1(Apilevel7)及以上的设备上实现MaterialDesign,因此这个函数库还提供了一个系列控制。今天介绍的SnackBar就是其中之一。在使用DesignSupportLibrary之前,需要在build.gradle文件中添加依赖。compile'com.android.support:design:25.3.0'2、SnackBar的常规使用SnackBar是一个轻量级控件,显示在屏幕底部,显示和隐藏时都有动画效果。主要用作快速提醒。可以完美替代Toast,使用的API与Toast完全相似,不难掌握。它和Toast最大的区别在于SnackBar可以有一个按钮,也就是说它可以承载简单的交互逻辑。下面来看看SnackBar可以实现的效果。正如你所看到的,它会在底部显示一个消息栏,当它显示和隐藏时,它有自己的动画,可以承载一个TextView和Button。其实SnackBar的很多API都是参考了Toast,所以用法很相似。就拿上面的例子来说,代码也很简单。SnackBar需要传入一个ViewGroup,然后才能显示在这个ViewGroup中,通常我们会把这个ViewGroup放在屏幕的底部。SnackBar没有公共的构造方法,所以需要使用make()方法得到一个SnackBar对象,然后调用show()方法显示出来。在上面的示例中,setAction()方法还用于为其右侧的按钮设置文本和单击事件。下面介绍一些SnackBar自带的基础API:make():构造一个SnackBar对象,进行简单的配置。show():用于显示一个构造好的SnackBar。setText():为SnackBar设置提示的消息内容。setAction():用于指定右边按钮显示的文字和对应的thought事件。setActionTextColor():设置右侧按钮文字的颜色。setCallback():设置SnackBar显示和隐藏时的回调监听。setDuration():更新持续时间。可以看出,SnackBar本身只是提供了一个非常简单的API实现。谷歌似乎希望开发人员按照他们的风格设计应用程序。3.带着疑问看SnackBar。SnackBar的基本API的使用前面已经介绍过了。如果我们要进行其他设置,需要自己进行一些操作。那么我们带着疑问来看看如何使用SnackBar。下面会涉及到SnackBar的部分源码。不感兴趣的可以跳过,直接看每道题的结论。1、可以设置常驻SnackBar吗?从上面的例子可以看出,SnackBar有点模仿了Toast的意思。给我们选择的两个值,LENGTH_SHORT和LENGTH_LONG,分别代表两个不同的显示时间。小吃店。从代码文档来看,我们似乎没有办法设置常驻的SnackBar。但是仔细看源码可以发现,duration是通过@Duration接口限制输入的,而duration其实有3个值,另外一个可以设置为常驻。因此,如果我们对SnackBar有常驻需求,可以使用LENGTH_INDEFINITE标志。2.去除滑动删除功能前面提到SnackBar需要一个ViewGroup容器来容纳,官方推荐使用CoordinatorLayoutViewGroup,它其实是SupportDesignLibrary中提供的一个容器控件。官方之所以推荐,是因为它允许用户在SnackBar上右滑删除。话虽如此,还是从源码上来看一下具体实现。SnackBar继承自BaseTransientBottomBar,这个实现在父类中。如图,如果SnackBar的父布局是CoordinatorLayout,使用Behavior实现滑动删除功能。所以如果我们不需要滑动删除的功能,可以考虑用一个FrameLayout来容纳SnackBar。或者你需要滑动功能,但是发现没有实现。检查布局以查看承载SnackBar的容器是否为CoordinatorLayout。3.可以通过禁用动画来实现吗?不知道有些交互设计师会不会要求不要动画,就这么直白的展示。那么让我们看看是否可以禁用动画。执行SnackBar的显示和隐藏动画的逻辑仍在其父类BaseTransientBottomBar中。查看源码可以看到,在显示和隐藏之前会调用shouldAnimate()方法来判断是否需要执行动画。这样看,好像SnackBar可以支持关闭动画,再看animateView的实现。是否使用动画取决于AccessibilityManager中的enable属性,而且是私有属性,没办法修改,如果用反射修改它的值,不确定会不会有其他问题。它需要被验证。.那么可以简单的认为SnackBar的动画是不能简单关闭的。4.SnackBar是否可以在顶部显示?由于SnackBar有一个外部容器来承载它,也就是说,容器在哪里,它实际上就出现在哪里。所以如果你把它设置到顶部,你实际上可以让它出现在顶部。但你认为这就是结局吗?您还需要考虑动画问题。虽然SnackBar会出现在最上面,但是动画还是从下往上出现,你会得到一个很奇怪的SnackBar。这显然不是我们想要的。那么想办法改变它出现和隐藏的动画就够了,继续在源码中寻找答案。animateViewIn()方法是SnackBar显示时调用的动画,但实际上不能重写。所以,把SnackBar放在最上面,完美执行动画的想法是遥不可及的。5.是否可以修改其他UI风格?SnackBar最初提供了很少的用于修改UI样式的API。只能修改右侧Button的字体颜色。让我们继续在源码中寻找答案。查看源码可以发现,它的布局在SnackBar中是inflater。布局文件是design_layout_snackbar_include.xmlSnackBar是用一个TextView和一个Button实现的。也就是说,我们可以直接找到这两个控件来改变它们的样式。参考setText()方法,我们可以看到它实际上是通过mView对象获取一个SnackbarContentLayout对象进行操作的。视图mView是我们需要的。SnackBar也提供了它的get方法,所以我们只需要获取它,然后修改里面的View的样式就可以满足我们的需要了。所以对于SnackBar的样式修改,只要通过getView()获取mView对象,就可以实现样式修改。4.再说几句题外话。带着问题看源码是一种很好的阅读源码的方式。其实SnackBar看起来很好用,但是封装的东西太多了。如果我们亲爱的设计师们能够按照MaterialDesign来设计App的话,直接使用SnackBar其实是一个不错的选择。针对某些自定义要求的类似于SnackBar的实现。其实我们看过SnackBar的源码,关键点都已经掌握了。参考SnackBar的源码,实现我们自己的XxSnackBar并不难。都是我们自己写的代码。如何实现,就看我们自己了。向上。我提出的问题实际上是我看到SnackBar时会想到的问题。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文
