`
wghjay
  • 浏览: 91251 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android UI优化

阅读更多

在Android中最常用LinearLayout表示UI的框架,而且也是最直观和方便的方法。例如创建一个UI用于展现Item的基本内容。如图所示:

ui_layout_01

线框图:

ui_layout_02

直接可以通过LinearLayout快速的实现这个UI的排列:

 

<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>
<!-- Easy AdSenser V2.37 --><!-- Post[count: 2] -->

尽管可以通过Linearlayout实现我们所预想的结果,但是在这里存在一个优化的问题,尤其是针对为大量Items。比较RelativeLayout和LinearLayout,在资源利用上前者会占用更少的资源而达到相同的效果,以下是用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>

针对RelativeLayout有一点需要注意,因为它内部是通过多个View之间的关系而确定的框架,那么当其中某一个View因为某些需要调用GONE来完全隐藏掉后,会影响与其相关联的Views。Android为我们提供了一个属性 alignWithParentIfMissing 用于解决类似问题,当某一个View无法找到与其相关联的Views后将依据alignWithParentIfMissing的设定判断是否与父级View对齐。

下边是两种不同layout在Hierarchy Viewer中的层级关系图:

ui_layout_03

 

简单或复杂的问题都需要时常考虑如何优化资源的分配。比如一个功能很简单的应用程序,它会调用一些我们常用的对话框或者输入面板,这需要采用统一的方式来针对不同的应用程序制定统一标准。

当我们面对Android UI优化时,有必要继续考虑资源复用。手机开发给我们的直观感觉是运行其上的软件应该尽可能的达到资源高效利用的极致,而不能像开发PC机那样,似乎有用之不尽的资源。

定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是 <viewStub />, <requestFocus />, <merge /> and <include />。可是以往我们所接触的案例或者官方文档的例子都没有着重去介绍这些标签的重要性。

  • <viewStub  />: 此标签可以使UI在特殊情况下,直观效果类似于设置View的不可见性,但是其更大的(R)意义在于被这个标签所包裹的Views在默认状态下不会占用任何内存空间。viewStub通过include从外部导入Views元素。
    • 用法:通过android:layout来指定所包含的内容。默认情况下,ViewStub所包含的标签都属于visibility=GONE。viewStub通过方法inflate()来召唤系统加载其内部的Views。
      <ViewStub android:id="@+id/stub"
      android:inflatedId="@+id/subTree"
      android:layout="@layout/mySubTree"
      android:layout_width="120dip"
      android:layout_height="40dip" />
      
  • <merge />: 将在下一篇做详细介绍。
  • <include />:可以通过这个标签直接加载外部的xml到当前结构中,是复用UI资源的常用标签。
    • 用法:将需要复用xml文件路径赋予include标签的Layout属性。
      <include android:id="@+id/cell1" layout="@layout/ar01" />
      <include android:layout_width="fill_parent" layout="@layout/ar02" />
      
  • <requestFocus />: 标签用于指定屏幕内的焦点View。
    • 用法: 将标签置于Views标签内部 <!-- Easy AdSenser V2.37 --><!-- Post[count: 2] -->
      <EditText id="@+id/text"
                   android:layout_width="fill_parent"
                   android:layout_height="wrap_content"
                   android:layout_weight="0"
                   android:paddingBottom="4">
             <requestFocus />
      </EditText>

    单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构。

    将通过一个例子来了解这个标签实际所产生的作用,这样可以更直观的了解<merge/>的用法。

    建立一个简单的Layout,其中包含两个Views元素:ImageViewTextView 默认状态下我们将这两个元素放在FrameLayout中。其效果是在主视图中全屏显示一张图片,之后将标题显示在图片上,并位于视图的下方。以下是xml代码:

     

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
    
            android:scaleType="center"
            android:src="@drawable/golden_gate" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dip"
            android:layout_gravity="center_horizontal|bottom"
    
            android:padding="12dip"
    
            android:background="#AA000000"
            android:textColor="#ffffffff"
    
            android:text="Golden Gate" />
    
    </FrameLayout>

    应用上边的Layout运行的视图为:

    layouttutorial_merge_01

     

    启动 tools> hierarchyviewer.bat工具查看当前UI结构视图:

    layouttutorial_merge_02

     

    我们可以很明显的看到由红色线框所包含的结构出现了两个framelayout节点,很明显这两个完全意义相同的节点造成了资源浪费(这里可以提醒大家在开发工程中可以习惯性的通过hierarchyViewer查看当前UI资源的分配情况),那么如何才能解决这种问题呢(就当前例子是如何去掉多余的frameLayout节点)?这时候就要用到<merge />标签来处理类似的问题了。我们将上边xml代码中的framLayout替换成merge:

    <!-- Easy AdSenser V2.37 --><!-- Post[count: 2] -->

     

    <merge xmlns:android="http://schemas.android.com/apk/res/android">
    
        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
    
            android:scaleType="center"
            android:src="@drawable/golden_gate" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dip"
            android:layout_gravity="center_horizontal|bottom"
    
            android:padding="12dip"
    
            android:background="#AA000000"
            android:textColor="#ffffffff"
    
            android:text="Golden Gate" />
    
    </merge>

    运行程序后在Emulator中显示的效果是一样的,可是通过hierarchyviewer查看的UI结构是有变化的,当初多余的 FrameLayout节点被合并在一起了,或者可以理解为将merge标签中的子集直接加到Activity的FrameLayout跟节点下(这里需要提醒大家注意:所有的Activity视图的根节点都是frameLayout)。如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能应用上边的例子通过merge来优化UI结构。

    layouttutorial_merge_03

     

    除了上边的例子外,meger还有另外一个用法

    当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。

    另外有两点需要特别注意:

  • <merge />只可以作为xml layout的根节点。
  • 当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。(更多说明请参见inflate()文档)

 

 原文地址 hhttp://www.curious-creature.org/2009/03/01/android-layout-tricks-3-optimize-part-1/
分享到:
评论

相关推荐

    Android UI 优化.ppt

    Android UI 优化.ppt

    Android UI 优化之merge标签的使用

    在Android开发中,UI性能优化是一项至关重要的任务,它直接影响到应用的用户体验。"merge"标签是Android XML布局文件中的一个特殊元素,主要用于减少视图层次,提高布局加载效率,从而提升UI性能。本文将深入探讨...

    Android UI优化之ViewStub标签的使用

    在Android开发中,UI优化是提升用户体验的关键环节。ViewStub是一个轻量级的视图组件,它在布局文件中占用极小的资源,主要用于延迟加载和动态插入布局。本篇文章将详细探讨ViewStub的使用方法及其在UI优化中的作用...

    Android 性能优化之UI优化源码

    在Android应用开发中,UI优化是一项至关重要的任务,它直接影响到用户体验和应用的性能。本文将深入探讨Android UI优化的源码层面,帮助开发者更好地理解并实现高效的UI更新与渲染。 首先,我们要明白Android UI的...

    了解Android开发规范:性能及UI优化是什么样的?

    本文带您全面了解Android开发规范,其中包括Android编码规范,Android性能优化和Android UI优化,读完绝对不会后悔的好文章。 一、Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量...

    解析Android开发优化之:对界面UI的优化详解(一)

    在Android应用开发中,UI优化是一项至关重要的任务,它直接影响到应用的性能和用户体验。本文主要探讨了如何针对界面UI进行优化,特别是如何有效利用系统资源以提高效率和减少资源占用。 首先,Android中的界面布局...

    Android UI基础教程 高清带标签pdf

     《AndroidUI基础教程》是一本Android用户界面设计的基础入门图书。全书从最基础的技术概念开始介绍,深入讨论了UI设计的各项技术,涵盖了为应用程序创建UI的所有内容。本书不仅会告诉读者创建灵活布局的最佳方法,...

    android UI界面开发图片

    在Android平台上进行UI界面开发时,图片资源是至关重要的元素,它们不仅决定了应用的视觉吸引力,也直接影响用户体验。本文将围绕“Android UI界面开发图片”这一主题,深入探讨相关知识点,帮助开发者创建出美观且...

    android ui基础教程

    ### Android UI基础教程知识点概述 #### 一、Android UI基础知识 **1.1 Android UI简介** Android UI(用户界面)是Android应用程序与用户交互的主要方式。一个良好的UI设计能够极大地提升用户体验,使得用户更...

    AndroidUI界面开发规范

    ### AndroidUI界面开发规范 #### 一、引言 随着移动设备的普及和发展,用户界面(UI)设计在软件开发中的重要性日益凸显。一个良好的UI不仅能够提升用户体验,还能够帮助开发者更好地传达产品理念。本篇文章将从...

    Android UI开发专题

    ### Android UI开发专题知识点概述 ...这对于Android UI开发者来说是非常宝贵的资源,有助于他们更好地设计和优化用户界面,从而提升用户体验。接下来的章节将会继续深入探讨更多关于Android UI开发的技术细节。

    Android UI试练 微信UIDemo

    总的来说,“Android UI试练 微信UIDemo”是一个全面的教程,涵盖了Android UI设计的多个方面,包括布局管理、组件使用、用户交互、网络请求和性能优化等。开发者可以通过这个项目学习并实践,提升自己的Android UI...

    androidUI设计实践

    9. **测试与迭代**:设计完成后,通过真实设备或模拟器进行测试,收集用户反馈,不断优化UI设计,使其更符合用户需求。 最后,了解并应用Android Studio中的设计工具,如Vector Asset Studio(用于生成SVG矢量图形...

    android UI大全

    在Android开发领域,UI设计是至关重要的一环,它关乎到应用程序的用户体验和视觉吸引力。"android UI大全"这个资源包,显然集成了多种Android用户界面元素的源码和示例,旨在帮助初学者快速入门,并为面试做准备。让...

    androidUI典型例子

    这个"androidUI典型例子"是基于模仿奇艺客户端,旨在帮助开发者掌握Android UI设计的基本原则和技巧。下面,我们将深入探讨这个主题,并结合"qiyi_UIPlayHD"这个压缩包中的文件,解析相关的知识点。 1. **布局管理...

    android UI定制的一些资料

    在Android平台上,UI(用户界面)定制是一项关键的技术任务,它允许开发者根据需求和品牌风格创建独特的用户体验。这里,我们探讨的是"android UI定制的一些资料",这些资料可能包括设计原则、布局技巧、自定义视图...

    android-UI.zip_android_android ui_android ui_android 漂亮_安卓好看ui

    在Android开发领域,UI设计是至关重要的,因为它直接影响到应用的用户体验和吸引力。"android-UI.zip"这个压缩包提供了一套精美的Android UI设计样例,为开发者提供了丰富的参考素材,帮助他们创造出更加吸引人的...

Global site tag (gtag.js) - Google Analytics