Android开发之布局优化

Android Jetpack 实战:优化移动开发的布局性能 在当今竞争激烈的移动应用市场中,用户对应用的响应速度和流畅度有着极高的要求。布局性能作为影响应用整体性能的关键因素之一,直接关系到用户体验。本文章的目的在于深入探讨如何利用 Android Jetpack 这一强大的工具集来优化移动开发中的布局性能。范围涵盖了 Android Jetpack 中与布局相关的主要组件,包括但不限于 ViewBinding、Compose 等,通过理论分析和实际案例展示,为开发者提供全面的布局性能优化解决方案。 阅读详情

1、抽象布局标签 

(1) <include>标签
include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化,这在布局编写方便提供了大大的便利。
下面以在一个布局main.xml中用include引入另一个布局foot.xml为例。main.mxl代码如下:

其中include引入的foot.xml为公用的页面底部,代码如下:

<include>标签唯一需要的属性是layout属性,指定需要包含的布局文件。可以定义android:id和android:layout_*属性来覆盖被引入布局根节点的对应属性值。注意重新定义android:id后,子布局的顶结点i就变化了。

 

(2) <viewstub>标签
viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等。
下面以在一个布局main.xml中加入网络错误时的提示页面network_error.xml为例。main.mxl代码如下:

其中network_error.xml为只有在网络错误时才需要显示的布局,默认不会被解析,示例代码如下:

在java中通过(ViewStub)findViewById(id)找到ViewStub,通过stub.inflate()展开ViewStub,然后得到子View,如下:

在上面showNetError()中展开了ViewStub,同时我们对networkErrorView进行了保存,这样下次不用继续inflate。这就是后面第三部分提到的减少不必要的infalte。

viewstub标签大部分属性同include标签类似。

 

上面展开ViewStub部分代码

也可以写成下面的形式

效果一致,只是不用显示的转换为ViewStub。通过viewstub的原理我们可以知道将一个view设置为GONE不会被解析,从而提高layout解析速度,而VISIBLE和INVISIBLE这两个可见性属性会被正常解析。

 

(3) <merge>标签
在使用了include后可能导致布局嵌套过多,多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可通过hierarchy viewer(下面布局调优工具中有具体介绍)或设置->开发者选项->显示布局边界查看。

 

merge标签可用于两种典型情况:
a.  布局顶结点是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity内容试图的parent view就是个FrameLayout,所以可以用merge消除只剩一个。
b.  某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中。

以(1) <include>标签的示例为例,用hierarchy viewer查看main.xml布局如下图:

android include
可以发现多了一层没必要的RelativeLayout,将foot.xml中RelativeLayout改为merge,如下:

运行后再次用hierarchy viewer查看main.xml布局如下图:

android include2

这样就不会有多余的RelativeLayout节点了。

 

2、去除不必要的嵌套和View节点
(1) 首次不需要使用的节点设置为GONE或使用viewstub
(2) 使用RelativeLayout代替LinearLayout
大约在Android4.0之前,新建工程的默认main.xml中顶节点是LinearLayout,而在之后已经改为RelativeLayout,因为RelativeLayout性能更优,且可以简单实现LinearLayout嵌套才能实现的布局。
4.0及以上Android版本可通过设置->开发者选项->显示布局边界打开页面布局显示,看看是否有不必要的节点和嵌套。4.0以下版本可通过hierarchy viewer查看。

 

3、减少不必要的infalte
(1) 对于inflate的布局可以直接缓存,用全部变量代替局部变量,避免下次需再次inflate
如上面ViewStub示例中的

 

(2) ListView提供了item缓存,adapter getView的标准写法,如下:

关于ListView缓存原理可见Android ListView缓存机制。

 

4、其他点
(1) 用SurfaceView或TextureView代替普通View

SurfaceView或TextureView可以通过将绘图操作移动到另一个单独线程上提高性能。
普通View的绘制过程都是在主线程(UI线程)中完成,如果某些绘图操作影响性能就不好优化了,这时我们可以考虑使用SurfaceView和TextureView,他们的绘图操作发生在UI线程之外的另一个线程上。
因为SurfaceView在常规视图系统之外,所以无法像常规试图一样移动、缩放或旋转一个SurfaceView。TextureView是Android4.0引入的,除了与SurfaceView一样在单独线程绘制外,还可以像常规视图一样被改变。

 

(2) 使用RenderJavascript
RenderScript是Adnroid3.0引进的用来在Android上写高性能代码的一种语言,语法给予C语言的C99标准,他的结构是独立的,所以不需要为不同的CPU或者GPU定制代码代码。

 

(3) 使用OpenGL绘图
Android支持使用OpenGL API的高性能绘图,这是Android可用的最高级的绘图机制,在游戏类对性能要求较高的应用中得到广泛使用。
Android 4.3最大的改变,就是支持OpenGL ES 3.0。相比2.0,3.0有更多的缓冲区对象、增加了新的着色语言、增加多纹理支持等等,将为Android游戏带来更出色的视觉体验。

 

(4) 尽量为所有分辨率创建资源

减少不必要的硬件缩放,这会降低UI的绘制速度,可借助Android asset studio

 

5、布局调优工具
(1) hierarchy viewer

hierarchy viewer可以方便的查看Activity的布局,各个View的属性、measure、layout、draw的时间,如果耗时较多会用红色标记,否则显示绿色。
hierarchy viewer.bat位于<sdk>/tools/目录下。使用可见:Using Hierarchy Viewer , 示例图如下:

android hierarechy viewer

 

(2) layoutopt
layoutopt是一个可以提供layout及其层级优化提示的命令行,在sdk16以后已经被lint取代,在Windows->Show View->Other->Android->Lint Warnings查看lint优化提示

Android开发:布局优化与适配技巧 本文根据《Android Developer Fundamentals Course (V2) – Unit 1》内容,介绍了如何使用Android Studio的布局编辑器进行布局优化和设备适配。通过创建不同方向和设备尺寸的布局变体,以及修改属性来确保应用界面在各种设备上都能提供良好的用户体验。 阅读详情

相关推荐

Android开发基础:布局与输入类型优化

本篇博客文章旨在探讨Android开发者基础课程中的布局和输入类型管理。通过详细解析教材内容,我们将了解到如何使用XML布局文件定义界面元素,以及如何通过不同的inputType属性优化用户输入体验。

weixin_30415591的博客 355

Android性能优化系列之布局优化

我们注意看注释5处,这里就解释了为什么include标签和被引入的布局的根元素都设置了id的情况下,通过被引入的根元素的id来查找子控件会找不到的情况。我们看到,注释5处的会判断include标签的id如果不是View.NO_ID的话会把该id设置给被引入的布局根元素的id,即此时在我们的例子中被引入的id为my_foot_parent_id的根元素RelativeLayout的id被设置成了include标签中的id,即RelativeLayout的id被动态修改成了”my_foot_ly”。

Gaga246的博客 2176

Android开发:布局、资源与交互的优化实践

本文深入探讨了在Android开发中优化布局、资源管理以及用户交互的多种实践技巧。我们学习了如何利用`match_parent`和`wrap_content`属性来控制视图的尺寸,以及如何通过使用字符串资源和尺寸资源文件来管理应用中的文本和尺寸。此外,本文还演示了如何通过XML和编程方式为按钮添加点击事件处理器,并实现用户交互功能。

weixin_35307279的博客 324

一篇文章搞定《Android布局优化》

Android的绘制优化其实可以分为两个部分,即布局(UI)优化和卡顿优化,而布局优化的核心问题就是要解决因布局渲染性能不佳而导致应用卡顿的问题,所以它可以认为是卡顿优化的一个子集。本文主要包括以下内容: 1. 为什么要进行布局优化及android绘制,布局加载原理 2. 获取布局文件加载耗时的方法 3. 介绍一些布局优化的手段与方法

小孟来码的博客 8411

Android应用开发:优化平板电脑界面布局

本文详细介绍在Android Developer Fundamentals Course (V2) – Unit 1中关于为平板电脑优化布局的内容。从移除布局约束、调整组件尺寸到使用基线约束和水平扩展按钮,直至最终调整布局方向,为平板电脑用户呈现最佳界面体验。

weixin_28888459的博客 559

文华财经公式编程:麦语言简介及基础语法

文华财经公式语言(麦语言)是一种专门用于金融领域的编程语言,它是由文华财经公司开发的。提供了丰富的金融计算函数和数据处理功能,可以用于金融市场的数据分析、模型建立和交易策略的开发。例1:A:CLOSE;// 定义变量A为收盘价(盘中k线没有走完的时候A为最新价)。例2:MA5:=MA(C,5);// 定义收盘价的5周期均线(C为CLOSE简写)。例3:A:=REF(C,1);// 取得前一根k线的收盘价。

超哥量化的博客 1万+

常用Android布局文件优化技巧总结

Android 布局加载是 Android 应用程序的重要组成部分。布局加载是指将 XML 文件中定义的视图层次结构加载到内存中。在这篇文章中,我们将深入探讨 Android 布局加载的原理,包括 Android 布局文件的结构、布局文件的解析过程、布局文件的优化和布局文件的常见问题等方面。

xiaokangss的博客 1156

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 833

Constrained Graphic Layout Generation via Latent Optimization(2021)

[Paper] Constrained Graphic Layout Generation via Latent Optimization [Code] ktrk115/const_layout 通过潜在优化生成约束图形布局 摘要 在平面设计中,人类根据设计意图和语义在视觉上排列各种元素是很常见的。例如,标题文本几乎总是出现在文档中其他元素的顶部。在这项工作中,我们生成的图形布局可以灵活地结合这种设计语义,无论是由用户隐式指定还是明确指定。我们使用现成的布局生成模型的潜在空间进行优化,允许我们的方法与现有

studyeboy的专栏 3067

SkyWalking跨线程Trace传递实战:手把手教你用RunnableWrapper解决异步链路中断问题

本文深入解析了SkyWalking在异步编程场景下链路追踪中断的根源,并提供了使用RunnableWrapper等官方包装类的实战解决方案。通过详细的原理解析和代码示例,手把手指导开发者如何实现跨线程的Trace传递,确保分布式系统监控链路的完整性,有效解决异步任务导致的链路中断问题。

sand8的博客 495

Ubuntu 22.04下Nvidia显卡驱动安装全攻略:从PPA源到避坑指南

本文详细介绍了在Ubuntu 22.04系统下安装Nvidia显卡驱动的完整流程,包括PPA源的使用、旧驱动清理、安装后验证及常见问题解决方案。特别针对机器学习开发者和图形设计师,提供了从基础安装到性能调优的全方位指南,帮助用户避免常见安装陷阱并优化GPU性能。

weixin_29213655的博客 382

android 优化那些事之布局(一)

邮箱:zz7zz7zz@163.com微博:http://weibo.com/u/3209971935

if(...){...} 2634

C-08-实战:搭建一个AI客服机器人(接入微信企微)

客服是一人公司最大的时间杀手。本文教你搭建一个AI客服机器人,能自动回答80%的常见问题,只把复杂问题转给人工。含微信公众号和企业微信接入完整代码。

Johnny2004的专栏 88

Android开发中的UI布局优化

本文从布局层次优化、布局文件优化和用户体验优化三个方面详细阐述了Android开发中的UI布局优化。通过合理使用布局容器、减少布局嵌套、使用布局别名、提高布局渲染性能和减少布局层次等方法,可以有效提升应用性能和用户体验。优化UI布局对于Android应用的开发至关重要。开发者应根据实际情况,灵活运用各种优化策略,以提高应用的受欢迎程度和用户满意度。在未来,随着Android技术的不断发展,UI布局优化将继续成为开发者关注的焦点。我们建议开发者持续关注新技术和最佳实践,不断提升自己的开发能力。

2501_92489088的博客 401

MCAL中MCU的配置

MCAL配置中MCU配置,PLL计算配置,系统时钟以及各模块参数配置

dhyw12399999的博客 3794

RFC 字符码转换深度解析:Unicode、非 Unicode 与 MDMP 系统的协奏

老版本 MDMP 系统不上传自定义映射时,Unicode 端会落回“预配置列表”。列表里可见西欧 1100、日文 8000、中文 8400 等经典编号。若需强制覆写映射,可在 SM59 ➡Unicode页签启用,或直接勾选作为兜底。字符编码问题常“潜伏”多年,一旦旧系统升级或新增语种便集中爆发。掌握 RFC code page 转换机理、灵活运用 SM59 选项、在早期对 LANG 字段和字段长度进行治理,是根治乱码与 short dump 的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

Android开发 布局优化

在开发过程中我们经常说性能优化,但性能优化是一个比较宽泛的概念。在Android开发中性能优化可能包括:Java代码优化, 算法优化, SQLite优化, 布局优化等。那么这篇博客就来总结并分享下Android开发中的布局优化。 布局原则 在Android UI布局过程中,通过遵守一些惯用、有效的布局原则,我们可以制作出高效且复用性高的UI,概括来说包括如下几点: 尽量多使用

SunshineBoy的博客 376

【TRAE调教指南之MCP篇】构建高效AI编程的七大MCP服务配置实战

【TRAE调教指南之MCP篇】构建高效AI编程的七大MCP服务配置实战

funfan的博客 2775

android布局性能,Android开发——布局性能优化的一些技巧(一)

0.前言上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高,意义在于分析了这两种布局的实现源码,算是对一个小结论的证明过程,但是对布局性能的优化效果,对这两种布局的选择远不如减少布局层级、避免过分绘制、按需加载等1.标签可以在一个布局中引入另外一个布局,通常适合于界面布局复杂、不同界面有共用布局的APP中,比如顶部布局、侧边栏布局、底部Tab栏布局、ListVi...

weixin_32446549的博客 301

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

浅谈Android样式开发之布局优化

引言   今天我们来谈一下Android中布局优化常用的一些手段。官方给出了3种优化方案,分别是</include>、</viewstub>、</merge>标签,下面我们就来介绍这些标签。 include标签   include标签能够重用布局文件,我们在开发中经常有一些布局是通用的,比如每一个页面的头部和尾部,我们可以将其分离到独立的文件中,...

diezhi2505的博客 138

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

布局性能优化:安卓开发者不可错过的性能优化技巧_手机厂商的布局加载优化(2)

1.减少布局层次布局层次越深,绘制所需的时间就越长,因此应该尽可能减少布局层次。可以通过使用 ConstraintLayout 或者自定义 View 来减少布局层次。2.使用合适的布局容器应该选择最适合当前布局需求的布局容器,避免使用过于复杂的布局容器,比如 LinearLayout 嵌套多层、RelativeLayout 的多重嵌套等。3.使用 ViewStub 来延迟加载视图如果布局中包含复杂的视图,可以考虑使用 ViewStub 来延迟加载这些视图,以减少布局的加载时间。

2401_83739821的博客 1055

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android XML布局开发指南:从基础到性能优化

XML布局是Android UI开发的核心技术,通过声明式语法实现界面与逻辑的分离。其工作原理是将视图层级结构转化为View对象树,具有可视化编辑、多设备适配和维护便捷等技术优势。在工程实践中,LinearLayout、RelativeLayout和ConstraintLayout是最常用的三种布局方式,其中ConstraintLayout凭借其扁平化结构和约束关系,能有效解决嵌套层级过深导致的性能问题。热门的布局复用技术如include标签和ViewStub,配合尺寸限定符等适配方案,能够显著提升开发效率

weixin_30437847的博客 465

Android开发:简述Android布局优化的方法

Android开发:简述Android布局优化的方法 作为android应用来讲,无论应用本身多么美观,功能多么强大,内容多么丰富。但如果App本身打开界面缓慢超过手机16ms刷新一次页面的时间,就会产生卡顿。用户体验都会变得极差,导致用户量减少。所以我们在开发过程中同样要注重布局优化。 1. &lt; include &gt;标签 在Layout布局中如果有你想要引用的布局时,若该布局在不同的...

王小二(海阔天空) 749

Android开发布局优化之ViewStub,include,merge标签详解

这里引入一位大神的博客

yaoyaoyao_123的博客 218

android开发之布局优化之include、ViewStub、merge使用与源码分析

在开发中UI布局是我们都会遇到的问题,随着UI越来越多,布局的重复性、复杂度也会随之增长。Android官方给了几个优化的方法,但是网络上的资料基本上都是对官方资料的翻译,这些资料都特别的简单,经常会出现问题而不知其所以然。这篇文章就是对这些问题的更详细的说明,也欢迎大家多留言交流。一、include概述:首先用得最多的应该是include,按照官方的意思,include就是为了解决重复定义相同布局

ZaneLove's blog 1075
上一篇: Android开发之style属性和预定义样式
下一篇: 项目管理之设计和开发者如何成为好基友
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值