`
Beyon_javaeye
  • 浏览: 64936 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

布局技巧:创建高效布局

阅读更多
布局技巧:创建高效布局

  Android UI工具包提供了一些布局管理器,它们使用起来相当容易,而且,大多数的时候,你只需要使用它们最基本的特征来实现UI。
  执着于基本特征的使用对于创建UI来说,往往不是最高效的。一个常见的例子就是滥用LinearLayout,它将会导致View树中的View数量激增。View——更糟的是,布局管理器——添加到应用程序里都会带来一定的消耗:初始化,布局和绘制变得更加缓慢。嵌套布局的花销尤其“昂贵”,例如,如果你嵌套了一些LinearLayout,并使用了weight参数,这会导致子元素要计算两次。
  让我们看一个非常简单且常见的布局例子:一个列表项,左边是一个图标,右边是标题和描述,上方是标题,下方是可选的描述。列表项可能看起来如下图:

  为了清楚地认识View之间(一个ImageView和两个TextView)的相对位置,下图是使用HierarchyViewer抓获的布局剪影:

  实现这个布局,直接使用LinearLayout就可以了。列表项本身是一个水平的LinearLayout,里面有一个ImageView和一个垂直的LinearLayout,垂直的LinearLayout里包含两个TextView。以下是这个布局的源代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:text="My Application" />
        <TextView  
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" 
            android:singleLine="true"
            android:ellipsize="marquee"
            android:text="Simple application that shows how to use RelativeLayout" />
        </LinearLayout>
</LinearLayout>

  如果你将它作为ListView的item,它能正常工作,但却是相当浪费的。相同的布局可以使用RelativeLayout进行重写,相对于每个列表项来说,可以节省一个View,且View层级上更好,只有一层。使用RelativeLayout也很简单:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />
<TextView  
        android:id="@+id/secondLine"
        android:layout_width="fill_parent"
        android:layout_height="26dip" 
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout" />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/secondLine"
        android:layout_alignWithParentIfMissing="true"
        android:gravity="center_vertical"
        android:text="My Application" />
</RelativeLayout>

    新的实现与老的实现看起来效果完全一致,除了一种情况。每个列表项显示两行文字:标题和可选的描述。当某一个列表项的描述不可获得时,应用程序可能希望将第二个TextView的Visibility设为GONE。LinearLayout实现版表现得很完美,但RelativeLayout实现版就有点差强人意了:

    在RelativeLayout里,每个View都是和父元素RelativeLayout对齐或是和其它View对齐的。例如,我们声明描述部分是和RelativeLayout的底部对齐,标题位于其上并与RelativeLayout的顶端对齐。当描述GONE时,RelativeLayout不知道怎么去放置标题的底边缘。为了解决这个问题,你可以使用一个非常简单的布局参数:layout_alignWithParentIfMissing。
    这个布尔参数告诉RelativeLayout:如果目标对象消失时使用自己的边缘作为锚点。例如,如果你放置一个View到另一个Visibiity属性设为GONE的View的右边,且设定alignWithParentIfMissing为true,RelativeLayout就会将其左边缘作为View的对齐锚点。在我们的这个场合,使用alignWithParentIfMissing的结果是RelativeLayout将标题部分的底部与自己的底部对齐。结果如下所示:


  现在,我们的布局表现得很完美了,即使描述部分的Visibility属性设为GONE。更好的是,层级更加简单,因为我们不再使用LinearLayout,而且,更加高效了。当我们使用HierarchyViewer来比较两个实现版的时候,事实就更明显了:

    另外,当你使用这么一个布局作为ListView的列表项时,这种差异就更为重要了。希望这个简单的例子能让你了解布局,了解如何优化你的UI。
  • 大小: 5.8 KB
  • 大小: 706 Bytes
  • 大小: 4.6 KB
  • 大小: 737 Bytes
  • 大小: 4.6 KB
  • 大小: 730 Bytes
  • 大小: 79.5 KB
分享到:
评论

相关推荐

    Android布局技巧之创建高效布局

    执着于基本特征的使用对于创建UI来说,往往不是最高效的。一个常见的例子就是滥用LinearLayout,它将会导致View树中的View数量激增。View——更糟的是,布局管理器——添加到应用程序里都会带来一定的消耗:初始化,...

    Android布局技巧之创建可重用的UI组件

    为了满足这一需求,并且能高效的实现,你可以把多个标准的构件结合起来成为一个单独的、可重用的组件。 例如,你可以创建一个可重用的组件包含一个进度条和一个取消按钮,一个Panel包含两个按钮(确定和取消动作),...

    CSS Web设计高级教程 第2版.part2

     如何创建HTML Email模板和基本HTML表格布局,以及CSS在文中所起的作用  网格和布局对设计的重要性  本书读者对象 本书针对希望透彻了解如何用CSS仓,J建专业水平Web站点的Web开发人员。 内容简介 本书注重Web...

    CSS 禅意花园 层叠样式表

    其理念简单而独特:召集设计师在设计良好的HTMI的基础上,通过应用CSS技巧创建极富想象力的作品,然后将其CSS代码粘贴在网站上,供他人研究和使用。在2003年创建之初,“CSS禅意花园”还默默无闻,而现在已发展到...

    Excel 2007数据透视表完全剖析 1/7

    “在如今这个有太多数据和太少时间的时代,本书非常专业地提供了内容丰富的数据透视表教程,让我们可以更高效地利用自己的数据和时间。”  ——德勒咨询公司高级经理,Kameron Yu  本书集中了数据透视表所有优秀的...

    Excel 2007数据透视表完全剖析 5/7

    “在如今这个有太多数据和太少时间的时代,本书非常专业地提供了内容丰富的数据透视表教程,让我们可以更高效地利用自己的数据和时间。”  ——德勒咨询公司高级经理,Kameron Yu  本书集中了数据透视表所有优秀的...

    Excel 2007数据透视表完全剖析 3/7

    “在如今这个有太多数据和太少时间的时代,本书非常专业地提供了内容丰富的数据透视表教程,让我们可以更高效地利用自己的数据和时间。”  ——德勒咨询公司高级经理,Kameron Yu  本书集中了数据透视表所有优秀的...

    Excel 2007数据透视表完全剖析 4/7

    “在如今这个有太多数据和太少时间的时代,本书非常专业地提供了内容丰富的数据透视表教程,让我们可以更高效地利用自己的数据和时间。”  ——德勒咨询公司高级经理,Kameron Yu  本书集中了数据透视表所有优秀的...

    掌握这20个CSS技巧提升你的CSS技能

    这里涵盖了20个css技巧来帮助你减少重复规则和复写,在布局中标准化样式流程,不仅可以帮助你高效地创建自己的框架,而且可以解决许多常见的问题。 1、使用CSS重置(reset) css重置库如normalize.css已经被使用很...

    flex3的cookbook书籍完整版dpf(包含目录)

    为渲染器设置高效图像 7.10.节.为项渲染器和项编辑器应用运行时样式 7.11.节. 为项编辑器应用状态和变换 7.12.节.创建一个带复选框的Tree控件 7.13.节. 改变List 中渲染器的大小 第八章:图像,位图,视频和声音...

    Jira与Confluence操作指引

    Jira是Atlassian出品的一款事务管理软件,它既可以作为项目开发管理工具,也可以作为任务管理、流程管理的...使用模板创建页面、各种编辑页面的技巧、布局与常用宏使用;使用confluence高效创建项目报告;Dram.io、Zenu

    PT80-NEAT开发指南v1.1

    窗口的创建和删除 ................................................................................................................................ 22 窗口类型 .............................................

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的...

    北京中科信软Excel2007培训

    第四章、高效准确的公式计算 第一节、Excel 中公式建立方法和相关工具 自动求和的灵活应用 合并计算多张工作表数据 第二节、深层次理解公式中引用关系 第四章、函数的高级应用 第一节、常用条件统计函数的应用 ...

    asp.net知识库

    新控件、管理外观、布局及其它用户体验 ASP.NET 2.0 缓存技术 (原创) asp.net 2.0中的theme主题覆盖问题 asp.net 2.0中利用app_offline.htm功能 .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 ...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    深入解析Windows操作系统中文.part2.rar

    另外,本书还介绍了一些高级诊断技术,以便使你的系统运行得更加平稳和高效。无论你是开发人员还是系统管理员,你都可以在本书中找到一些关键的、有关体系结构方面的知识,通过这些知识你可以更好地做系统设计、调试...

Global site tag (gtag.js) - Google Analytics