【Android开发Wiki】进阶篇TV应用设计(一)—优化电视布局
- 格式:pdf
- 大小:218.86 KB
- 文档页数:4
原文链接:/training/multiscreen/adaptui.html根据您的应用当前显示的布局,用户界面流程可能会有所不同。
例如,如果您的应用处于双面板模式下,点击左侧面板上的项即可直接在右侧面板上显示相关内容;如果该应用处于单面板模式下,相关内容就应以其他活动的形式在同一面板上显示。
确定当前布局由于每种布局的实施都会稍有不同,因此您可能需要先确定当前向用户显示的布局。
例如,您可以了解用户所处的是“单面板”模式还是“双面板”模式。
要做到这一点,您可以查询指定视图是否存在以及是否已显示出来。
请注意:这段代码用于查询“报道”面板是否可用,与针对具体布局的硬编码查询相比,这段代码的灵活性要大得多。
再举一个适应各种组件的存在情况的方法示例:在对这些组件执行操作前先查看它们是否可用。
例如,新闻阅读器示例应用中有一个用于打开菜单的按钮,但只有在版本低于 3.0 的Android 上运行该应用时,这个按钮才会存在,因为 API 级别 11 或更高级别中的Acti onBar已取代了该按钮的功能。
因此,您可以使用以下代码为此按钮添加事件侦听器:根据当前布局做出响应有些操作可能会因当前的具体布局而产生不同的结果。
例如,在新闻阅读器示例中,如果用户界面处于双面板模式下,那么点击标题列表中的标题就会在右侧面板中打开相应报道;但如果用户界面处于单面板模式下,那么上述操作就会启动一个独立活动:同样,如果该应用处于双面板模式下,就应设置带导航标签的操作栏;但如果该应用处于单面板模式下,就应使用旋转窗口小部件设置导航栏。
因此您的代码还应确定哪种情况比较合适: final String CATEGORIES[] = { "热门报道", "政治", "经济", "Technology" };重复使用其他活动中的片段多屏幕设计中的重复模式是指,对于某些屏幕配置,已实施界面的一部分会用作面板;但对于其他配置,这部分就会以独立活动的形式存在。
【转】Android布局优化之ViewStubViewStub是Android布局优化中⼀个很不错的标签/控件,直接继承⾃View。
虽然Android开发⼈员基本上都听说过,但是真正⽤的可能不多。
ViewStub可以理解成⼀个⾮常轻量级的View,与其他的控件⼀样,有着⾃⼰的属性及特定的⽅法。
当ViewStub使⽤在布局⽂件中时,当程序inflate布局⽂件时,ViewStub本⾝也会被解析,且占据内存控件,但是与其他控件相⽐,主要区别体现在以下⼏点:1.当布局⽂件inflate时,ViewStub控件虽然也占据内存,但是相相⽐于其他控件,ViewStub所占内存很⼩;2.布局⽂件inflate时,ViewStub主要是作为⼀个“占位符”的性质,放置于view tree中,且ViewStub本⾝是不可见的。
ViewStub中有⼀个layout属性,指向ViewStub本⾝可能被替换掉的布局⽂件,在⼀定时机时,通过viewStub.inflate()完成此过程;3.ViewStub本⾝是不可见的,对ViewStub setVisibility(..)与其他控件不⼀样,ViewStub的setVisibility 成View.VISIBLE或INVISIBLE如果是⾸次使⽤,都会⾃动inflate其指向的布局⽂件,并替换ViewStub本⾝,再次使⽤则是相当于对其指向的布局⽂件设置可见性。
这⾥需要注意的是:1.ViewStub之所以常称之为“延迟化加载”,是因为在教多数情况下,程序⽆需显⽰ViewStub所指向的布局⽂件,只有在特定的某些较少条件下,此时ViewStub所指向的布局⽂件才需要被inflate,且此布局⽂件直接将当前ViewStub替换掉,具体是通过viewStub.infalte()或viewStub.setVisibility(View.VISIBLE)来完成;2.正确把握住ViewStub的应⽤场景⾮常重要,正如如1中所描述需求场景下,使⽤ViewStub可以优化布局;3.对ViewStub的inflate操作只能进⾏⼀次,因为inflate的时候是将其指向的布局⽂件解析inflate并替换掉当前ViewStub本⾝(由此体现出了ViewStub“占位符”性质),⼀旦替换后,此时原来的布局⽂件中就没有ViewStub控件了,因此,如果多次对ViewStub进⾏infalte,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。
Android应用界面设计与优化原则一、引言Android是目前最流行的移动操作系统之一,开发者在设计和优化Android应用界面时,需要遵循一些原则以提供良好的用户体验。
本文将从可用性、一致性和响应性等方面介绍Android应用界面设计与优化的原则。
二、可用性1. 界面布局清晰明了:合理划分界面布局,将相关功能放置在对应的位置,减少用户学习成本和操作复杂度。
2. 显示必要信息:界面上展示与用户当前操作相关的信息,避免信息冗余或遗漏。
3. 提供反馈和引导:及时给出正确的反馈信息,指导用户进行下一步操作,提高应用可用性。
4. 设计易于理解的导航:通过明确的导航结构和可见的导航元素,帮助用户快速找到所需内容。
三、一致性1. 遵循Android设计规范:应用界面风格应符合Android设计规范,如采用Material Design风格,以提供一致的用户体验。
2. 统一的颜色和字体:统一使用应用的颜色和字体样式,以增强应用的视觉一致性。
3. 统一的图标风格:选用一套统一的图标,确保各个功能模块之间的图标风格统一,并加以合理分类。
4. 统一的操作逻辑:保持相似功能的操作逻辑一致,减少用户的认知负担。
四、响应性1. 减少加载时间:优化应用界面加载速度,减少用户等待时间,使用异步加载和缓存等技术提高应用的响应速度。
2. 快速响应用户交互:在用户操作后迅速给予反馈,避免操作没有任何响应而令用户产生困惑。
3. 合理的动画效果:适度运用动画效果提升用户体验,但不要过度使用,以免分散用户注意力或增加耗时。
五、界面优化1. 清晰的可操作元素:将可操作元素设计得足够大,易于点击,避免用户误操作。
2. 合理的内容展示:通过合理的布局和字号大小,确保内容的可读性和界面的整洁性。
3. 合适的填充和间距:合理设置填充和间距,使界面元素之间有一定的间隔,提高可读性和用户体验。
4. 图片的压缩和适配:对图片进行压缩,以减小应用包的大小和减少加载时间,同时适配不同屏幕尺寸的设备。
提供祖传式的(Ancestral)和临时性的(Temporal)导航现在,用户已经可以按着应用的层级深入地导航到应用的各个屏幕,我们需要提供一个可以让用户按层级向上导航回父辈或是祖辈屏幕的方法。
此外,我们应该保证通过返回键的临时导航遵守Android公约(一般的Android应用使用习惯)。
前进/后退导航设计更多设计指导原则,请参阅Android设计之导航模式向导。
支持临时导航:返回临时导航,或是在历史屏幕之前导航,被深入的根植到了Android系统中。
所有的Android 用户都希望返回键能把他们带回到前一个屏幕,而不考虑其它状态。
历史屏幕总是被根植在用户的Launcher(启动)应用中(手机的"主(home)"屏幕)。
也就是说,当用户按足够多次返回按键时,用户将回到自己的桌面,之后,返回键将不再起作用。
应用程序通常不用自己去考虑如何管理返回键,系统自动地处理了任务与返回堆栈-Tasks and Back Stack或是历史屏幕列表。
默认情况下,当返回键被按下时,即可遍历这个屏幕列表,把当前屏幕从列表上移除。
然而,有些情况下你可能希望重写返回键的行为。
例如,如你的屏幕中嵌入了一个浏览器,用户可以接入页面中的元素并在不同的网页中导航,你也许会希望当用户按下设备的返回键时触发的是浏览器默认的返回行为。
直到返回到浏览器历史记录的顶部时,你应该要使用回系统默认的返回键行为。
提供祖传式的导航:向上和主页-Provide Ancestral Navigation:Up and Home 在Android 3.0之前,最通用的祖传式导航方式是主页隐喻模式。
其通常的实现方式是:在主菜单中存在一个主页条目,或是在屏幕的左上角有一个主页按键,一般情况下也是作为动作栏(见Android设计中的模式文档)的一个组件存在的。
当选择主页时,用户将被带回到最上层的屏幕,通常就是我们熟知的主屏幕。
提供直接接入应用程序主页的方法可以给用户增加舒服和安全感。
提供后代和横向导航-Providing Descendant and Lateral Navigation一种提供接入一个应用程序所有屏幕的方法是现实分层导航。
这节课我们讨论两种导航方式:一、后代导航,它可以让用户从屏幕层级上"向下"进入一个子屏幕;二、横向导航,它允许用户接入同一级的兄弟屏幕(sibling screens).有两种类型的兄弟屏幕:集合相关(collection-related)和部分相关(section-related)屏幕。
集合相关屏幕指的是一个父屏幕集合中每一个独立的项目(individual items)。
部分相关屏幕代表的是父屏幕不同部分的信息。
例如,一个部分可能显示的是一个事物的文本信息,而别一个提供了这个事物地理位置的地图信息。
对于一个给定的父屏幕,其部分相关屏幕的数量一般是很少的。
后代导航与横向导航可能由列表,标签或是其它用户接口模式提供。
用户接口模式,很像软件设计模式,是对于交互设计问题的一般性的,通信的解决方案。
我们将会在接下来的几个章节中探讨一些通用的横向导航模式。
按键与简单的目标-Buttons and Simple Targets按键设计更多的向导信息,请阅读Android按键设计向导。
对于部分相关屏幕,在父屏幕中提供可触摸的和键盘聚焦的目标,通常是最直接和最类似于基于触摸的导航接口。
这样的目标范例有:按键,固定大小的列表视图,或是文本链接。
虽然最后一个(文本链接)不是一个基于触摸导航的理想UI(用户接口),但也属于部分相关屏幕范例的一种。
当选中这些目标中的一个,子屏幕将被开启,完全替代现有的内容(屏幕)。
按键和其他这些简单目标几乎不被用来表示集合中的项目。
一个通用的,基于按键的模式,可以用来接入不同的顶层应用的分类(top-level applicat ion sections),即仪表盘模式。
一个仪表盘是一个网格状的,大的图标按键,它组成了整个或是大部分的父屏幕。
组合:为范例应用创建框架现在,我们对导航的模式和屏幕分组技术有了有深入地理解,是时候把它们组合起来并应用到我们的屏幕上了。
让我们再看一眼这个新闻应用范例的完整的屏幕地图。
下一步,我们要做的是从前文讨论过的导航模式中选择一种并应用到这个屏幕地图上,使用Anroid最佳实践方式,最大化导航速度,最小化触屏次数,同时保持接口的直观与统一。
我们也应该考虑不同设备的屏幕尺寸不一这个因素,做出相应的不同的选择。
为了简单起见,让我们专注于平板和手持制备(手机)。
-Choose Patterns选择模式选择模式-Choose首先,我们的第二层屏幕(故事分类列表,照片列表,以及保存的项目列表)可以使用标签(tabs)统一分组。
注意,我们并不一定需要使用水平排列的标签(tabs);在一些情况下,下拉列表UI元素可以作为合适的代替使用,特别是当设备的屏幕非常窄时,如一些手机。
我们也可以把,保存的图片列表,保存的故事列表组合起来,在手机用使用标签(tabs)显示,或是是平板上使用多个垂直的内容面板显示。
最后,让我们考虑一下怎么呈现新闻故事。
为了简化不同故事分类之就的导航,第一个可选方案是使用水平颁页,并在横向滑动面上使用一系列的标签(labels),指示当前可见的页面以及相临地可访问的分类。
在平板上,当水平显示时,我们可以多做一步,在屏幕左边添加一个面板显示水平可分页的故事列表,而故事视图则作为主要内容显示在屏幕右边。
下图展示了使用这种导航模式后手机以及平板上新的屏幕地图。
到目前为止,思考一下屏幕地图的变化是一个很好的主意,这样做是为了防止在实践中(当你草绘应用的屏幕布局时)你的选择不能很好的被应用。
下图是一个屏幕地图变化的范例,其展示的是在平板上并排地显示不同分类的故事列表,而故事视力则保持独立。
-Sketch and Wireframe素描和线框-Sketch素描和线框绘制线框图是你开始为你的屏幕布局时的第一步。
有创意地开始想象怎么样安排UI元素来允许用户在你的应用种进行导航。
安卓的应用设计及程序调试技巧Android操作系统是目前手机领域中使用最广泛的一种操作系统,其生态系统也是比较完备的。
对于一名安卓开发者来说,要学会设计和调试一个好的应用是非常重要的。
本文将从应用设计和程序调试两个方面出发,分享一下一些安卓的应用设计及程序调试技巧。
一、应用设计1. 界面设计在设计应用界面时,要注意色彩的搭配和界面布局的合理性。
应用的界面设计应该符合现代人的审美标准,同时也要尽量简洁。
通过精心设计的界面可以提高用户的体验感,从而吸引更多的用户。
2. 功能模块在设计应用时,要根据应用的功能,将不同的功能模块组织在一起。
每个模块都要尽可能的独立,并且可以独立测试和开发。
在设计过程中应注意避免出现不必要的功能模块或过于繁琐的功能模块。
3. 界面交互设计在设计应用的界面交互时,应考虑系统的可用性和易用性。
通过使用交互设计,可以提高用户对应用的认知和使用频率。
例如,可以将按钮的颜色设置为亮色调,以增加用户的注意力。
4. 编码规范在编写代码时,要遵循一定的编码规范,这是一种良好的编程习惯。
例如,要遵守Java编程规范,命名规范,注释规范等。
这样可以使得代码更加易读、易维护、可扩展等。
二、程序调试1. 日志输出在调试过程中,可以使用日志输出来输出调试信息,以便分析和跟踪错误。
在应用中可以使用Logcat等工具来输出日志信息。
在输出日志信息时,要注意避免输出过多的信息和密集的输出,这将使得调试效率降低。
2. 数据调试在调试过程中,可以使用调试器来检查应用程序的状态。
可以使用调试器来检查变量的值,以及检查方法的返回值等。
通过调试器可以轻松分析代码的执行流程,帮助我们快速定位问题。
3. 微调UI在进行应用调试时,可以对应用的UI做微调。
例如,可以查看UI元素的宽度、高度、位置和间距等,以便更精准的调整应用界面。
4. 内存调试在进行应用调试时,可以检测应用程序的内存状态,以保证应用程序的内存使用率是正常的。
原文链接:/training/multipleapks/screensize.html在我们利用多重的APKs在Google Play中开发android应用时,很重要的一点就是在一开始就要采取好的方法,以避免在进一步开发过程中遇到不必要的麻烦。
这节课将会告诉你如何在你的涵盖不同类别的屏幕尺寸的应用中创建多重的APKs。
你也将会获得一些工具,这些工具能让你更容易的维护多重的APK代码库。
确认你需要多重的APKs当你试图创建一个能够在多个不同尺寸的android设备上运行的应用程序时,当然,你希望你的应用程序既能够充分利用较大屏幕尺寸设备的所有空间,又不至于在较小屏幕尺寸设备上牺牲兼容性和易用性。
从一开始看来多重的APK支持就是最好的解决方案,但情况往往不是这样。
多重APK开发者指南的Using Single APK Instead部分包含了一些有用信息,关于如何用单个的APK做到这一点,包括利用我们的支持文库。
你也可以阅读本指南以实现多屏幕支持,你甚至可以用android SDK下载我们的支持文库,它可以让你使用蜂窝设备的片段(使单一APK支持多屏幕尺寸更容易)。
如果你能够做的好,那么仅包含一个单一的APK的应用程序会有以下几个优点:∙出版和测试更容易∙只需要维持一个代码库∙应用程序可以适应设备配置的变化∙跨设备的应用程序恢复工作∙无需担心市场的偏好,APK的“升级”行为,以及APK在何种类别的设备上运行假设你现在已经研究了这一节课的主题,而且还相当好学的吸收掌握了链接中的资源素材,并确定多重的APKs是你的应用程序的正确选择。
把你的需求列成图表开始你需要创建一个图表以快速的确定你需要多少的APK,以及每一个APK所囊括的屏幕尺寸。
这种图表能够很容易快速、轻松的绘制出你要的需求,并在以后作为你的参考。
我们可以以代表Android平台上可供选择的不同屏幕尺寸的一行单元格作为开始。
现在你可以给这个图表涂上色,每一种颜色代表一个APK。
/training/design-navigation/screen-planning.html大多数应用程序有一个可以表示为一棵树或图形对象类型的固有信息模型。
更明确的说,你可以画一个图的不同类型的信息,用来表示用户与您的应用程序交互的信息类型。
软件工程师和数据架构师经常使用实体关系图(ERD)来描述应用程序的信息模型。
让我们来考虑一个允许用户通过浏览一组分类的新闻故事和照片的示例应用程序。
对于这样一个应用程序的一个可能的模式图如下所示形式的E R D。
图1.新闻应用程序例子的实体关系图。
创建一个屏幕列表一旦你定义了信息模型,你就可以开始定义应用程序中使用户能够有效地发现、查看和行动必要背景的数据。
在实践中,做到这一点的方法之一是确定一套详尽允许用户浏览和交互的数据需要的屏幕。
我们实际上显示的屏幕在目标设备上有所不同,这是重要的一点,需要在设计过程中考虑这点,以确保应用程序能够适应其不同设备环境。
我们要在我们的示例应用程序中,使用户能够查看、保存和共享分类的故事和照片。
下面是一个包括这些用例的详尽屏幕列表。
启动故事和照片的主页或访问的屏幕分类列表一个给定的类的新闻列表故事的细节视图(我们可以保存和共享)分类的列表的照片图片详细视图(我们可以保存和共享)所有已保存的项目清单保存的照片列表保存的故事列表现在我们可以定义屏幕之间的指向关系,箭头从一个屏幕A到另一个屏幕B意味着,用户通过一些交互可以在屏幕B回到上一个屏幕A。
一旦我们定义了屏幕和它们之间的关系,我们可以通过图一致的表达上述关系,其中包括所有的屏幕和它们之间的关系:图2.新闻应用程序例子的详尽屏幕关系图。
如果我们希望允许用户提交新闻故事,或者上传照片,我们可以增加额外的屏幕,这个图。
超越一个简单的设计在这一点上,根据详尽的屏幕关系图,可以设计一个功能完整的应用程序。
一个简单的用户界面会由子屏幕的列表和按钮组成:按钮的不同部分(例如,故事,照片,保存的项目)垂直列表集合(例如,故事列表,照片列表等)详细信息(例如,故事来看,全屏幕的照片来看,等)但是,您可以使用屏幕分组技术和更先进的导航元素,更直观、更敏感的设备的方式来呈现内容。
原文链接:/training/custom-views/optimizing-view.html现在你有一个设计好的,对手势和状态之间的转变做出反应的view,你需要保证view能快速的运行。
在播放期间,为了避免UI界面感觉呆滞和不连贯的问题,你必须保证你的动画速率始终在60帧/秒上一直运行着。
降低刷新频率为了提高view的运行速度,减少来自于频繁调用的程序的不必要的代码。
从onDraw()方法开始调用,这会给你带来最好的回报。
特别地,在onDraw()方法中你应该减少冗余代码,冗余代码会带来使你view不连贯的垃圾回收。
初始化的冗余对象,或者动画之间的,在动画运行时,永远都不会有所贡献。
加之为了使onDraw()方法更有依赖性,你应该尽可能的不要频繁的调用它。
大部分时候调用onDraw()方法就是调用invalidate()的结果,所以减少不必要的调用invalidate()方法。
有可能的,调用四种参数不同类型的invalidate(),而不是调用无参的版本。
无参变量需要刷新整个view,而四种参数类型的变量只需刷新指定部分的view.这种高效的调用更加接近需求,也能减少落在矩形屏幕外的不必要刷新的页面。
另外奢侈的操作就是研究布局。
任何时候,一个view调用requestLayou()方法,这Andr oidUI 系统会穿过整个层级view来查找每一个view需要多大,如果发现冲突的尺寸,它需要多次穿过这个层级。
UI设计者们创建了深层次的内置的ViewGroup对象,为了让UI 更合适的表现出来。
这深层此的view会带来画面的问题,尽可能的使你的view层级关系浅显一些。
作为Android3.0,Android2D图表系统可以通过大部分新的Android装置自带GPU(图表处理单元)来增加,对于许多应用程序来说,GPU硬件加速度能带来巨大的性能增加,但是对于每一个应用来讲,并不都是正确的选择。
为景观模式提供适当的布局源文件.
确保文本和相应的控制在一定距离上是足够大以便看见的.
为高清电视提供高分辨率的位图和图标.
设计景观布局
电视屏幕通常都是取决于景观.针对电视屏幕按照这些技巧来优化你的景观布局:
把屏幕上的导航控制菜单放在屏幕的左边或者右边,并且将菜单内容以垂直的方式显示.
创建那些分段的UI时,通过使用Fragments和使用像用GridView来替代ListView更能充分使用水平空间的视图组控件.
使用视图组例如RelativeLayout和LinearLayout来排版视图.以上这些允许android系统能够针对大小,对齐,纵横比,以及屏幕的像素密度来匹配视图的位置
在视图控制之间提供足够的余地来避免一个杂乱的用户界面.
例如接下来的布局就是针对TV优化的:
在这个布局中,控制是位于左边界.这个UI界面里面显示了一个GridView控件,这个Grid
View是非常适合景观方向的UI.在这个布局中GridView和Fragment都是动态设置宽和高,
以便能自适应屏幕的分辨率.在运行时控制视图被添加到了左边片段编程.这UI布局文件位
res/layoutlandlarge/photogrid_tv.xml下.(这个布局文件放置在layout-land-large,
在一个电视的应用程序的UI里,文字和控制应当是容易看见并且在一定距离内可以导航的.例如这些技巧能让它们在一定距离内更加容易看见:
把文本插入用户能够快速地扫描到的小块中.
在一个黑暗的背景中使用明亮的文本.这个风格在一台电视中更方便读.
避免轻量级的字体以及那些要么非常窄要么非常宽的笔画字体.使用简单的无衬线字体和使用抗混叠来提高可读性.
使用系统的标准的字体大小:
确保那时你的所有视图小工具足够的大以便距离屏幕10英尺的人能清晰可见.要实现它的最好方式是采用相对布局大小而不是绝对布局大小,并且采用密度无关的像素单元而不是绝对的像素单元.例如,设置容器的宽,使用实际的大小来替代像素尺寸,并且设置与父组件的距离,使用dip像素单元替代px像素单元.
针对高分辨率大屏幕设计
android系统有一个内存限制量,所以在你的应用程序中下载和保存一个高分辨率的图片经常会导致内存溢出的错误.为了避免这些,使用如下这些技巧:
仅当它们被显示在屏幕上的时候进行加载.例如,当在GridView和Gallery中显示多组图片时,当在视图的Adapter中调用[android.view.View,android.view.ViewGroup) getView()](/reference/android/widget/Adapter.html#get View(int,)方法时加载图片.
在不在需要的bitmap视图中调用recycle()方法.
在内存回收器重采用WeakReference来存储涉及到的位图对象.
如果你从网络下载图片,使用AsyncTask来下载它们并且将它们保存在sdcard方便快速访问.在应用程序的UI线程中永远也不要处理网络交互.
当你下载它们时按比例缩小原来大的图片到一个更适合它的大小;否则下载图片本身可能会导致内存溢出异常.这里有一个在执行下载的时候按比例缩小图片的范例代码:
文章来源:/page/Optimizing_Layouts_for_TV。