android - 在 Android View 上哪里可以正确释放位图?

标签 android view bitmap android-custom-view

我有一个自定义 View ,它绘制了一堆东西,包括位图。我想把这张图缓存到位图上,这样我只需要在onDraw中绘制一张位图,而不是重复这些绘图任务和计算。

位图在我们不再使用后需要回收。我在 View 类中看不到 onDestroy() 或任何类似的东西。是否有我可以覆盖的回调方法来实现此目的?

public void <insert_callback_here>() {
    cachedBitmap.recycle();
}

没有动画。这是静态图像。绘制图像需要进行大量计算,因此我宁愿在 onMeasure() 上执行一次。

最佳答案

我要在这里回答我自己的问题。要覆盖的正确方法是 onDetachedFromWindow。我在 onDetachedFromWindow 中取消分配我的位图,如果宽度或高度发生变化,则在 onMeasure 中重新分配它们。

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if (cachedBitmap != null && !cachedBitmap.isRecycled()) {
        cachedBitmap.recycle();
        cachedBitmap = null;
        cachedBitmapWidth = -1;
        cachedBitmapHeight = -1;
    }
}

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int viewWidth = MeasureSpec.getSize(widthMeasureSpec);;
    int viewHeight = MeasureSpec.getSize(heightMeasureSpec);;

    if (cachedBitmapWidth != viewWidth || cachedBitmapHeight != viewHeight) {
        if (cachedBitmap != null) {
            cachedBitmap.recycle();
        }
        cachedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        cachedBitmapWidth = viewWidth;
        cachedBitmapHeight = viewHeight;
        Canvas canvas = new Canvas(cachedBitmap);
        // do drawings here..
    }

    setMeasuredDimension(viewWidth, viewHeight);
}

关于android - 在 Android View 上哪里可以正确释放位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11784171/

相关文章:

android - 从不包含表记录的 SOAP Web 服务返回的 JSON 字符串

android - 从我的应用程序打开 Foursquare 应用程序

view - 如何在android studio中向调色板添加自定义 View ?

android - 如何设置EditText字段的最大和最小字符?

Android:像股票浏览器一样的 ActionBar

android - 在哪个状态下 Activity 衡量它的观点

android - 为什么我创建的位图总是泄漏内存?

android - BitmapFactory.decodeFile 即使图像存在也返回 null

c++ - 字素生成 - 时间与内存复杂度

Android ActivityMonitor 失败导致 getActivity() 永远不会返回