Material Design 开发利器:Android Design Support Library 介绍

简介: 转自:https://blog.leancloud.cn/3306/   Android 5.0 Lollipop 是迄今为止最重大的一次发布,很大程度上是因为 material design —— 这是一门新的设计语言,它刷新了整个 Android 的用户体验。

转自:https://blog.leancloud.cn/3306/

 

Android 5.0 Lollipop 是迄今为止最重大的一次发布,很大程度上是因为 material design —— 这是一门新的设计语言,它刷新了整个 Android 的用户体验。但是对于开发者来说,要设计出完全符合 material design 哲学的应用,是一个很大的挑战。Android Design Support Library 对此提供了很好的支持,里面汇集了很多重要的 material design 控件,支持所有 Android 2.1 及后续版本。里面你可以看到 navigation drawer view、floating labels、floating action button、snackbar、tabs,以及一套将它们紧密结合在一起的动作与滚动框架

 

Navigation View(导航视图)

无论从应用标识、内容导航,还是设计一致性来讲,navigation drawer 都是首当其冲的焦点。现在,NavigationView 让导航栏变得更简单,它提供了 navigation drawer 需要的框架,以及通过资源文件来自定义更多菜单项的能力。

 

navigationview

你只需要将 NavigationView 作为 DrawerLayout 的内容视图来使用即可,例如:

drawerlayout

这里你会注意到两个属性:app:heanderLaytout 用来控制 header 部分的布局;app:menu 指定了菜单资源。NavigationView 自动处理了状态栏的变化,保证可以在 API 21+ 的设备上正确运行。

最简单的 drawer 菜单就是一个允许选择的菜单项集合,例如:

simplemenu

选中的菜单会高亮显示,以提醒用户当前选择的是哪个菜单项。

你也可以在菜单中使用 subheader 来实现独立的分组:

subheader_menu

调用 setNavigationItemSelectedListener() 后,在菜单项被选中的时候,你会通过OnNavigationItemSelectedListener 得到回调。在处理回调时,你会知道是哪个菜单项被点击,此时你可以处理选择事件,修改选中状态,加载新的内容,以及通过代码来关闭 drawer,或者其他任何你想执行的操作。

文字输入时的悬浮标签

尽管 EditText 已经为 material design 做了一些改善,但是还不够,譬如它在我们输入第一个字符的时候,就会自动隐藏掉提示标签。现在你该使用 TextInputLayout 了,它会在用户开始输入之后,自动将提示标签悬浮到 EditText 上方,这样用户就永远都能知道输入内容的上下文。

floatinglabel

另外,你也可以通过调用 setError() 方法,在 EditText 下方显示一个出错提示消息。多么贴心的设计,有没有?

Floating Action Button(浮动操作按钮)

Floating action button 是一个圆形按钮,代表当前页面最重要的交互动作。Design Library 里面的 FloatingActionButton 给了你一个简单一致的实现,它会默认使用你主题中 colorAccent 属性定义的色调。

actionbutton

在标准尺寸之外,它也支持 mini 尺寸。FloatActionButton 继承自 ImageView,所以你也可以使用android:src 或者其他方法(如 setImageDrawable())来控制它的外观。

Snackbar

如果要提供一个轻量、快速的操作反馈方式,那就非 Snackbar 莫属了。Snackbar 在屏幕最下方展示,包含文字和一个可选的操作,它会在一定时间后自动消失,用户也可以通过滑动手势来提前消除它。

查看Snackbar效果请点击(打不开时候注意FQ)

Snackbar 可以支持滑动手势,也可以响应点击动作,远比 Toast 强大,但是你会发现它的 API 非常眼熟:

Snackbar
.make(parentLayout, R.string.snackbar_text, Snackbar.LENGTH_LONG)
.setAction(R.string.snackbar_action, myOnClickListener)
.show(); // Don’t forget to show!

你会注意到 make 的第一个参数,Snackbar 会试图寻找合适的父视图,来确保它能显示在底部的正确位置。

Tabs(选项卡)

在应用内,通过 tab 在不同视图间切换,这不是 material design 中的新概念。Tabs 一般用来作顶层导航,或者组织、展示应用内不同分组的内容。如下图所示:

tabs

Design Library 的 TabLayout 控件实现了固定 tab(所有 tab 平分秋色,宽度固定)和滚动 tab(宽度根据标题长度自适应,可以水平滑动)两种形式,你可以用代码来添加 tab:


TabLayout tabLayout = ...;
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));

如果你使用 ViewPager 来水平分页,可直接在 PagerAdapter.getPageTitle() 中来创建 tab,最后通过 setupWithViewPager() 方法将它们绑定在一起。这能确保内容变化时 tab 和 ViewPager 会自动同步起来。

CoordinatorLayout、动画和滚屏

打造一个符合 material design 风格的应用,独特的视觉效果只是一方面,动作和手势也是非常重要的一部分。 Material design 里面包含了大量的手势,譬如点击的波纹效果和其他一些有用的转场动画。Design Library 介绍了 CoordinatorLayout 的布局方式,它提供了一个附加层,用来控制子视图间的点击事件,Design Library 里面很多控件都使用了这种布局。

CoordinatorLayout 和浮动操作按钮

FloatingActionButton 就是一个绝好的例子。当你将 FloatingActionButton 作为子元素加入 CoordinatorLayout,然后将 CoordinatorLayout 作为参数传给 Snackbar.make() 的时候,Snackbar 没有显示到 FloatingActionButton 上面。FloatingActionButton 利用了 CoordinatorLayout 提供的额外回调接口,在 Snackbar 展现的时候自动上移,消失的时候自动复位,所有这一切都不需要写任何代码。

查看效果请点击(打不开时候注意FQ)

CoordinatorLayout 还提供了一个 layout_anchor 的属性,连同 layout_anchorGravity 一起,可以用来放置与其他视图关联在一起的悬浮视图(如 FloatingActionButton)。

CoordinatorLayout 和 App Bar

CoordinatorLayout 的另一个主要使用场景,则与 appbar(以前的 actionBar)和滚屏相关。你可能已经在布局里面使用过 Toolbar,它允许你简单修改外观、整合图标以和其余部分一致。Design Library 将所有这些东西放到了下一级:使用 AppBarLayout,让你的 Toolbar 和其他视图(如 TabLayout 提供的 tab 视图),可以响应 ScrollingViewBehavior 标记的同级视图的滚动事件。此时你可以这样来创建一个布局:

coordinator_appbar

现在,随着用户滚动 RecyclerView, AppBarLayout 也会响应这些事件(通过使用子节点的 scroll flag 来控制它们如何滚入和滚出屏幕)。Flags 包括:

  • scroll: 这个标志会被设置到所有希望滚出屏幕的视图上,如果不设置这一标志,则视图会被一直保留在屏幕顶部。
  • enterAlways: 这个标志会确保任何下滑滚屏都会触发视图的展现,等于开启了一种「快速返回」模式。
  • enterAlwaysCollapsed: 如果设置了 minHeight 和这个标志,你的视图通常会折叠显示,只有当滚动视图已经到达了它的顶点以后才会打开到完整高度。
  • exitUntilCollapsed: 这个标志会导致视图在退出之前,一直被锁定。

注意一点:所有设置了 scroll 标志的视图必须在未设该标志的视图之前进行声明,这样可以确保所有的滚动视图都从顶部退出,而固定元素都不受影响。

可伸缩的 Toolbars

直接将 Toolbar 加到 AppBarLayout 中,你就可以设置 enterAlwaysCollapsed /exitUntilCollapsed 等滚动标志,但是不同元素如何响应折叠动作,你没法更深入地控制。要达到这一点,你需要使用 CollapsingToolbarLayout:

coordinator_toolbar

通过使用 app:layout_collapseMode="pin" 来确保 Toolbar 会一直被保留在屏幕顶端。更进一步,当你组合使用 CollapsingToolbarLayout 和 Toolbar,在视图完全展现的时候,标题会自动放大,当视图折叠的时候,标题则会过渡到默认字号。注意这时候你需要调用 CollapsingToolbarLayout 的 setTitle(),而不是 Toolbar 的相应方法。

 

除了将视图固定在屏幕之外,你还可以设置 app:layout_collapseMode="parallax"(额外也需要增加 app:layout_collapseParallaxMultiplier="0.7" 这样的属性来设置视差乘数)来达到视差滚动的效果。这种用法搭配 app:contentScrim="?attr/colorPrimary" 属性效果非常好,例如下面这样:

CoordinatorLayout 和自定义视图

还有一件重要的事情就是,CoordinatorLayout 并不是天生就理解 FloatingActionButton 或者 AppBarLayout 如何工作,它只是提供了一些 Coordinator.Behavior 的附加 API,允许子控件来更好地控制点击事件和手势。

视图也可以使用 CoordinatorLayout.DefaultBehavior(YourView.Behavior.class) 来定义一个默认的行为,或者在 layout 文件中设置app:layout_behavior="com.example.app.YourView$Behavior" 来达到同样的效果。

Design Library 框架允许任何视图与 CoordinatorLayout 组合使用。

现已发布

Design Library 现在已经公开发布了,请确认在 SDK manager 中升级 Android Support Repository。对于 Gradle 项目来讲,你可以直接加入对 Design Library 的依赖:

compile 'com.android.support:design:22.2.0'

注意 :Design Library 依赖于 Support v4 和 AppCompat Support 库,它们会自动被加进编译依赖里来。并且,这些新的 widget 在 Android Studio Layout 编辑器中也是可用的(在 CustomView 中找到他们)。

对于构建一个具有一流外观和交互的现代应用,Design Library、AppCompat 和所有 Android Support Library 都是非常重要的工具,大家快来动手试试吧。

目录
相关文章
|
5天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
12天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
14天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
12天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
13天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
24 2
|
14天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
21天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。