`
Beyon_javaeye
  • 浏览: 68460 次
  • 性别: 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
分享到:
评论

相关推荐

    UE5编辑器页面布局定制:深入指南与实战技巧

    本文将详细介绍如何在UE5中定制编辑器页面布局,包括基本操作、高级布局技巧,以及如何通过代码实现自定义布局。 通过本文的介绍,你应该已经掌握了UE5编辑器页面布局定制的基本方法和一些高级技巧。从基本的面板...

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

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

    JAVA布局模式:GridBagConstraints终极技巧

    在Java GUI编程中,设计美观且功能丰富的...熟练掌握这些属性和技巧,将有助于创建出高效、美观的Java Swing应用程序。通过不断的实践和探索,你将能够更好地利用`GridBagConstraints`来满足各种复杂的界面设计需求。

    变幻之美Div+CSS网页布局揭秘:案例实战篇

    通过《变幻之美Div+CSS网页布局揭秘:案例实战篇》,读者不仅能掌握Div和CSS的基础知识,还能进一步了解高级布局技巧,从而在网页设计领域游刃有余。书中提供的PDF文件和说明文件将为学习者提供丰富的资源,助力他们...

    CSS布局之道

    这个"CSS布局之道"的学习资源,会涵盖以上诸多方面,通过实例和练习,帮助初学者快速掌握CSS布局技巧,从而实现高效且美观的网页设计。在学习过程中,实践和理解每个概念,并结合实际项目应用,将有助于巩固和提升...

    Flexbox布局革命:打造响应式网页设计

    ### Flexbox布局革命:打造响应式网页设计 随着互联网技术的发展和移动设备的普及,响应式网页设计成为了网站开发中的...通过合理利用Flexbox的各种属性和技巧,开发者可以轻松创建出既美观又实用的响应式网页布局。

    DIV布局十大技巧以及DIV盒子模型

    在网页设计领域,`DIV`布局是构建网页结构的基础,...掌握这些`DIV`布局技巧和`DIV`盒子模型,将有助于创建整洁、高效且富有弹性的网页设计。在实际开发中,结合具体需求和场景灵活运用,可以使页面布局更加得心应手。

    QT 例程 布局管理

    在QT中,布局管理是构建高效、适应性强的用户界面的关键技术之一。本压缩包文件包含了一系列针对QT布局管理的学习资源,帮助初学者深入理解和实践这一功能。 布局管理在QT中主要是通过QLayout类来实现的,它允许...

    unigui入门教程3(布局的使用)

    - 网格布局:将控件按行和列进行组织,常用于创建表格或棋盘式的用户界面。 - 流式布局:控件按照设定的方向(水平或垂直)依次排列,当空间不足时自动换行,适用于展示列表或菜单。 - 相对布局:根据每个控件与...

    高效学习CSS布局之道244个范例源码

    通过逐步调试和修改源码,你可以逐步掌握各种布局技巧,提升网页设计的灵活性和效率。 总之,"高效学习CSS布局之道244个范例源码"是一份宝贵的教育资源,它将带你踏上精通CSS布局的道路。不论你是初学者还是经验...

    Android Studio实战:快速高效地构建Android应用

    通过阅读《Android Studio实战:快速高效地构建Android应用》,开发者不仅可以掌握Android Studio的使用技巧,还能了解到完整的Android应用开发流程,从而提升开发效率和应用质量。书中可能还会包含实际项目案例,...

    qt 最基础 最详细的 基本布局 源代码(2)

    Qt是一个强大的跨平台应用程序开发框架...总结来说,Qt的布局系统是其GUI开发的核心部分,帮助开发者高效地管理窗口小部件。通过深入学习和实践,你可以掌握布局的使用,从而创建出适应性强、用户体验良好的应用程序。

    MFC界面自动布局demo

    在本文中,我们将深入...总的来说,通过学习和掌握EasySize,MFC开发者可以更高效地实现界面的自动布局,提升应用的用户体验。在实际项目中,结合EasySize和其他MFC技巧,我们可以创建出既美观又适应性强的用户界面。

    CSS网站布局实录内含各色css布局样式

    2. 浮动布局:float属性常用于创建多列布局,元素会浮动到其父元素的左侧或右侧。 3. 定位布局:position属性(static、relative、absolute、fixed)可以控制元素相对于其正常位置或父元素的位置。 4. Flexbox布局:...

    高效学习CSS布局之道pdf

    通过《高效学习CSS布局之道》这本书,读者将不仅学习到以上知识点,还能掌握如何在实际项目中灵活运用这些技巧,构建出美观且功能完善的网页。书中的每个范例都是精心设计的实战案例,旨在帮助读者巩固理论知识,...

    android布局技巧

    ### Android布局技巧详解 在Android应用开发中,布局设计是构建用户界面的关键步骤。良好的布局不仅能够提升用户体验,还能优化应用性能。本文将深入探讨Android布局的技巧,帮助开发者掌握如何利用基本布局组件...

    完美的jquery页面布局

    在实践中,通过jQuery和jQuery Layout,我们可以实现如下的页面布局技巧: 1. **响应式布局**:根据设备屏幕大小调整布局,确保页面在不同设备上都能良好显示。 2. **动态调整**:允许用户在运行时改变布局,例如...

    pcb布局技巧,pcb布线技巧

    本篇文章将深入探讨“pcb布局技巧”和“pcb布线技巧”,帮助提升你的PCB设计技能。 首先,我们要理解PCB布局的基本原则。布局时应考虑以下几点: 1. **功能模块化**:将相同或相关的功能部件集中在一起,减少信号...

    android 相对布局

    4. 调试布局:使用Android Studio的预览功能,可以在设计视图中实时调整和预览布局效果,以确保布局在不同设备上表现一致。 总结来说,Android的相对布局是一个强大且灵活的工具,它让开发者能够更加自由地设计界面...

Global site tag (gtag.js) - Google Analytics