Android下面的阴影视图:dispatchDraw经常被调用 - 任何缓存错过了

时间:2012-05-16 07:05:07

标签: android caching shadow

我正在尝试在视图元素下放置一个平滑的阴影。这是我到目前为止所做的:

Subclass FrameLayout(我的ShadowViewport),它覆盖了dispatchDraw(...)并执行:

  • 调用超类的dispatchDraw并将输出保存为位图
  • 从此位图中提取alpa
  • 模糊
  • 使用某种偏移量绘制模糊提取的alpha
  • 绘制原始视图位图

    @Override
    protected void dispatchDraw(Canvas canvas) {
        Log.d("ShadowViewport", "dispatchDraw");
    
        final Bitmap output = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
        final Canvas sCanvas = new Canvas(output);
    
        // Draw internal view in canvas
        super.dispatchDraw(sCanvas);
        final Bitmap original = output.copy(Config.ARGB_8888, true);
    
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(0x55000000);
        paint.setMaskFilter(new BlurMaskFilter(SHADOW_SIZE, Blur.NORMAL));
    
        canvas.drawBitmap(output.extractAlpha(), 0, SHADOW_SIZE, paint);
        canvas.drawBitmap(original, 0, 0, null);
    }
    

结果

Find image here。 如您所见,左侧框有一个很好的生成阴影,即使是圆角;)

问题

on dispatchDraw函数经常被调用,例如在滚动时。有缓存的方法吗?

1 个答案:

答案 0 :(得分:0)

在AndroidManifest中启用android:hardwareAccelerated =“true”属性将启用图像的自动缓存。例如,在滚动期间没有调用dispatchDraw方法。

我也认为可以在布局类上使用setDrawingCacheEnabled。要完成这项工作,您应该首先调用getDrawingCache,如果它不是null,则返回返回的位图。这看起来有点像“穷人”的优化,但从老款手机中获取性能可能是一个好主意。