Android架构Android之性能优化

Android性能优化:绘制优化

2018-12-27  本文已影响60人  ZebraWei

版权声明:本文为Carson_Ho原创文章,转载请注明出处!

目录
一、影响的性能

绘制性能的好坏 主要影响:Android应用中的页面显示速度

二、如何影响性能

绘制影响Android性能的实质:页面的绘制时间。
1个页面通过递归 完成测量&绘制过程

三、优化思路

主要优化方向是:

四、优化思路

具体如下:

4.1.降低View.onDraw()的复杂度
4.1.1 onDraw()中不要创建新的局部对象 4.1.2 避免onDraw()执行大量 & 耗时操作 4.2避免过度绘制(Overdraw)
4.2.1 过度绘制的简介
4.2.2 过度绘制的表现形式
过度绘制 会导致屏幕显示的色块不同,具体如下 附:示例说明 4.2.3 过度绘制的优化原则
很多过度绘制是难以避免的,如上述实例的文字&背景导致的过度绘制;只能尽可能避免过度绘制:

4.2.4优化方案

优化方案1: 移除默认的Window背景

// 方式1:在应用的主题中添加如下的一行属性
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 或者 -->
<item name="android:windowBackground">@null</item>

// 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除
getWindow().setBackgroundDrawable(null);
<!-- 或者 -->
getWindow().setBackgroundDrawableResource(android.R.color.transparent);

优化方案2:移除控件中不必要的背景
如2个常见场景:

 @Override
protected boolean drawChild(Canvas canvas, View child, long drawingTim
// ...仅贴出关键代码

    // 1. 遍历 DrawerLayout 的 child view,拿到抽屉布局
    for (int i = 0; i < childCount; i++) {
        final View v = getChildAt(i);
        if (v == child || v.getVisibility() != VISIBLE
                || !hasOpaqueBackground(v) || !isDrawerView(v)
                || v.getHeight() < height) {
            continue;
        }
        // a. 若是左抽屉布局
        // 则取抽屉布局的右边界作为裁剪区的左边界、设置原主布局的裁剪区域,如上图裁剪区域
        if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) {
            final int vright = v.getRight();
            if (vright > clipLeft) clipLeft = vright;
        // b. 若是右抽屉布局
        // 则取抽屉布局的左边界作为裁剪区的右边界、设置原主布局的裁剪区域
        } else {
            final int vleft = v.getLeft();
            if (vleft < clipRight) clipRight = vleft;
        }
    }
    // 2. 通过clipRect()设置原主布局的显示范围 = 裁剪区域,使其仅在上图中的红框区域(即不阻碍抽屉布局的区域)显示
   // 从而避免过度绘制
    canvas.clipRect(clipLeft, 0, clipRight, getHeight());
}
......                       
}

5.1Hierarchy Viewer

上一篇下一篇

猜你喜欢

热点阅读