Android性能优化(3)
Android性能优化(3)
布局优化
在Android 开发过程中,其实有很大一部分工作量是在写布局上,布局写的好不好,直接影响用户的直观感受。如何做一个运行流畅,可靠,ui美观高效的app,狠重要
渲染
有个帧的概念先说一下,在数字世界,有由一定的帧来模拟真实事物的,有这么一个规律:在单位时间内,越多的帧被处理,我们看到的事物就越真实。10-20/帧/s是大脑感受最小的帧数,低于这个就真的成ptt了。
应用程序的运行过程中帧速率是最理想是60s(不清楚这个数据的出处,书上看到的)也就是说一帧刷新要在1/60s内完成,差不多是16ms的样子,what ???,当然这个再理论值,理想很丰满,现实很骨感,,,,
绘制流程(后来在网上找的,专门补充进来的):
附一个链接
Android App卡顿分析,以及使用Choreographer进行帧率统计监测感兴趣的可以看下,互为补充 -_-
一般是做不到的,比如说视图层级嵌套太多导致被重绘的次数太多,占用cpu的太多资源(为什么是cpu,不是都gup了吗???后面会说),如果和出现这种情况,这一帧被丢弃,ui界面不会更新,在下一帧被绘制之前,还是显示之前的图像。我们要做的就是避免此类情况的发生
上图,展示一下在**setContentView(int layoutId)的加载过程
顶层的DecorView,在主题为Activity设置背景,就是通过这玩意来显示的额,其实这个是多余的,这个默认的背景会被设置的布局文件所覆盖,我们要做的就是不让系统做这些无用功
注意
注意
注意
上代码
<resource><style name = "Theme.NoBackground" parent = "android.Theme"><item name = "android:windowBackground">@null</item></style>
</resource>
在清单文件里面为Activity设置主题,把上面的代码加上就行了
其实做完这些,你会发现没什么卵用,因为这不会对性能带来明显的改善。但还是建议这么做,性能优化东西,都是量变引起质变的
硬件加速
之前为什么说cup不说gpu了,在Android的版本演进过程中引入了硬件加速,分担一部分cpu的工作,所有视图的渲染以及canvas的绘制,都有gpu来完成,这个是在Android 3.0后引入的
其实现在说这个好像是在说废话,最开始这是一个可选择项,在清单文件里面可以开机硬件加速,但是在Android 4.0之后就默认开启了,不要你操心了。
在引入硬件加速之前,view的属性变化都需要重新绘制,硬件加速可以避免这个问题,因为发生变化的属性并不是view本身,而是图层中的那个对象。这些属性变化不会影响视图的层级结构
- aloha
- x
- y
- translationX
- translationY
- scaleX
- scaleY
- rotationX
- rotationY
- pivotX
- pivotY
看着是不是很熟悉,没错,就是属性动画
提高动画的性能,没说的!!!
上代码
view.setLayerType(View.LAYER_TYPE_HARDWARE,null);ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotationY",180);animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);view.setLayerType(View.LAYER_TYPE_NONE,null);}});animator.start();
注意:这个是在Android 6.0之前要干的事,之后就不用了,自适应硬件。这个是要适配低版本的要做的事
点9图片
在Android中,管理位图个管理点9图片的方式是不一样的,系统针对点9图片进行了特殊优化,在点9图片中,被其他视图所遮盖的部分,会被android 渲染成透明的,而透明的像素部分不会被系统渲染,背景图片使用点9图,可以在一定程度上减少过度绘制
布局复用
- include标签
这个标签其实对于开发者来说减少的只不过是Ctrl+C和Ctrl+V的次数而已,对于性能而言并没有多大帮助,依然是有层级的嵌套
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/chat_base_color"android:orientation="vertical"><include layout="@layout/account_infor_item"/><RelativeLayoutandroid:id="@+id/title_layout"android:layout_width="match_parent"android:layout_height="@dimen/d55"android:background="@color/base_color"android:orientation="horizontal"><ImageViewandroid:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_gravity="center_vertical"android:layout_marginLeft="@dimen/d10"android:padding="@dimen/d5"android:src="@mipmap/back" /><TextViewandroid:id="@+id/tv_chat_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_gravity="center"android:layout_marginLeft="@dimen/d10"android:layout_toRightOf="@id/back"android:gravity="center"android:text="@string/name"android:textColor="@color/white"android:textSize="@dimen/d20" /><ImageViewandroid:id="@+id/tv_chat_edit"android:layout_width="@dimen/d40"android:layout_height="@dimen/d40"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="@dimen/d10"android:scaleType="fitXY"android:src="@mipmap/group_icon"android:visibility="gone" /></RelativeLayout>
</LinearLayout>
就是这样。。。。
- merge标签
但是这个就不一样了,这玩意可以减少布局的允于,整体层级更加扁平,只要将复用布局文件的跟布局换成merge标签就可以了,在加载的时候会忽略掉这个标签,但是,,,,但是,,,,,但是,使用这个标签的时候又两个限制
- 只能作为布局文件的根布局来使用
- 在调用LayoutInflater.inflate()时,必须为merge布局文件提供一个view,作为他的父容器
LayoutInflater.from(context).inflate(R.layout.merge_layout,parent,true)
- viewstub标签
这个就比较厉害了,这东西可以作为一个节点,被添加到布局文件中,它关联着一个布局文件,知道运行时,才会被绘制,
<?xml version="1.0" encoding="utf-8"?>
<ViewStub xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout="@layout/activity_main">
</ViewStub>
上面布局所关联的布局并不会被实例化,直到程序运行期间调用了这些方法
- findviewbyid(R.id.viewstub).setVisibility(View.VISIBLE)
或者
- findviewbyid(R.id.viewstub).inflate()
一旦viewstub变为visible或者被加载,便不可以再用。以为他在布局层级中的位置被实例化出来的布局代替了。
这货很有用,在面对比较复杂的布局层级是,我们可以使用ViewStub延迟部分view的加载,缩短首次加载的时间,减少一些不必要的内存分配。
好了,这篇就到这了,下篇接着再写。。。。。
转载于:https://www.cnblogs.com/sunjiandev/p/9407710.html
Android性能优化(3)相关推荐
- Android 性能优化
为什么80%的码农都做不了架构师?>>> 原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...
- Android性能优化系列 + Android官方培训课程中文版
Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 http: ...
- Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)
前言 当我们还在用按键.滑盖.翻盖手机的时候,全触屏手机来了; 当我们觉得二维码这项发明没有意义的时候,支付宝和微信等狠狠地给了我们响亮的耳光; 当我们以为扫码支付只有支付宝的时候,微信支付来了; 当 ...
- Android性能优化典范第二季
原文链接:http://hukai.me/android-performance-patterns-season-2/ 1)Battery Drain and Networking 对于手机程序,网络 ...
- Android性能优化之渲染篇(一)
前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...
- Android性能优化典范笔记(1)-GPU绘制性能优化
Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...
- Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...
2019独角兽企业重金招聘Python工程师标准>>> 前言 在 Android开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性.流畅性.稳定性等,是提高用户留存 ...
- Android性能优化
Android性能优化 一.布局优化: 1.优化方式: 减少不必要嵌套,尽可能使用LinearLayout.ConstraintLayout等控件 减少颜色覆盖,子控件背景足够,不要在其父控件加颜色 ...
- Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿
原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...
- 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...
最新文章
- Ext2.0布局类初探
- [Head First设计模式]山西面馆中的设计模式——装饰者模式
- 助你打造纯键盘流系统——Launchy
- gethostbyname()函数说明
- 排序算法之——冒泡排序优化
- [silverlight基础]仿文字连接跑马灯效果-高手绕道
- 前端学习(2323):angular文件介绍
- 阿里云物联网边缘计算加载MQTT驱动
- 史上最全的前端开发面试题(含详细答案)
- nginx 小简单指令
- PAT (Basic Level) Practice 1006 换个格式输出整数
- 微信公众号用到的网站
- Atitti 编程语言高级 api 与高级知识 堆栈api 异常api Meta anno注解元数据api Ref 反射api Database meta api 字节码库如果你正在编写一个框架或者
- 有限元分析简单实例之平面矩形薄板(matlab)
- Deecamp20 项目提交【如何用pcdet(second)跑自己的数据】
- 计算机有线无线都无法上网,有线能上网无线不能上网 有线能用无线不能用
- JavaScript高级第04天笔记
- 台式计算机怎么强制关机,台式电脑怎么强制关机
- outlook 网页版使用公共邮箱发送邮件
- Verdi基础知识整理
热门文章
- Ogre源码在VS2008(VC9)中的配置方式
- 116.网络里的时延和带宽
- 我国将于今年春季发射空间站核心舱 空间站进入全面实施阶段
- 人工智能带来科技浪潮的同时,对相关法治领域提出了什么样的挑战?
- Qt Creator中常用快捷键和小技巧
- 苹果证实收购Drive.ai自动驾驶汽车初创公司
- error C2660: 'MessageBoxA' : function does not take 4 parameters
- 线程和进程有什么区别
- 原始尺寸_螺母尺寸检测,螺丝螺母外观检测设备
- fatal: unable to access : The requested URL returned error: 403