我试图在视图元素下放置一个平滑的阴影。这是我到目前为止所做的:
子类 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 函数经常被调用,例如在滚动时。有没有办法缓存?