2

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

子类 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);
    }
    

结果

在这里找到图像。正如你所看到的,左边的盒子有一个很好的生成阴影,即使是圆角;)

问题

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

4

1 回答 1

0

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

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

于 2012-08-28T22:04:09.210 回答