You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Squeak 5.2中,如何实现容器缩放时同步缩放子Morph?

让PolygonMorph随父RectangleMorph同步缩放的解决方案

你遇到的问题很典型——默认情况下,PolygonMorph的顶点是固定的坐标值,当父容器RectangleMorph缩放时,它不会自动感知并更新自己的顶点位置。下面给你两种实用的解决方案,都能实现p随r同步缩放的效果:

方法一:监听父容器的尺寸变化事件

这种方法直接利用Squeak的事件系统,在r的尺寸发生变化时手动更新p的顶点,逻辑清晰易懂:

r := RectangleMorph new.
r extent: 500@500.
r openInWindow.
p := PolygonMorph vertices: {(r left)@(r top). (r right)@(r bottom)} color: Color white borderWidth: 2 borderColor: Color white.
r addMorph: p.

"核心:给r添加尺寸变化的监听器,同步更新p的顶点"
r on: #extentChanged do: [ :newExtent |
    p vertices: {(r left)@(r top). (r right)@(r bottom)}.
    p changed. "通知p重新绘制,确保界面同步"
]

原理说明:

  • #on:do:方法为r绑定了extentChanged事件的处理逻辑,每次r被缩放(尺寸变化)时,这个代码块就会执行。
  • 我们在代码块里重新设置p的顶点为r当前的左上角和右下角坐标,再调用p changed触发重绘,这样p就会跟着r的缩放同步更新了。

方法二:利用比例布局自动同步尺寸+顶点绑定

如果想让p完全贴合r的区域,并且自动跟随位置和尺寸变化,可以用Squeak的ProportionalLayout布局管理器,让p自动占满r的空间,再同步自己的顶点:

r := RectangleMorph new.
r extent: 500@500.
r layoutPolicy: ProportionalLayout new. "启用比例布局"
r openInWindow.

"初始化p时用自身局部坐标(0@0到初始尺寸)"
p := PolygonMorph vertices: {0@0. 500@500} color: Color white borderWidth: 2 borderColor: Color white.
p layoutFrame: LayoutFrame identity. "让p占满r的整个区域"
r addMorph: p.

"监听p自身的尺寸变化,同步更新顶点"
p on: #extentChanged do: [ :newExtent |
    p vertices: {0@0. newExtent}.
    p changed.
]

原理说明:

  • ProportionalLayout会让p的尺寸自动跟随r的缩放而变化,LayoutFrame identity确保p始终填满r的空间。
  • 我们监听p自己的extentChanged事件,把顶点更新为自身的左上角(0@0)和当前右下角(newExtent),这样无论r怎么缩放,p的对角线都会贴合r的对角线。

为什么原代码无法同步缩放?

你最初的代码里,p的顶点是初始化时r的固定屏幕坐标(r left@r top等),这些值在r缩放后不会自动更新——因为PolygonMorph本身没有“绑定父容器坐标”的默认逻辑,所以需要我们手动添加同步逻辑。

内容的提问来源于stack exchange,提问作者Nicola Mingotti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:36:58