我可以在屏幕顶部放置一个全屏、半透明的框架,并且可以在其上绘制一个矩形。但是如何使这个矩形完全透明而框架的其余部分保持半透明?
你不能。一个完全透明的矩形只会显示它后面的东西,这是一个半透明的矩形。
但是您可以轻松地扭转局面。创建一个完全透明的框架,然后在框架顶部绘制一个半透明区域(即除您的矩形之外的所有区域。
第一种方法不起作用的原因是你的全透明矩形只会显示它后面的东西,这是一个半透明的矩形。
有多种方法可以绘制这样的区域。
最简单的就是把它分解成四个矩形,像这样的伪代码:
drawrect(0, 0, top, -1)
drawrect(top, 0, bottom, left)
drawrect(top, 0, bottom, right)
drawrect(bottom, 0, -1, -1)
构建一个区域可能更具可读性(只需构建一个全帧区域,然后减去矩形),但绘制一个区域更痛苦。或者,您可以在矩形周围绘制一个未填充的矩形,然后在窗口边界周围绘制另一个像素,然后从 (1,1) 泛滥,但是您必须处理一个接一个的错误。或者您可以创建一个具有 8 个像素的多边形并欺骗缠绕规则。等等。但我认为这是最简单的。
假设您用这些点构建一个“多边形”:TL、TR、BR、BL、TL、tl、bl、br、tr、tl、TL(其中 caps 表示矩形外边,小写表示矩形内边) .这根本不是一个多边形,但如果你问what pixels are inside that polygon(就像你告诉它用填充绘制多边形时所做的那样),wx 必须做一些事情。 wx 有两个规则可供您选择:even-odd 规则计算从一个像素到无穷远某个点的线穿过多边形的次数,而winding-number 规则计算多边形围绕一个像素循环的次数。
使用奇偶规则:两个矩形内的每个像素都有 2 或 4 个交叉点(取决于无穷远点是否穿过线)。两者之外的每个像素都有 0、2、4 或 6(因为它可能只穿过外部矩形或两者都穿过,并且在任何一种情况下都可能穿过线)。它们之间但不在线上的每个像素都有 1、3 或 5(因为它将恰好穿过外部矩形一次,并且可能穿过内部矩形和/或线)。线上的每个像素......这就是它变得棘手的地方。 wx 将其留给每个平台后端来执行规则,并且在其中一些上,线上的某些点可能被计为从一条线开始并穿过另一条线,这意味着它们最终有 2(或 4)个交叉点,并且因此没有被填满。因此,您最终可以得到一组间隙,它们共同构成一条 1 像素宽的虚线。绘制描边和填充应该可以修复它,但我不确定它是否可以。
使用缠绕规则:理论上,屏幕上任何位置的每个像素都应该被视为外部,而不是填充。然而,它的实际实现方式,两个矩形内部或外部的像素都看到曲线的一半完全抵消了另一半,而矩形之间的像素只看到线取消自身,而矩形都显示为顺时针方向。即使平台做了一些奇怪的事情并且没有看到线路正确地取消,那也很好;它只能使像素被抵消得更少。