关于如何优化activity的启动速度, view 的绘制速度, 可参考这个sdk里的文档。 android-sdk-windows-1.5_r1/docs/resources/articles/window-bg-speed.html。

看完后你就知道 android:windowBackground 太重要了,影响到绘制效率。

这里要说的是另外一点, 不是这个windowBackground 。

android 为了提高滚动等各方面的绘制速度,可以为每一个view建立一个缓存,使用 View.buildDrawingCache为自己的view 建立相应的缓存,

这个所谓的缓存,实际上就是一个Bitmap对象。只是 这个 bitmap 对象可以有多种格式而已,如

Bitmap.Config.ARGB_8888;

Bitmap.Config.ARGB_4444;

Bitmap.Config.ARGB_8888;

Bitmap.Config.ARGB_8888;

Bitmap.Config.RGB_565;

默认的格式是Bitmap.Config.ARGB_8888.,但大多数嵌入式设备使用的显示格式都是Bitmap.Config.RGB_565. 对于后者, 并没有

alpha 值,所以绘制的时候不需要计算alpha合成,速递当让快些。其次,RGB_565可以直接使用优化了的memcopy函数,效率相对高出许多。

所以, 在用buildDrawingCache建立缓存时, 可以使用RGB_565格式。但是如何制定这个格式呢 ?buildDrawingCache有两个版本,     buildDrawingCache(boolean) 和 buildDrawingCache()。并没有任何参数可以设置rgb格式,看看源码先:

public void buildDrawingCache(boolean autoScale) {

if ((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || (autoScale ?

(mDrawingCache == null || mDrawingCache.get() == null) :

(mUnscaledDrawingCache == null || mUnscaledDrawingCache.get() == null))) {

if (ViewDebug.TRACE_HIERARCHY) {

ViewDebug.trace(this, ViewDebug.HierarchyTraceType.BUILD_CACHE);

}

if (Config.DEBUG && ViewDebug.profileDrawing) {

EventLog.writeEvent(60002, hashCode());

}

int width = mRight - mLeft;

int height = mBottom - mTop;

final AttachInfo attachInfo = mAttachInfo;

final boolean scalingRequired = attachInfo != null && attachInfo.mScalingRequired;

if (autoScale && scalingRequired) {

width = (int) ((width * attachInfo.mApplicationScale) + 0.5f);

height = (int) ((height * attachInfo.mApplicationScale) + 0.5f);

}

final int drawingCacheBackgroundColor = mDrawingCacheBackgroundColor;

final boolean opaque = drawingCacheBackgroundColor != 0 ||

(mBGDrawable != null && mBGDrawable.getOpacity() == PixelFormat.OPAQUE);

if (width <= 0 || height <= 0 ||

(width * height * (opaque ? 2 : 4) > // Projected bitmap size in bytes

ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {

destroyDrawingCache();

return;

}

boolean clear = true;

Bitmap bitmap = autoScale ? (mDrawingCache == null ? null : mDrawingCache.get()) :

(mUnscaledDrawingCache == null ? null : mUnscaledDrawingCache.get());

if (bitmap == null || bitmap.getWidth() != width || bitmap.getHeight() != height) {

Bitmap.Config quality;

if (!opaque) {

switch (mViewFlags & DRAWING_CACHE_QUALITY_MASK) {

case DRAWING_CACHE_QUALITY_AUTO:

quality = Bitmap.Config.ARGB_8888;

break;

case DRAWING_CACHE_QUALITY_LOW:

quality = Bitmap.Config.ARGB_4444;

break;

case DRAWING_CACHE_QUALITY_HIGH:

quality = Bitmap.Config.ARGB_8888;

break;

default:

quality = Bitmap.Config.ARGB_8888;

break;

}

} else {

quality = Bitmap.Config.RGB_565;

}

// Try to cleanup memory

if (bitmap != null) bitmap.recycle();

try {

bitmap = Bitmap.createBitmap(width, height, quality);

bitmap.setDensity(getResources().getDisplayMetrics().densityDpi);

if (autoScale) {

mDrawingCache = new SoftReference(bitmap);

} else {

mUnscaledDrawingCache = new SoftReference(bitmap);

}

} catch (OutOfMemoryError e) {

// If there is not enough memory to create the bitmap cache, just

// ignore the issue as bitmap caches are not required to draw the

// view hierarchy

if (autoScale) {

mDrawingCache = null;

} else {

mUnscaledDrawingCache = null;

}

return;

}

clear = drawingCacheBackgroundColor != 0;

}

Canvas canvas;

if (attachInfo != null) {

canvas = attachInfo.mCanvas;

if (canvas == null) {

canvas = new Canvas();

}

canvas.setBitmap(bitmap);

// Temporarily clobber the cached Canvas in case one of our children

// is also using a drawing cache. Without this, the children would

// steal the canvas by attaching their own bitmap to it and bad, bad

// thing would happen (invisible views, corrupted drawings, etc.)

attachInfo.mCanvas = null;

} else {

// This case should hopefully never or seldom happen

canvas = new Canvas(bitmap);

}

if (clear) {

bitmap.eraseColor(drawingCacheBackgroundColor);

}

computeScroll();

final int restoreCount = canvas.save();

if (autoScale && scalingRequired) {

final float scale = attachInfo.mApplicationScale;

canvas.scale(scale, scale);

}

canvas.translate(-mScrollX, -mScrollY);

mPrivateFlags |= DRAWN;

// Fast path for layouts with no backgrounds

if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {

if (ViewDebug.TRACE_HIERARCHY) {

ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);

}

mPrivateFlags &= ~DIRTY_MASK;

dispatchDraw(canvas);

} else {

draw(canvas);

}

canvas.restoreToCount(restoreCount);

if (attachInfo != null) {

// Restore the cached Canvas for our siblings

attachInfo.mCanvas = canvas;

}

mPrivateFlags |= DRAWING_CACHE_VALID;

}

}

看完后明白了,至少跟两个因素有关 drawingCacheBackgroundColor 和 mBGDrawable.

用setDrawingCacheBackgroundColor(0xffff0000)设置为 非默认颜色后,建立的缓存就是rgb565了,可以用下列方法验证一下:

final Bitmap cache = mContent.getDrawingCache();

if (cache != null) {

Config cfg = cache.getConfig();

Log.d(TAG, "----------------------- cache.getConfig() = " + cfg);

android view绘制速度,关于android ui的优化 view 的绘制速度相关推荐

  1. Android UI性能优化 检测应用中的UI卡顿

    本文已在我的公众号hongyangAndroid首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/58626355 本文出自 ...

  2. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )

    文章目录 一. GPU 过度绘制优化总结 二. CPU 渲染过程 三. CPU 渲染性能调试工具 Layout Inspector 四. Layout Inspector 组件树 DecorView ...

  3. Android绘制竖直虚线完美解决方案—自定义View

    Android绘制竖直虚线完美解决方案-自定义View 开发中我们经常会遇到绘制虚线的需求,一般我们使用一个drawable文件即可实现,下面我会先列举常规drawable文件的实现方式. 使用dra ...

  4. Android Canvas 绘制基本形状 Android自定义View(七)

    1 缩略图 2 绘制颜色 // 传入一个Color类的常量参数来设置画布颜色// 绘制蓝色canvas.drawColor(Color.BLUE); 3 绘制点(drawPoint) 在某个坐标处绘制 ...

  5. android高仿天天动听,Android仿天天动听歌曲自动滚动view

    最近项目中要做一个类似天天动听歌曲自动滚动行数的效果.首先自己想了下Android要滚动的那就是scroller类或者scrollto.scrollby结合了,或者view.layout()方法,或者 ...

  6. android的UI性能优化

    设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的ap ...

  7. Android UI性能优化

    对于Android的UI性能优化,我一般从5个途径来分析: 1.Debug GPU overdraw; 2.Android CPU Profile: 3.dumpsys gfxinfo: 4.Prof ...

  8. Android UI性能优化——ViewStub和Merge的使用

    ViewStub的使用 简介 ViewStub 是一种没有任何维度的轻量型视图,它不会绘制任何内容或参与布局. ViewStub是一种没有大小,不占用布局的View. 直到当调用 inflate() ...

  9. android通过代码设置铃声_Android基础(5)—自定义View

    自定义View 基本认知: 虽然Android已经自带来很多强大的UI控件,但是依旧不能满足所有开发人员的需求.通常开发人员需要实现设计师精心设计的视觉效果,这样情况下可能现有的控件就不能满足需求或者 ...

最新文章

  1. Strategy_Requirement2
  2. “人工智能治理公共服务平台”在2020年中关村论坛发布
  3. trigger() --工作中问题nav样式
  4. 敏捷软件开发实践-Sprint Setup Meeting
  5. 接口自动化测试系列(三):深入分析HTTP状态码400
  6. oracle export命令使用浅解,Oracle Export命令使用浅解
  7. vba搜索java里面的sql_Excel VBA+SQL 代替Vlookup精确查找
  8. jaeger client java_Uber工程团队的开源分布式追踪系统Jaeger(java实现)
  9. react http请求_React组件的应用分析
  10. Java的static关键字使用
  11. 2021软考资料汇总:历年真题/学习手册/学习计划/考试大纲等资料
  12. ext4文件系统数据恢复的方法总结
  13. Android系统启动之BOOT_COMPLETED广播
  14. 课程预约小程序开发需要哪些功能?
  15. 算法设计技巧与分析(六):图遍历(Graph Traversal)
  16. Linux是什么?它是哪个国家开发的
  17. 基于Mapbox实现地图的样式配置
  18. JSON-Study
  19. httpclient3.1的relaseConnection的misunderstand
  20. 【BZOJ3456】【CDQ分治+FNT】城市规划

热门文章

  1. BlocksKit源码分析(一)
  2. Server SAN:弄潮儿云计算时代
  3. 《货币战争》的一点感想
  4. [转载] python下载安装教程
  5. [转载] 生成对角矩阵 numpy.diag
  6. quatus ii------调试利器 SignalTap II简介(基于TIGER BOARD 板子)
  7. JSON.stringify的三个参数(转载)
  8. ArcGIS Engine开发基础总结(一)
  9. 浅析 JNDI / DataSource / ConnectionPool 三者
  10. 维护个人品牌,放大自我价值