使用委托实现可扩展性的正确/不正确用法

7

我正在尝试为我的GUI库的用户提供不受限制的控件进入/退出过渡效果的自定义,并同时保持简单性/预防误用。(当控件进入或退出视图时)。

为此,我向Control类添加了一个委托(delegate),它会接收一个Control引用和一个过渡完成百分比,这样用户就可以根据给定的百分比以任何想要的方式平滑地转换控件的位置/不透明度。他只需在控件进入/退出之前订阅过渡函数即可。

但是,我意识到仅使用当前完成百分比无法对控件进行过渡/动画,因为您还必须存储并比较控件的初始位置。
为了明确这种存储要求,我是否应强制使用委托函数对象?

如果是这样,那么我如何以简约/清晰的方式实现呢?


请随意提出其他允许用户应用自定义过渡动画的方法!


你能粘贴一下你正在使用的代码吗? - matthewr
@MatthewRz 这并不能帮助理解 =| 它就是我描述的那样。我可以告诉你它是XNA,我正在修改Nuclex Graphics/GUI库。 - Griffin
3个回答

1

我认为您不必向控件的用户提供控件的初始位置,因为他可以相对于初始位置进行定位:负数表示左侧和顶部,正数表示右侧和底部。

以下代码是用于快速转换的函数:

Point FastTranDiagonial(float Percentage){
   Thread.Sleep(10);
   int pixelsDist = (1 - Percentage)* 300;//300 is the maximum distance 
   return new Point(-pixelsDist ,pixelsDist);
}

当您调用委托时,必须将点添加到控件的初始位置。请注意,委托包含Thread.Sleep(X),这必须由用户控制,因为他可能想要进行快速或慢速事务。

您还可以考虑添加类似于jQuery的顺序转换,以便一个转换在另一个完成后开始。

祝您好运


1

如果我理解正确的话,您的控件会调用动画(计算)委托(可能在每一帧上)并传递过渡竞争百分比。

然后,动画委托会计算并返回/应用翻译和位置到控件。

这样对吗?

假设以上是正确的,有几种解决方案:

  1. 仅在动画位置和不透明度时:

    除了竞争百分比之外,在调用委托时还必须发送控件位置和不透明度的初始状态。在过渡开始时必须记住初始状态,并在每次调用中将其发送到委托中。

  2. 一般情况下任意属性的动画:

    除了竞争百分比之外,您还提供状态属性(对象类型或更好的字典类型)。该状态属性完全由委托控制和其动画逻辑。

    对于您的控件,状态属性不具有任何语义或含义。您的控件只需在委托的连续调用之间保留状态属性的值即可。

    将所有内容整合起来,委托在第一次调用时填充状态的初始值,使用这些值进行后续调用 - 委托可以执行任何操作。委托还将计算出的值应用于控件。请注意,委托中可以使用的所有属性都必须是公共的。


0

我认为你需要至少将以下参数传递给委托:

  • 控件本身
  • 包含该控件的容器(例如,一个面板)
  • 完成百分比

通过传递控件本身,用户将拥有其所有初始状态信息(例如位置)。此外,如果用户需要设置控件的任何属性,他肯定需要引用控件本身。

如果用户需要容器的大小/位置信息,或者如果他需要对控件执行一些特殊操作,则可能需要容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接