我在自定义 View 的 onDraw 期间使用以下代码绘制位图
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
p.setShadowLayer(3,3,3,0xff000000);
Bitmap bmp = BitmapFactory.decodeResource(some drawable jpg);
canvas.drawBitmap(bmp,null,new Rect(blah blah),p);
而且阴影看起来很有趣。我好笑是什么意思?我的意思是,如果我调用 canvas.drawRect(),我会得到不同的阴影。看起来有点像 android 阴影代码将位图视为 alpha channel 或其他东西。
已尝试添加 p.setColor(0xff000000);和 p.setStyle(Paint.Style.FILL);但没有区别。
我想我可以在打开阴影的情况下绘制矩形,然后在关闭阴影的情况下绘制位图,但这似乎很愚蠢,因为它会渲染像素两次。
最佳答案
基本上阴影层对文本以外的任何东西都不起作用。真是愚蠢。查看Android hardware acceleration supported operations chart .
这个问题在 2010 年被问到,当时还没有硬件加速 View 树。根据我读过的内容,即使那时阴影层也只适用于简单的形状(如果有的话),而其他人得到了奇怪的结果将它用于除文本之外的任何内容。你可能运气不好。
最后,有很多方法可以伪造阴影层。您可以将 View 包裹在另一个 View 中并在其下方绘制。您可以编写一个 View ,自己将阴影绘制为径向渐变等。但您可能只想制作一个看起来像阴影的 9patch 并使用它。
2018 年更新
从 api 28 开始似乎支持大多数操作!我最近没有机会玩弄阴影层,但现在情况看起来要乐观得多。
关于android Paint.setShadowLayer() vs Canvas.drawbitmap() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2399537/