我正在尝试创建beamer
带有嵌入式动画的幻灯片animate
,它可以与静态 pdf 查看器和 Acrobat Reader 配合使用。
基本问题是动画的最后一帧是关键帧,前面的帧显示了该帧是如何发展的。因此,我希望静态观看者能够看到关键的最后一帧,但我不想在动态观看时泄露结局。
我的直觉是,我可以通过设置poster=last
然后使用autoplay
(也许在时间轴中暂停以将其保持在第 1 帧)从 Acrobat 中的第 1 帧开始来实现这一点。这适用于静态浏览器,但在 Acrobat 中发生的情况是,最后一帧显示出来,但需要通过鼠标单击激活动画才能返回到第一帧并设置动画。
一个可演示的工作示例(不使用beamer
但显示相同的行为):
\documentclass{article}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{animateinline}[controls, autoplay, poster=last]{2}
\multiframe{7}{n=0+30}{
\begin{tikzpicture}
\useasboundingbox (0,0) rectangle (4,8);
\node [draw, circle] (A) at (2,2){A};
\node [draw, circle] (B) [above=4cm of A] {B};
\draw [->, thick] (A) to[out=\n, in=\n] (B);
\end{tikzpicture}
}
\end{animateinline}
\end{document}
我想要设置的是:
- 在静态查看器中打开时,最后一帧会用左侧的箭头显示,以便人们可以看到动画如何结束。
- 但是,当在 Reader 中打开时,动画将会运行时,箭头会出现在右侧(第 1 帧)。
有什么建议么?
答案1
这可以使用 OCG(可选内容组,又名 PDF 层)和一些 JavaScript 来实现。
我们重复最后一帧,但创建两个版本,每个版本都与一个 PDF 层相关联。一个层显示(实际)最后一帧,默认情况下处于开启状态,另一个层显示第一帧,默认情况下处于关闭状态。在 AR 中,在 Page-Open 事件期间使用 JavaScript 开启后者,关闭前者。
已经存在的 OCGacro
可以other
在文档中的其他动画中安全地重复使用(重新打开)。
\documentclass{article}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{ocgx}
%\usepackage{fixocgx}
\pdfpageattr{/AA << %additional actions for pageopen event
/O << /S/JavaScript /JS (
var ocgArray = this.getOCGs();
for (var i=0; i < ocgArray.length; i++) {
if (ocgArray[i].name == "other") ocgArray[i].state = false;
if (ocgArray[i].name == "acro") ocgArray[i].state = true;
}
) >>
>>}
\begin{document}
Bla, bla.
\newpage
\begin{animateinline}[
controls,
poster=last
]{2}
\multiframe{7}{n=0+30}{
\begin{tikzpicture}
\useasboundingbox (0,0) rectangle (4,8);
\node [draw, circle] (A) at (2,2){A};
\node [draw, circle] (B) [above=4cm of A] {B};
\draw [->, thick] (A) to[out=\n, in=\n] (B);
\end{tikzpicture}
}
\newframe* % During playback, pause before this frame.
\begin{tikzpicture}
\useasboundingbox (0,0) rectangle (4,8);
\node [draw, circle] (A) at (2,2){A};
\node [draw, circle] (B) [above=4cm of A] {B};
\begin{ocg}{acro}{acro}{0}% default = not visible
\draw [->, thick] (A) to[out=0, in=0] (B);
\end{ocg}
\begin{ocg}{other}{other}{1}% default = visible
\draw [->, thick] (A) to[out=180, in=180] (B);
\end{ocg}
\end{tikzpicture}
\end{animateinline}
\end{document}