0

我有一个与绘图缓存一起使用的自裁剪图像视图。我正在使用 ViewTreeObserver 查看布局何时准备就绪,然后在视图中获取裁剪后的图像并使用裁剪后的版本更新 ImageView 的位图。绘图缓存每次都为空。我可以将 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 回答