android Paint.setShadowLayer() vs Canvas.drawbitmap() 问题

标签 android

我在自定义 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/

相关文章:

android - 如何让一个TextView有多行?

Android ActionBar 后退按钮默认填充

Android 动态功能虽然说已安装,但仍停留在安装 View

android - 如何从 ListPreference 中获取选定的选项?

java - Android App首次启动后如何处理XML信息

java - 如何从另一个 Activity 打开或启动 fragment ?

android - 某些设备上的 CameraX 黑屏预览

android - 如何在git上添加proguard映射文件(在gitignore、Android Studio中排除)

android - 获取 "notch"的高度,这样内容就不会被截断

android - 来自相同字符串输入的意外不同结果