<p>虽然您使用RelativeLayout使指令的坐标相对于小部件的位置,但它对其大小没有任何影响</p>
当你用数值对所有的位置进行硬编码时,你需要一种方法来缩放这些值相对于你的小部件的大小,并且你必须考虑在这种情况下,你想要在行的宽度上发生什么,如果它相对于控件的大小也增长了呢?线性?还有别的吗?根据您的需要,存在各种可能性</p>
<p>最简单的起点,IMHO,是使用<em>缩放</em>指令,相对于小部件的大小设置所有画布指令,而不是您用来设计当前绞刑架的大小</p>
<pre class="lang-yaml prettyprint-override"><code><HangManFig1>:
h: 600
w: 800 # just guessing the size you used to design it, adjust as needed
canvas:
PushMatrix:
Scale:
xy: self.width / self.w, self.height / self.h
Line:
points: (150, 100, 150, 700)
width: 10
Ellipse:
pos: (550, 500)
... # etc, all the other instructions remain unchanged
PopMatrix: # restore the initial canvas so it doesn't affect other instructions after your drawing
</code></pre>
<p>如果这对您来说还不够,例如,因为您希望保持行的宽度不变,您可以不使用Scale指令,而是使用一个函数,将小部件的大小和一组坐标作为输入,并返回相对于该大小的值:</p>
<pre class="lang-py prettyprint-override"><code>def rscale(size, *args):
w, h = size
ws = w / 800 # adjust accordingly, as in the first example
hs = h / 600
return (x / (ws if i % 2 else hs) for i, x in enumerate(args))
</code></pre>
<p>这个函数可以这样使用</p>
<pre class="lang-yaml prettyprint-override"><code> Line:
points: rscale(self.size, 150, 100, 150, 700)
</code></pre>
<p>如果你想要更复杂的东西,比如保持绞刑架的长宽比,同时保持在你的尺寸范围内,你可以相应地调整如下:</p>
<pre class="lang-py prettyprint-override"><code>
def rscale(size, *args):
w, h = size
scale = min(w / 800, h / 600) # pick the smallest scale of the two
return (x / s for x in args)
</code></pre>