Android UI的优化
一、简要
在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小。
二、概述
1)利用系统定义的id
在xml文件中引用系统的id,只需要加上“@android:”前缀即可。如果是在Java代码中使用系统资源,和使用自己的资源基本上是一样的。不同的是,需要使用android.R类来使用系统的资源,而不是使用应用程序指定的R类。这里如果要获取ListView可以使用android.R.id.list来获取。
2)利用系统的图片资源
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android">
有些时候引用户会报错,从错误的提示信息大概可以看出,由于该资源没有被公开,所以无法在我们的应用中直接引用。既然这样的话,我们就可以在Android SDK中找到相应的图片资源,直接拷贝到我们的工程目录中,然后使用类似android:icon="@drawable/ic_menu_attachment"的代码片段进行引用。
这样做的好处,一个是美工不需要重复的做一份已有的图片了,可以节约不少工时;另一个是能保证我们的应用程序的风格与系统一致
Android中没有公开的资源,在xml中直接引用会报错。除了去找到对应资源并拷贝到我们自己的应用目录下使用以外,我们还可以将引用“@android”改成“@*android”解决。比如上面引用的附件图标,可以修改成下面的代码。
android:icon="@*android:drawable/ic_menu_attachment"
修改后,再次Build工程,就不会报错了。
3)利用系统的字符串资源
假设我们要实现一个Dialog,Dialog上面有“确定”和“取消”按钮。就可以使用下面的代码直接使用Android系统自带的字符串。
如果使用系统的字符串,默认就已经支持多语言环境了。如上述代码,直接使用了@android:string/yes和@android:string/no,在简体中文环境下会显示“确定”和“取消”,在英文环境下会显示“OK”和“Cancel”。
4)利用系统的Style
假设布局文件中有一个TextView,用来显示窗口的标题,使用中等大小字体。可以使用下面的代码片段来定义TextView的Style。
其中android:textAppearance="?android:attr/textAppearanceMedium"就是使用系统的style。需要注意的是,使用系统的style,需要在想要使用的资源前面加“?android:”作为前缀,而不是“@android:”。
5)利用系统的颜色定义
除了上述的各种系统资源以外,还可以使用系统定义好的颜色。在项目中最常用的,就是透明色的使用。代码片段如下
android:background ="@android:color/transparent"
Android系统本身有很多资源在应用中都可以直接使用,具体的,可以进入android-sdk的相应文件夹中去查看。例如:可以进入$android-sdk$\platforms\android-8\data\res
三、抽出的共用的布局
在一个应用程序中,一般都会存在多个Activity,每个Activity对应着一个UI布局文件。一般来说,为了保持不同窗口之间的风格统一,在这些UI布局文件中,几乎肯定会用到很多相同的布局。如果我们在每个xml文件中都把相同的布局都重写一遍,一个是代码冗余,可读性很差;另一个是修改起来比较麻烦,对后期的修改和维护非常不利。所以,一般情况下,我们需要把相同布局的代码单独写成一个模块,然后在用到的时候,可以通过<include /> 标签来重用layout的代码。
一般情况下,在项目的初期就能够大致确定整体UI的风格。所以早期的时候就可以做一些规划,将通用的模块先写出来。
下面是可能可以抽出的共用的布局:
1)背景。有的应用在不同的界面里会用到统一的背景。后期可能会经常修改默认背景,所以可以将背景做成一个通用模块。
2)头部的标题栏。如果应用有统一的头部标题栏,就可以抽取出来。
3)底部的导航栏。如果应用有导航栏,而且大部分的Activity的底部导航栏是相同的,就可以将导航栏写成一个通用模块。
4)ListView。大部分应用都会用到ListView展示多条数据。项目后期可能会经常调整ListView的风格,所以将ListView作为一个通用的模块比较好。
有时候,我们的页面中可能会包含一些布局,这些布局默认是隐藏的,当用户触发了一定的操作之后,隐藏的布局才会显示出来。比如,我们有一个Activity用来显示好友的列表,当用户点击Menu中的“导入”以后,在当前的Activity中才会显示出一个导入好友的布局界面。从需求的角度来说,这个导入功能,一般情况下用户是不使用的。即大部分时候,导入好友的布局都不会显示出来。这个时候,就可以使用延迟加载的功能。
ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当ViewStub被设置为可见,或者调用inflate()函数时,才会真的去加载这个布局资源文件。该ViewStub在加载视图时会在父容器中替换它本身。因此,ViewStub会一直存在于视图中,直到调用setVisibility(int)或者inflate()为止。ViewStub的布局参数会随着加载的视图数一同被添加到ViewStub父容器。同样,也可以通过使用inflated Id属性来定义或重命名要加载的视图对象的Id值。
利用ViewStub可以与xml文件里面指定的布局资源文件关联起来,让布局资源文件在需要使用的时候再加载上去。什么时候用什么时候才加载,不用在开始启动的时候一次加载。这样做既可以加快应用的启动速度,又可以节省内存资源。
Android UI的优化相关推荐
- Android UI性能优化 检测应用中的UI卡顿
本文已在我的公众号hongyangAndroid首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/58626355 本文出自 ...
- Android 系统性能优化(34)---Android UI 性能优化
Android官网 Slow rendering:个人觉得非常有价值,比如指出 对象分配.垃圾回收(GC).线程调度以及Binder调用 是Android系统中常见的卡顿原因,更重要的是给出了定位和解 ...
- Android UI性能优化
对于Android的UI性能优化,我一般从5个途径来分析: 1.Debug GPU overdraw; 2.Android CPU Profile: 3.dumpsys gfxinfo: 4.Prof ...
- Android UI性能优化详解
此文来自于MrPeak杂货铺,由于没法转载,只能贴这了,妄作者见谅:http://mrpeak.cn/android/2016/01/11/android-performance-ui 设计师,开发人 ...
- Android UI性能优化——ViewStub和Merge的使用
ViewStub的使用 简介 ViewStub 是一种没有任何维度的轻量型视图,它不会绘制任何内容或参与布局. ViewStub是一种没有大小,不占用布局的View. 直到当调用 inflate() ...
- android view绘制速度,关于android ui的优化 view 的绘制速度
关于如何优化activity的启动速度, view 的绘制速度, 可参考这个sdk里的文档. android-sdk-windows-1.5_r1/docs/resources/articles/wi ...
- [Android] Android开发优化之——对界面UI的优化(2)
在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的.界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局.通常,在这个页面中会用到很多 ...
- android的UI性能优化
设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的ap ...
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...
最新文章
- Linux Shell ssh登录脚本
- 程序员如何判断是否到了该辞职的时候?以及常用的辞职借口总结
- 平凡的世界和你我 (武惠良与杜丽丽)
- GridView行号大集合
- android sha1是签名么,Android获取SHA1和MD5签名
- python字符串数组_python将字符串转换成数组的方法
- 最短路计数(松弛操作处理)
- PXE+Kickstart无人值守安装操作系统
- Log4net PatternLayout 参数
- Excel中的常用快捷键
- Pytorch-NLU,一个中文文本分类、序列标注(实体识别、分词、词性标注)的极简工具包,基于pytorch与tramsforers
- codejock suite pro 20.2 for ActiveX
- Simulink代码生成应用教程
- 计算机网络工资如何计算,2019 税后工资计算器,能够准确算薪
- 财报发布前获多家投行认可,借商流+物流闭环效应达达估值可期
- Centos7.2安装搜狗拼音
- [Python从零到壹] 四十.图像处理基础篇之图像量化处理
- 【C语言--斐波拉契数列】
- linux定时每隔多少天,Linux中Cron任务间隔执行:每隔几分钟/几小时/几天
- 基于Python的超市管理系统毕业设计源码111042
热门文章
- 900万注释图像数据集升级了!谷歌开放Open Images V6,首增语音、文本、鼠标轨迹同步注释...
- 谷歌发布AdaNet,快速灵活的AutoML工具,帮助开发者构筑强大集成学习模型
- 择天记服务器维护中,择天记修仙正统
- android if else语句,Android一起执行IF和ELSE语句
- 自学Python能干些什么副业
- Github | 标星9W+如何准备谷歌面试?
- 解决pip安装pygal在TensorFlow环境下调用失败问题
- java获取页面点击次数_java计算鼠标点击次数的题,急求!
- 2021年下半年网络规划设计师下午真题及答案解析
- php千封邮件怎么快速发送,如何在PHP中无限制地发送数千封电子邮件?