我知道Flutter's Canvas.drawShadow 转换为Skia's SkShadowUtils::DrawUtils ,其中Flutter一侧的elevation影响Skia一侧的zPlaneParams(请参阅 flutter::PhysicalShapeLayer::DrawShadow engine implementation,从 dpr 称为directly called from Dart,称为Canvas::drawShadow,即 elevation ),但是,我根本无法弄清 elevation在本机中绘制阴影时,会起作用(忘记Flutter网站,因为这又完全不同了):

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源代码链接。

确切地说,我不知道0接受的数字范围是多少,即我可以输入的数字范围是多少-我本来以为ojit_a假设600kLightHeight,但这并不完全符合我的经验。即使那样,我仍然不知道elevation 的值意味着
此外,我很想了解路径的大小和 Canvas 比例通常会如何影响阴影以及光源的潜在位置。
我需要此信息以确保在不同屏幕尺寸上的行为一致。

因此,如果有人知道或可以从我提供的链接中找到答案,我将很乐意接受任何输入。

最佳答案

看完SkPoint3::Make(0, 0, dpr * elevation)行的代码。

我确定elevation的值用于确定小部件下方的阴影将持续多长时间。

我认为elevation值没有更多的东西了。

如果您发现的不止这些,我很高兴。顺便说一句,这是一个非常好的问题。

关于c++ - DrawShadow中的Elevation到底能做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59549244/

10-12 01:50