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标签就可以了,在加载的时候会忽略掉这个标签,但是,,,,但是,,,,,但是,使用这个标签的时候又两个限制

  1. 只能作为布局文件的根布局来使用
  2. 在调用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)相关推荐

  1. Android 性能优化

    为什么80%的码农都做不了架构师?>>>    原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...

  2. Android性能优化系列 + Android官方培训课程中文版

    Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 http: ...

  3. Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)

    前言 当我们还在用按键.滑盖.翻盖手机的时候,全触屏手机来了; 当我们觉得二维码这项发明没有意义的时候,支付宝和微信等狠狠地给了我们响亮的耳光; 当我们以为扫码支付只有支付宝的时候,微信支付来了; 当 ...

  4. Android性能优化典范第二季

    原文链接:http://hukai.me/android-performance-patterns-season-2/ 1)Battery Drain and Networking 对于手机程序,网络 ...

  5. Android性能优化之渲染篇(一)

    前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...

  6. Android性能优化典范笔记(1)-GPU绘制性能优化

    Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...

  7. Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在 Android开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性.流畅性.稳定性等,是提高用户留存 ...

  8. Android性能优化

    Android性能优化 一.布局优化: 1.优化方式: 减少不必要嵌套,尽可能使用LinearLayout.ConstraintLayout等控件 减少颜色覆盖,子控件背景足够,不要在其父控件加颜色 ...

  9. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  10. 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )

    文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...

最新文章

  1. Ext2.0布局类初探
  2. [Head First设计模式]山西面馆中的设计模式——装饰者模式
  3. 助你打造纯键盘流系统——Launchy
  4. gethostbyname()函数说明
  5. 排序算法之——冒泡排序优化
  6. [silverlight基础]仿文字连接跑马灯效果-高手绕道
  7. 前端学习(2323):angular文件介绍
  8. 阿里云物联网边缘计算加载MQTT驱动
  9. 史上最全的前端开发面试题(含详细答案)
  10. nginx 小简单指令
  11. PAT (Basic Level) Practice 1006 换个格式输出整数
  12. 微信公众号用到的网站
  13. Atitti 编程语言高级 api 与高级知识 堆栈api 异常api Meta anno注解元数据api Ref 反射api Database meta api 字节码库如果你正在编写一个框架或者
  14. 有限元分析简单实例之平面矩形薄板(matlab)
  15. Deecamp20 项目提交【如何用pcdet(second)跑自己的数据】
  16. 计算机有线无线都无法上网,有线能上网无线不能上网 有线能用无线不能用
  17. JavaScript高级第04天笔记
  18. 台式计算机怎么强制关机,台式电脑怎么强制关机
  19. outlook 网页版使用公共邮箱发送邮件
  20. Verdi基础知识整理

热门文章

  1. Ogre源码在VS2008(VC9)中的配置方式
  2. 116.网络里的时延和带宽
  3. 我国将于今年春季发射空间站核心舱 空间站进入全面实施阶段
  4. 人工智能带来科技浪潮的同时,对相关法治领域提出了什么样的挑战?
  5. Qt Creator中常用快捷键和小技巧
  6. 苹果证实收购Drive.ai自动驾驶汽车初创公司
  7. error C2660: 'MessageBoxA' : function does not take 4 parameters
  8. 线程和进程有什么区别
  9. 原始尺寸_螺母尺寸检测,螺丝螺母外观检测设备
  10. fatal: unable to access : The requested URL returned error: 403