我正在尝试在视图元素下放置一个平滑的阴影。这是我到目前为止所做的:
Subclass FrameLayout(我的ShadowViewport),它覆盖了dispatchDraw(...)并执行:
绘制原始视图位图
@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函数经常被调用,例如在滚动时。有缓存的方法吗?
答案 0 :(得分:0)
在AndroidManifest中启用android:hardwareAccelerated =“true”属性将启用图像的自动缓存。例如,在滚动期间没有调用dispatchDraw方法。
我也认为可以在布局类上使用setDrawingCacheEnabled。要完成这项工作,您应该首先调用getDrawingCache,如果它不是null,则返回返回的位图。这看起来有点像“穷人”的优化,但从老款手机中获取性能可能是一个好主意。