ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • wpf scale animation 사용하기
    C#/WPF 2016. 11. 10. 18:15

    저번에 wpf에서 animation을 사용하는 법에 대해 썼다. 그런데 그러한 방법으로는 scale값이 변하지 않았다. 찾아보니 scale같이 RenderTransform안에 있는 값을 애니메이션을 사용하려면 다른 방법이 필요하다.

    BeginAnimation(ScaleTransform.ScaleXProperty, da); 를 사용해도 변하지 않았다.


    우선 animation을 참조해야 한다.


    using System.Windows.Media.Animation;


    animation을 적용시킬 때 여러 애니메이션을 동시에 적용시킬 수 있게 해주는 클래스가 있다.


    Storyboard라는 클래스인데, 이 클래스 변수에 Children으로 Animation변수를 넣으면 해당 애니메이션들을 동시에 실행할 수 있다. 그리고 scale을 애니메이션 적용시킬 때 이 Storyboard가 필요하다.


    기본 생성자 : new Storyboard();


    Storyboard는 SetTarget과 SetTargetProperty 함수를 사용할 수 있는데 이는 BeginAnimation에서 첫번째 인자와 같은 역할을 한다. 애니메이션을 적용시킬 Target을 정하는 것이다. 이 TargetProperty를 이용해 scale값을 변화시킬 수 있다.


    이 함수는 Storyboard 클래스를 통하여 호출해야 한다. 간단한 예제를 먼저 보자. img는 Image 컨트롤이다.


    먼저 설정할 것이 있는데


    ScaleTransform scale1 = new ScaleTransform(1, 1);

    img.RenderTransformOrigin = new Point(0.5, 0.5);

    img.RenderTransform = scale1;

    이 내용을 Scale을 애니메이션 하기 전에 호출해야 한다. 아니면 xaml파일에서 직접 선언해주어도 된다.

    image의 경우
    <Image x:Name="img" RenderTransformOrigin="0.5,0.5">
                <Image.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="1" ScaleY="1"/>
                        <SkewTransform/>
                        <RotateTransform/>
                        <TranslateTransform/>
                    </TransformGroup>
                </Image.RenderTransform>
            </Image>

    위와 같이 되어야 하는데, 그냥 속성창에서 scale값을 변화시키면 자동으로 추가된다.


    1. DoubleAnimation da = new DoubleAnimation();
    2. da1.To = ratio;
    3. da1.Duration = duration;

    4. Storyboard stb = new Storyboard();

    5. stb.Children.Add(da);
    6. Storyboard.SetTarget(da, img);
    7. Storyboard.SetTargetProperty(da, new PropertyPath("RenderTransform.ScaleX"));


    7번 줄에서 Storyboard 형 변수의 Children으로 DoubleAnimation 형 변수를 추가한다.

    8번 줄에서 da가 img 라는 컨트롤을 변화시키게 한다.

    9번 줄에서 Storyboard 클래스의 SetTargetProperty를 호출하여 da가 RenderTransform.ScaleX 를 변화시키게 한다.


    위와같이 설정한 후

    stb.Begin()을 호출하면 img의 scaleX가 변화하는 것을 볼 수 있다.



    그런데 보통 ScaleX는 ScaleY와 같이 변화한다. 그래서 두 값을 동시에 변화시키는 애니메이션을 예제로 보자.


    ScaleTransform scale = new ScaleTransform(1, 1);

    img.RenderTransformOrigin = new Point(0.5, 0.5);

    img.RenderTransform = scale;


    Duration duration = new Duration(TimeSpan.FromMilliseconds(500));


    DoubleAnimation da1 = new DoubleAnimation();

    DoubleAnimation da2 = new DoubleAnimation();


    da1.From = 1;

    da1.To = 5;

    da1.Duration = duration;

     

    da2.From = 1;

    da2.To = 5;

    da2.Duration = duration;


    Storyboard stb = new Storyboard();


    stb.Children.Add(da1);

    Storyboard.SetTarget(da1, img);

    Storyboard.SetTargetProperty(da1, new PropertyPath("RenderTransform.ScaleX"));


    stb.Children.Add(da2);

    Storyboard.SetTarget(da2, img);

    Storyboard.SetTargetProperty(da2, new PropertyPath("RenderTransform.ScaleY"));


    stb.Begin();




    'C# > WPF' 카테고리의 다른 글

    WPF 에서 toast 메시지 만들기  (0) 2016.12.05
    C# WPF 윈도우 전체화면  (0) 2016.11.29
    wpf animation 사용하기  (0) 2016.11.09
    WPF Uri 상대경로  (2) 2016.11.08
    WPF 마우스 휠 이벤트  (0) 2016.05.16

    댓글

GiGong