DrawShadow 中的 Elevation 到底是做啥的?

Posted

技术标签:

【中文标题】DrawShadow 中的 Elevation 到底是做啥的?【英文标题】:What does Elevation in DrawShadow do exactly?DrawShadow 中的 Elevation 到底是做什么的? 【发布时间】:2020-04-20 06:52:32 【问题描述】:

我知道Flutter's Canvas.drawShadow 转换为Skia's SkShadowUtils::DrawUtils,其中Flutter 端的elevation 会影响Skia 端的zPlaneParams(参见flutter::PhysicalShapeLayer::DrawShadow engine implementation,它在@987654324 中使用dpr 调用@ 是 directly called from Dart),但是,我根本无法弄清楚 elevation 在原生中绘制阴影时的行为(忘记 Flutter web,因为这又完全不同了):

void drawShadow(Path path, Color color, double elevation, bool transparentOccluder)  // ...
  _drawShadow(path, color.value, elevation, transparentOccluder);

void _drawShadow(Path path, int color, double elevation, bool transparentOccluder)
                 native 'Canvas_drawShadow';
void Canvas::drawShadow(const CanvasPath* path, SkColor color, double elevation, bool transparentOccluder)
 // ..
  SkScalar dpr = UIDartState::Current()->window()->viewport_metrics().device_pixel_ratio;
  flutter::PhysicalShapeLayer::DrawShadow(canvas_, path->path(), color,
                                          elevation, transparentOccluder, dpr);

void flutter::PhysicalShapeLayer::DrawShadow(...) 
   // ...
   SkShadowUtils::DrawShadow(canvas, path, SkPoint3::Make(0, 0, dpr * elevation),
       SkPoint3::Make(shadow_x, shadow_y, dpr * kLightHeight),
       dpr * kLightRadius, ambientColor, spotColor, flags);
 

等等 - 如果您想深入了解,请参阅 Skia 源代码链接。

确切地说,我不明白elevation 接受哪些数字范围,即我可以输入哪些数字 - 我会假设0600 看着kLightHeight,但这并不完全映射到我所经历的。即便如此,我仍然不知道elevation 的值是什么意思。 此外,我很想了解路径的大小和画布比例通常如何影响阴影以及可能影响光源的位置。 我需要这些信息来确保跨不同屏幕尺寸的行为一致。

因此,如果有人知道或可以从我提供的链接中弄清楚,我很乐意接受任何输入。

【问题讨论】:

【参考方案1】:

看了SkPoint3::Make(0, 0, dpr * elevation)这行代码。

我确信elevation 的值用于确定小部件下方阴影的长度/宽度。

我认为elevation 值没有其他意义。

如果你发现比这更多的东西,我会全神贯注。顺便说一句,这是一个非常好的问题。

【讨论】:

感谢您的回答!这基本上是我已经知道的,因为 elevation 通常是这样工作的(文档提到Material elevation)。我想知道更多关于可接受的数字范围,这个高度值如何受路径大小的影响,以及光源的潜在位置,因为如果我想确保一致的行为,这是我需要知道的。 如果是光源,您始终可以假设光源位于设备屏幕的左上端。因为那是 origin(0,0) 所在的位置,并且在与该方向相反的位置投射阴影。 但是,是的,你关于路径大小的问题是我想知道的关于我自己的核心问题之一

以上是关于DrawShadow 中的 Elevation 到底是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

Osmnx 错误:模块“osmnx.elevation”没有属性“add_node_elevations_raster”

REACT ELEVATION

flutter elevation

Jordan React Elevation PF

Android 5.0 android:elevation 适用于 View,但不适用于 Button?

Elevation API 给了我不合逻辑的结果