View DrawingCacheに対する理解
12292 ワード
回転:http://blog.sina.com.cn/s/blog_5 da93 c 8 f 01106 bb.Viewコンポーネントに表示されている内容はcache機構でbitmapとして保存できます。使用されているappiはvoid setDrawindgCacheEnaaboled、Bitmap getDrawingCache、void buildDrattttttCachee、vogCachewittCacheeeewittCache、vocheeewindcache、vochewittttCacheeeeeeeeeewittCache、votCachewin、vocache、vochewindsccheeeeeeeeeeewin、vottCachee開けます。そしてgetDrawingCacheを呼び出して、viewのcache画像を得ることができます。buildDrawingCacheメソッドは、getDra wingCacheメソッドを呼び出したとき、もしcacheが確立されていないなら、システムは自動的にbuildDrawingCacheメソッドを呼び出してcacheを生成することができます。もしcacheを更新するなら、destoryDrawingCache方法を呼び出して古いcacheを廃棄しなければならないならば、新しいのを創立することができません。setDrawingCacheEnbaledメソッドを呼び出すとfalseに設定され、システムは自動的に元のcacheを破壊します。View Groupはサブビューを描く時に、それ以外に二つの方法を提供しました。void set Children DrawingCacheEnabled setChild ren Drawn WithCachevaledを開いたら、ViewgroupのすべてのEnteweetを描画できます。そのcacheを使って、描画時間を節約します。cacheを取得するには通常一定のメモリを占有しますので、必要でない場合は整理する必要があります。destroyDrawingCacheまたはsetDrawingCacheEnbled(false)を通じて実現します。Android uiの最適化viewの描画速度について、activityの起動速度を最適化するには、viewの描画速度は、このsdk内のドキュメントを参照してください。android-sdk-windows-1.5_r 1/docs/resource/articales/window-bg-speed.
見終わったら、Android:window Backgroundが重要すぎて、制作効率に影響します。
ここで言うのはもう一つのポイントです。このwindow Backgroundではありません。
androidはスクロールなどの各方面の描画速度を高めるために、各viewのためにキャッシュを作り、View.buildDrawingCacheを使って自分のviewのために相応のキャッシュを作ります。
キャッシュとは、実はBitmapオブジェクトのことです。ただこのbitmapオブジェクトは多様なフォーマットがあります。
アルファ値ですので、描画する時はアルファ合成を計算する必要はありません。次に、RGB_565は、最適化されたmemcopy関数を直接使用することができ、効率は比較的高い。
ですから、BildDrawingCacheでキャッシュを作る時には、RGB_を使うことができます。565フォーマットです。このフォーマットはどうやって作りますか?buildDrawingCacheには二つのバージョンがあります。buildDra wingCacheとbuildDrawingCache()。何のパラメータも設定できません。ソースを見てください。
setDrawingCacheBackground Color(0 xffff0000)を非デフォルト色に設定した後、確立されたキャッシュはrgb 565です。以下の方法で検証できます。
見終わったら、Android:window Backgroundが重要すぎて、制作効率に影響します。
ここで言うのはもう一つのポイントです。このwindow Backgroundではありません。
androidはスクロールなどの各方面の描画速度を高めるために、各viewのためにキャッシュを作り、View.buildDrawingCacheを使って自分のviewのために相応のキャッシュを作ります。
キャッシュとは、実はBitmapオブジェクトのことです。ただこのbitmapオブジェクトは多様なフォーマットがあります。
Bitmap.Config.ARGB_8888;
Bitmap.Config.ARGB_4444;
Bitmap.Config.RGB_565;
デフォルトのフォーマットはBitmap.C.onfig.ARGB_です。8888.しかし、多くの組み込み機器はBitmap.Coonfig.RGB_を使用しています。565.後者については、特にない。アルファ値ですので、描画する時はアルファ合成を計算する必要はありません。次に、RGB_565は、最適化されたmemcopy関数を直接使用することができ、効率は比較的高い。
ですから、BildDrawingCacheでキャッシュを作る時には、RGB_を使うことができます。565フォーマットです。このフォーマットはどうやって作りますか?buildDrawingCacheには二つのバージョンがあります。buildDra wingCacheとbuildDrawingCache()。何のパラメータも設定できません。ソースを見てください。
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>(bitmap);
} else {
mUnscaledDrawingCache = new SoftReference<Bitmap>(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;
}
}
見終わったら分かりました。少なくとも二つの要素と関係があります。drawingCacheBackground ColorとmBGDrawable。setDrawingCacheBackground Color(0 xffff0000)を非デフォルト色に設定した後、確立されたキャッシュはrgb 565です。以下の方法で検証できます。
final Bitmap cache = mContent.getDrawingCache();
if (cache != null) {
Config cfg = cache.getConfig();
Log.d(TAG, "----------------------- cache.getConfig() = " + cfg);
}