0

描画キャッシュで使用しているセルフ クロッピング イメージ ビューがあります。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);

    }
4

1 に答える 1

0

ViewTreeObserver を取り除き、onLayout のトリミングを行ったところ、すべてが正常に機能しているようです。

protected void onLayout (boolean changed, int left, int top, int right, int bottom){
    super.onLayout(changed, left, top, right, bottom);

    crop();
}
于 2013-08-05T16:36:09.647 に答える