我知道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假设600
到kLightHeight
,但这并不完全符合我的经验。即使那样,我仍然不知道elevation
的值意味着。此外,我很想了解路径的大小和 Canvas 比例通常会如何影响阴影以及光源的潜在位置。
我需要此信息以确保在不同屏幕尺寸上的行为一致。
因此,如果有人知道或可以从我提供的链接中找到答案,我将很乐意接受任何输入。
最佳答案
看完SkPoint3::Make(0, 0, dpr * elevation)
行的代码。
我确定elevation
的值用于确定小部件下方的阴影将持续多长时间。
我认为elevation
值没有更多的东西了。
如果您发现的不止这些,我很高兴。顺便说一句,这是一个非常好的问题。
关于c++ - DrawShadow中的Elevation到底能做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59549244/