我有一个自我裁剪的图像视图,我正在使用绘图缓存。我正在使用ViewTreeObserver查看布局何时准备就绪,然后在视图中拍摄裁剪后的图像并使用裁剪版本更新ImageView的位图。每次绘图缓存为空。我可以将ImageView的位图drawable设置为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);
}
答案 0 :(得分:0)
我摆脱了ViewTreeObserver并完成了onLayout的裁剪,现在一切似乎都正常。
protected void onLayout (boolean changed, int left, int top, int right, int bottom){
super.onLayout(changed, left, top, right, bottom);
crop();
}