描画キャッシュで使用しているセルフ クロッピング イメージ ビューがあります。ViewTreeObserver を使用して、レイアウトの準備ができたらビューでトリミングされた画像を取得し、トリミングされたバージョンで ImageView のビットマップを更新しています。描画キャッシュは毎回 null です。ImageView のビットマップ ドローアブルを getDrawingCache() に設定できますが、問題はありませんが、メモリが不足しています。そのスナップショットを取り、GC 用に他のすべてをリリースしようとしています。ここで何が欠けていますか?
public CroppingImageView(Context context){
super(context);
ViewTreeObserver vto = getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
getViewTreeObserver().removeOnGlobalLayoutListener(this);
crop();
}
});
}
public void crop(){
setDrawingCacheEnabled(true);
buildDrawingCache();
Bitmap cached = getDrawingCache();
Log.i("ImageView", "drawing cache " + getDrawingCache());
Bitmap croppedBitmap = Bitmap.createBitmap(cached);
destroyDrawingCache();
cached.recycle();
cached = null;
setDrawingCacheEnabled(false);
setImageBitmap(croppedBitmap);
}