动作抽屉(actiondrawer)设计模式不是很常用,但是对于一些问题这个模式还是比较给力的,因此在这章内容还是提一下。它可以在用户需要的时候才出现,所以平时是比较节省屏幕空间的。这个设计模式有时也叫着滑动抽屉(slidingdrawer),可以通过安卓SDK实现。
小屏幕的智能手机显示空间是有限的。因此设计者需要考虑哪些操作应该直接显示在屏幕上,哪些需要放到菜单里或别的地方。但是放到菜单或别的地方又让用户很难找到,他们就会觉得软件不好用。
动作抽屉是一个包含一些用户操作和控制按钮的视图,默认情况下是不完全显示的。通常是将可以唤出动作抽屉视图的组件显示给用户。打开的抽屉视图部分或完全覆盖当前UI视图,而不用跳转到一个新的活动(Activity)。Winamp应用就使用了动作抽屉,当用户需要的时候就将播放列表控制条显示出来。如图18-12,动作抽屉是隐藏着的,只是将呼唤组件显示出来。如图18-13,动作抽屉处于显示状态,并且覆盖了部分下面的UI。
用户点击呼唤组件(就像门把手一样)或拖拉把手就可以打开动作抽屉视图,再次点击或相反方向拖拉就能关上(做过抽屉视图的人都懂)。后退键也应该可以将之关上。
动作抽屉的主要功能就是隐藏次要的操作,释放屏幕空间,使界面更简洁。它也没啥高深的东西,很容易理解。动作抽屉不像应用的上下文导航,让人搞不清东南西北,因为它的隐藏和显示都在同一个界面。
大屏幕需要重新适配,将所有的东西都显示出来,因为屏幕够大啊。
在安卓设计中一般不使用这种模式,更倾向于操作栏的溢出菜单。溢出菜单使用很普遍,相较于动作抽屉,人们更熟悉溢出菜单。但是需要更复杂的组件时,动作抽屉还是能派上用场的。例如在Winamp应用中,进度条(seekbar)就无法放到溢出菜单里,因为溢出菜单只能放文本项。
你应该尽可能让抽屉的打开过程顺畅和简单,使抽屉能立刻响应用户的操作。让呼唤(把手)组件更直观也是很重要的(你懂的,用户需要知道那能干嘛)。
安卓提供了UI组件来实现动作抽屉,实现起来很容易。在第十一章的时候就讲了抽屉。可以返回十一章或查看在线文档了解更多相关信息:
http://developer.android.com/reference/android/widget/SlidingDrawer.html
注意,官方实现只能向上滑动打开抽屉,但有第三方库实现的其他方向打开抽屉的方法。
下拉刷新(pull-to-refresh)是个颇有争议的设计模式,在安卓平台上并没有被完全认可。尽管它不是起源于特定平台,但在苹果上的效果要比在安卓上的好。下拉刷新其实是推特(Twitter)的软件专利。Twitter公司公开表示他们不会利用专利起诉任何人,除非有傻X用这个来起诉他们,才会用来作为辩护工具并反击,但是本书写的东西不可作为法律参考意见,你应该咨询你公司的法律顾问。
下拉刷新是加在列表组件上的功能,允许用户刷新列表。当列表滑动到顶部时,继续向下滑动就可以刷新列表。
刷新操作是很常用的,在显示动态数据的时候是必须提供的。刷新功能通常由操作栏上的按钮实现,这样设计本身是不错的,但也有它的局限性,尤其在屏幕空间还有限的时候。
当用户频繁刷新的时候,不停地到屏幕顶部去点按钮就让人很不爽了(尤其是我大苹果那么长。。。还有些手机那么大,单手难以操作啊)。
为了节约空间,同时用户还能手动刷新,这时用户就可以将列表向下滑动直到超过最上面一条数据。如图18-14展示了整个过程。用户一直向下滑动列表,当超过最上面一条数据的时候就会出现一个新的UI控件,控件上显示一些反馈信息(一般是说明你现在的操作作用),当你拿开手指的时候会显示一个进度指示器,显示正在加载新数据。加载完后进度指示器就会消失并且会将最新数据显示在列表中。
注意,下拉刷新后的新数据会出现在列表最上面。如果列表是无序的,那么下拉手势将不会起作用(是吗?好像不会吧)。
用户只要在列表的任何位置向下拉动就可实现下拉刷新。而且下拉刷新对于用户来说是很自然的交互,不会显得别扭。用户只需要直观的向下滑动屏幕就可看到最新的消息。
下拉刷新在大屏幕手机上同样很出色。适配大屏幕的时,大部分都不用做任何修改。
下拉刷新被批评说风格与安卓的设计不符(不明觉厉啊)。因为这个受到苹果系统的弹性列表的影响,而这在安卓上是没有的。我认为下拉刷新是独立于平台之外的,跟弹性列表的影响没啥关系。
下拉刷新的可见性确实是个问题。用户没有执行下拉手势之前是无法看到下拉刷新的提示的。有些开发者建议在列表的顶部搞个指示器之类的,但是现在还没有明显的改进。
这里有一些开源的库实现了安卓平台的下拉刷新功能。依我个人的经验来看,ChrisBanes的Android-PullToRefresh库是最好的。你可以下载这个库也可以在它的Github主页上了解到更多的使用细节:
https://github.com/chrisbanes/Android-PullToRefresh
这个库的实现方式很聪明,它继承了安卓的原生列表组件。这样的话你同样可以使用到原生的功能。你需要使用这个库中的列表组件,而不能再用原生的列表了。下面是布局的例子:
你可以添加一个简单的监听器,当用户下拉列表的时候,监听器就会收到这个事件:
移除列表加载指示器(就是像进度条一样)只需要让列表项知道刷新操作已经完成就行了,用以下代码实现:
pullToRefreshView.onRefreshComplete();
此章未完待续。。。。。。