-
|
我在实现编组功能时,我用ShapeLayer 作为容器,然后用path 去设置这个组容器的大小,但是没有设置 fillStyles 或者 strokeStyles 继续实现鼠标移动时自动选中鼠标坐标对应的Layer功能,这个我是通过 getLayersUnderPoint 做的。 那么对于这种需求是不是应该参考 getLayersUnderPoint 的实现,然后内部改用 hitTestPoint |
Beta Was this translation helpful? Give feedback.
Replies: 8 comments
-
|
如下视频所示,黑色是提升为编组后的组容器,当组容器有填充时。可以通过 getLayersUnderPoint 命中组容器自身 2025-09-12.09.30.30_compressed.mp4 |
Beta Was this translation helpful? Give feedback.
-
|
所有的碰撞检测都是根据图层内容来的,子图层内容也是这个图层的一部分。没有内容的图层就是空的,没法命中。变通的方法是给组容器加个透明的填充,可以用于响应事件但是不绘制出来。但是目前引擎里的实现好像是过度优化了,计算bounds的时候会考虑是否渲染可见,自动剔除了所有不可见的形状。有两个地方,首先ShapeLayer这个子类应该改为就算fill和strokes都是透明的,也要创建Picture给Layer作为content。其次是Picture内部计算bounds的时候应该要跳过对透明度等不可见属性的判断。这块我们修改一下,改完你给图层加个矩形,然后设置一个透明度为0的fill填充就行了。 |
Beta Was this translation helpful? Give feedback.
-
|
好的 |
Beta Was this translation helpful? Give feedback.
-
|
该问题已修复,可更新至 commit |
Beta Was this translation helpful? Give feedback.
-
|
@domchen 目前tgfx的Layer碰撞检测是根据内容的包围盒计算的。 这种策略在tgfx中有什么好的实现方式吗? 2025-09-29.10.45.05_compressed.mp4 |
Beta Was this translation helpful? Give feedback.
-
|
你先用getLayerUnderBounds方法获取粗的命中的图层列表,然后对这个列表按顺序调用layer->hitTestPoint(x, y, true)就行,第三个参数就是启用精确的形状碰撞。命中才会返回true。 |
Beta Was this translation helpful? Give feedback.
-
|
另外问下,你是在开发一个类似Figma的产品吗? |
Beta Was this translation helpful? Give feedback.
-
|
我是在研究一个绘座的编辑器,其实类似于Figma这类设计软件。https://www.infoq.cn/article/cafr0yextocdbz4bbgq7 |
Beta Was this translation helpful? Give feedback.
所有的碰撞检测都是根据图层内容来的,子图层内容也是这个图层的一部分。没有内容的图层就是空的,没法命中。变通的方法是给组容器加个透明的填充,可以用于响应事件但是不绘制出来。但是目前引擎里的实现好像是过度优化了,计算bounds的时候会考虑是否渲染可见,自动剔除了所有不可见的形状。有两个地方,首先ShapeLayer这个子类应该改为就算fill和strokes都是透明的,也要创建Picture给Layer作为content。其次是Picture内部计算bounds的时候应该要跳过对透明度等不可见属性的判断。这块我们修改一下,改完你给图层加个矩形,然后设置一个透明度为0的fill填充就行了。