16.2.1 使用 switch 函数

728 篇文章 1 订阅
29 篇文章 0 订阅
 

16.2.1 使用 switch 函数

 

    我们首先来看这个示例,然后,再描述 switch 函数的实现。这里是它的类型,对于我们理解它,这是一个良好的开端:

 

val switch : Behavior<'T> -> IObservable<Behavior<'T>> -> Behavior<'T>

 

    这个函数的结果是一个行为,表示随时间而变化的 'T 值。这意味着,这个函数以某种方式构造了一个行为,使用前两个参数值。第一个参数表示一个初始行为。在事件发生之前,返回的行为与作为第一个参数提供的将是一样的。

    最有趣的方面是第二个参数,它是一个事件,携带 Behavior<'T> 类型的值。这意味着,每当触发事件时,它会产生可以使用的新行为,而不是以前(或初始)的行为。每当事件发生时,switch  函数(在幕后)将替换这个行为,将返回从事件中获得的行为。你可能会想,携带行为的事件是值,听起来有点复杂。如果我们想要从零开始,建立这样的事件,的确会棘手,但是,我们总是可以通过组合一些简单的值,创建一个复杂的值。

    现在,我们知道 switch 函数要做什么了,让我们尝试使用它。清单 16.7 首先创建一个简单的、旋转的圆,类似于我们在第 15 章中看到的。然后,构造一个事件,当用户在窗体上单击时,会被触发,它携带一个新的行为:相同的动画,只是运行得更快。最后,它使用 switch 函数构建一个行为,每次单击时更改。

 

Listing 16.7 Animation with changing speed (F#)

 

let af = new AnimationForm(ClientSize = Size(400, 400), Visible=true)

let greenCircle = circle (forever Brushes.OliveDrab) 100.0f.forever
let rotatingCircle = rotate 100.0f 1.0f greenCircle

let circleEvent =
  af.Click
  |> Observable.map (always 0.1f)
  |> Observable.scan (+) 0.0f
  |> Observable.map (fun x -> faster x rotatingCircle)

let init = faster 0.0f rotatingCircle
af.Animation <- switch init circleEvent

 

    清单 16.7 首先创建一个标准的行为 rotatingCircle,表示动画,是恒速旋转的、绿色圆圈。下一步,它构造了产生新的行为事件。我们用了计数点击按钮时所做的同样技巧,创建一个将产生指定速度的事件,每次单击时,递增速度。最后,在流操作中调用 Observable.map,把携带速度的事件转换成携带行为的事件。它改变了原始旋转圆速度,通过每次调用 faster 函数,新的速度作为第一个参数值。

    一旦我们有了这个事件,就可以最后使用 switch 函数。首先,创建一个初始行为,是旋转速度设置为零的圆。然后,使用这个行为和前面声明的事件,创建最终的动画。图 16.3 显示最后运动中的动画,左边是 3 次单击的结果,右边是是 13 次单击的结果。

image

图 16.3 两个窗体显示运行中动画,鼠标单击几次后,速度不同

 

    由于一等事件和行为的组合,就可以用完全声明的方式,写出很有趣的动画。现在,是时候来看一下 switch 函数的实现了,它使一切都成为可能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值