简单的切换动画不起作用

简单的切换动画不起作用

我尝试了一个简单的切换动画。

首先,我创建一个布尔值,如果我将其设置为 true,则执行 if 路径,将其设置为 false 则执行 else 路径。到目前为止一切顺利。在 animateinline 中,我想根据布尔表达式绘制一些东西。使用 if 路径,我将变量设置为 false,因此我期望在下一个循环中使用 false 路径,而 else 路径则相反(简单的锁定逻辑)。

我必须做什么改变才能获得预期的结果(切换每帧不同的绘制)。

\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}
\usepackage{ifthen}
\usetikzlibrary{shapes, arrows.meta, positioning}

\newboolean{boolvar} %declaration, seems to be false by default
\setboolean{boolvar}{true}
\begin{document}
    \begin{frame}
        \begin{animateinline}[controls,loop]{50}
            \begin{tikzpicture}
                \ifthenelse{\boolean{boolvar}}
                    %if:
                    { 
                        \node[draw=green,
                        minimum width=2cm,
                        minimum height=1cm] at (0,1) {1};
                        \setboolean{boolvar}{false} %this should set boolvar to false
                    } 
                    %else:
                    {   
                        \node[draw=red,
                        minimum width=2cm,
                        minimum height=1cm] at (0,1) {0};
                        \setboolean{boolvar}{true} %this should set boolvar to true
                    } 
            \end{tikzpicture}
        \end{animateinline}
    \end{frame} 
\end{document}

答案1

环境中不存在任何\newframe或命令。因此,仅根据布尔变量的初始设置生成一个动画帧。\multiframeanimateinline

可以将环境放置\multiframe{2}{}{...}在周围tikzpicture以获得两个动画帧。但请注意,在主体内定义或设置的变量\multiframe具有仅限于当前循环执行的局部范围。Pkgifthen不允许全局设置布尔变量。或者,etoolbox可以使用允许设置布尔值的命令以 为前缀的包\global

\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}
\usepackage{etoolbox}
\usetikzlibrary{shapes, arrows.meta, positioning}

\newbool{boolvar} %declaration, seems to be false by default
\booltrue{boolvar}
\begin{document}
    \begin{frame}
        \begin{animateinline}[controls,loop]{50}
        \multiframe{2}{}{
            \begin{tikzpicture}
                \ifbool{boolvar}
                    %if:
                    { 
                        \node[draw=green,
                        minimum width=2cm,
                        minimum height=1cm] at (0,1) {1};
                        \global\boolfalse{boolvar} %this should set boolvar to false
                    } 
                    %else:
                    {   
                        \node[draw=red,
                        minimum width=2cm,
                        minimum height=1cm] at (0,1) {0};
                        \global\booltrue{boolvar} %this should set boolvar to true
                    } 
            \end{tikzpicture}
        }    
        \end{animateinline}
    \end{frame} 
\end{document}

但是,对于手头的问题,可能更容易使用\newframe来生成两个动画帧:

\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}

\usetikzlibrary{shapes, arrows.meta, positioning}

\begin{document}
  \begin{frame}
    \begin{animateinline}[controls,loop]{50}
      \begin{tikzpicture}
        \node[draw=green,
        minimum width=2cm,
        minimum height=1cm] at (0,1) {1};
      \end{tikzpicture}
    \newframe
      \begin{tikzpicture}
        \node[draw=red,
        minimum width=2cm,
        minimum height=1cm] at (0,1) {0};
      \end{tikzpicture}
    \end{animateinline}
  \end{frame} 
\end{document}

相关内容