ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WPF Rolling Animation (슬롯머신 같은 애니메이션)
    C#/WPF 2017. 2. 17. 10:30

    텔레비전이나 여타 다른 곳들을 보면 숫자들이 돌아가면서 바뀌는 장면이 있습니다.


    WPF의 DoubleAnimation 을 통해 만들어 간단하게 만들어 보겠습니다.



    메인 글자가 보이는 Label이 필요합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <Label x:Name="lbl1" Content="" FontSize="100" FontWeight="Bold" 
    VerticalContentAlignment="Center" HorizontalContentAlignment="Center" RenderTransformOrigin="0.5,0.5">
        <Label.RenderTransform>
            <TransformGroup>
                <ScaleTransform/>
                <SkewTransform/>
                <RotateTransform/>
                <TranslateTransform x:Name="trans1"/>
            </TransformGroup>
        </Label.RenderTransform>
    </Label>
    cs


    위와 같이 TranslateTransform 을 만들어주시고 Name을 설정해 주셔야 편하게 하실 수 있습니다.


    기타 설정들은 여러분 편하신대로 하시면 됩니다.


    Animation 함수입니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    void Animation(object sender, EventArgs e)
    {
        if (isDa1Up == true)
        {
     
            da1.From = 0;
            da1.To = -distance;
            da1.Duration = duration_t;
        
            trans1.BeginAnimation(TranslateTransform.YProperty, da1);
     
            isDa1Up = false;
        }
        else
        {
     
            index = GetNumber();
            lbl1.Content = arr[index];
     
            da1.From = distance;
            da1.To = 0;
            da1.Duration = duration_t;
     
            trans1.BeginAnimation(TranslateTransform.YProperty, da1);
     
            isDa1Up = true;
        }
    }
    cs



    아래 그림에서 2번이 메인으로 보이는 곳입니다.

    애니메이션을 3 ~ 2로 올라가는 경우와 2~ 1 로 올라가는 경우 2단계로 나누었습니다.


    isDa1Up 이 true 일 경우 2 ~ 1 인 것이고, false인 경우 3 ~ 2 인 것입니다. false인 경우에 label의 내용을 바꾸었고, 시작할 때에는 true에서 시작하고, 정지해야 하면 false에서 멈추면 됩니다.


    distance 는 1, 2, 3 의 높이 입니다. 다 같은걸로 생각하여 distance로 했고, -일 경우 위쪽이며, +일 경우 아래쪽입니다.

    그래서 distance는 lbl1의 ActualHeight 로 사용합니다.


    Duration은 애니메이션이 진행되는 시간입니다. duration_t는 시간을 TimeSpan 변수로 나타낸 것입니다.



    label이 한개면 돌아가는 모습이 예쁘지 않습니다. 예쁘게 보이려면 label 2개를 사용하여 각각 true인 경우와 false인 경우를 번갈아가며 돌아가게 하면 됩니다.



    아래는 label 2개를 사용한 예 입니다. 키가 입력되면 돌아가기 시작하도록 했습니다.





    댓글

GiGong