触发器用于动画是有用的,但我无法找到一种方法来改变代码中的触发器状态(即无需点击暂停或播放按钮)。
例如,假设我想做一个模拟,当一些事件发生时,我想让当前活动的触发器进入暂停状态,当另一个事件发生时,我想让触发器进入PLAY状态。
要做的按钮仍然会在那里,但我也希望能够从代码中改变这些,而不必物理地做它。
原因是,我正在做一些动作,并有触发器在播放模式,而我正在做这个其他动作是使事情不工作。
所以我需要让它进入暂停状态,当我完成后,我可以把它设置回播放状态。
下面是我的意思的一个小例子:
Manipulate[
EventHandler[
Dynamic@Graphics[
{Circle[{0,0},1], Text[n,pt] },
PlotRange->All,ImageSize->200,ImagePadding->10],
{
"MouseDown":>
(
(* What to do here to cause the trigger to become Paused?"*)
pt=MousePosition["Graphics"]
),
"MouseDragged":>
(
(* while dragging, the trigger remains in PAUSED state "*)
Print["mouse dragged"];
pt=MousePosition["Graphics"]
),
"MouseUp":>
(
Print["MouseUp"]
(* What to do here to cause the trigger to Play again?"*)
)
}
],
Control[{{n,0,"Run"},0,100,0.01,
ControlType->Trigger, DisplayAllSteps->True, AnimationRate->1,
AppearanceElements->{"PlayPauseButton","ResetButton"}}
],
{{pt,{0,0}},ControlType->None}
]
在上面,当我在显示器上拖动鼠标时,我希望触发器暂停,以便在拖动时显示的数字不会改变。当拖动完成后,如果需要的话,我可以让触发器再次播放。
所以,我的问题是:有没有一种方法来改变触发状态,就像上面的代码?我当然可以完全不使用trigger,并以其他方式自己编写所有内容,但在我放弃之前想问一下,因为trigger使用起来很方便。
这里是一个链接到更多的文档的触发器和按钮。
我发现最接近的东西是Enabled->选项来触发,但这只是使触发器本身被启用为不,而不影响触发状态。即,如果触发器正在触发,它将保持触发,即使我设置为禁用。
http://reference.wolfram.com/mathematica/ref/Manipulator.html http://reference.wolfram.com/mathematica/ref/Trigger.html谢谢
可能有一种更简单的方法来做到这一点,但这似乎有效。它基本上通过创建一个计划任务来模仿Trigger
,并在按下或释放鼠标按钮或单击播放/暂停按钮时停止和启动它。
DynamicModule[{start = 0, finish = 100, dt = 0.01, running = False, task, n},
n = start;
Manipulate[
EventHandler[
Dynamic@
Graphics[{Circle[{0, 0}, 1], Text[n, pt]}, PlotRange -> All,
ImageSize -> 200, ImagePadding -> 10],
{
"MouseDown" :>
(StopScheduledTask[task]; pt = MousePosition["Graphics"]),
"MouseDragged" :>
(Print["mouse dragged"]; pt = MousePosition["Graphics"]),
"MouseUp" :>
(If[running, StartScheduledTask[task]]; Print["MouseUp"])
}],
Control[Labeled[
Row[{
Button[
Dynamic@If[running, Magnify["[DoubleVerticalBar]", 1.5],
Magnify["[RightPointer]", 1.5]],
(If[running, running = False; StopScheduledTask[task],
running = True; StartScheduledTask[task]]),
Appearance -> "Palette", ImageSize -> 15, ContentPadding -> False],
Button[
Magnify["[FirstPage]", 1.5],
(n = start; ResetScheduledTask[task]),
Appearance -> "Palette", ImageSize -> 15, ContentPadding -> False]
}], "Run", Left]
],
{{pt, {0, 0}}, ControlType -> None}
],
Initialization :> (task =
CreateScheduledTask[n += dt, {dt, Floor[(finish - start)/dt]}]),
Deinitialization :> RemoveScheduledTask[task]
]
编辑:改变控件的外观,使它们看起来更像传统的播放/暂停/重置按钮