reanimate/examples/tut_glue_animate.hs
David Himmelstrup 4283793c5a Elaborate tutorial.
Former-commit-id: 31267dbb1675723b3b9afde806d215b358a7abac
2019-12-03 16:01:18 +08:00

55 lines
1.5 KiB
Haskell

#!/usr/bin/env stack
-- stack runghc --package reanimate
{-# LANGUAGE OverloadedStrings #-}
module Main(main) where
import Codec.Picture.Types
import Data.Text (Text)
import Reanimate
import Reanimate.Animation
import Reanimate.Effect
import Reanimate.Scene
bgColor :: PixelRGBA8
bgColor = PixelRGBA8 252 252 252 0xFF
segmentDuration :: Double
segmentDuration = 3
transitionTime :: Double
transitionTime = 0.5
main :: IO ()
main = reanimate $ bg `parA`
transitions fadeInE fadeOutE transitionTime
[animateCircleR, animateCircleP, animateRectR, animateColor
,signalA (constantS 0) $ setDuration transitionTime animateCircleR]
where
bg = animate $ const $ mkBackgroundPixel bgColor
animateCircleR :: Animation
animateCircleR = mkSegment "radius" $ \t -> mkCircle (t*2)
animateCircleP :: Animation
animateCircleP = mkSegment "drawn" $ \t ->
withFillOpacity 0 $ partialSvg t (pathify $ mkCircle 2)
animateRectR :: Animation
animateRectR = mkSegment "rotation" $ \t -> rotate (t*360) $ mkRect 4 2
animateColor :: Animation
animateColor = mkSegment "color" $ \t ->
withFillColorPixel (promotePixel $ turbo t) $ mkRect 4 2
mkSegment :: Text -> (Time -> SVG) -> Animation
mkSegment label gen = mkAnimation segmentDuration $ \t -> env $
mkGroup
[ gen t
, withStrokeWidth 0 $ translate 0 3 $ scale 2 $
center $ latex label ]
env :: SVG -> SVG
env =
withStrokeColor "red" .
withFillColor "black" .
withStrokeWidth (defaultStrokeWidth*2)