在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
相关产品推荐
相关产品推荐

