C#/WPF

WPF Rolling Animation (슬롯머신 같은 애니메이션)

기공이 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개를 사용한 예 입니다. 키가 입력되면 돌아가기 시작하도록 했습니다.