2012-05-15 3 views
1

일부 WPF 애니메이션을 사용하여 UserControl을 세로로 이동합니다.계수를 계산하여 표준 속도 애니메이션을 얻습니다.

여기에 코드

public void RestartAnimation(double contentControlHeight, double thisHeight) 
     { 
      if (cp != null && IsLoaded) 
       da.From = contentControlHeight; 
       da.To = -thisHeight; 
       da.RepeatBehavior = RepeatBehavior.Forever; 
       da.Duration = new Duration(TimeSpan.FromSeconds(this.Duration)); 
       sb.Children.Clear(); 
       sb.Children.Add(da); 
       Storyboard.SetTargetProperty(da, new PropertyPath("(Canvas.Top)")); 
       Storyboard.SetTarget(da, cp); 
       sb.Begin();   
      } 
     } 

그것은 잘 작동하지만, 움직임이 빠른 다음 높이가 큰 경우 내가 발견 한 것입니다.

그래서 나는 2 가지 실현해야합니다 (매우 느린 - 빠른 슈퍼)

일부 속도 범위 값은 1-100 즉 내부적 나는 그것을 할 몇 가지 공식/계수이 필요합니다.

나는 정적 인 속도와 다른 높이를 가진 약간의 실험을했다 그리고 약간의 테이블을 얻었다.

enter image description here

나를 난 그냥 속도 범위 (1-100)을 설정해야 할 하는 계산을 파악하는 데 도움이 그것을 잘 상관없이StackPanel높이 작동합니다 바랍니다.

감사합니다.

답변

3

난 당신이 비율 (StackPanel의 높이/ContentControl을 높이)에 관심을 가져야 확실하지 않다, 오히려 단순히 차이 (StackPanel의 높이 - ContentControl을 높이).

속도가 초당 30 픽셀 (실제로는 다소 느리지 만 위의 "속도"값에서가는 경우)라고 원한다고 가정 해보십시오. 초당 30 픽셀의 속도로 픽셀 거리 (높이의 차이)를 처리하는 데 걸리는 시간 (초)을 기준으로 지속 시간을 설정하는 것이 좋습니다.

그래서 당신은해야합니다 :

var duration = TimeSpan.FromSeconds((thisHeight - contentControlHeight)/pixelPerSecondSpeed); 

이 당신이 일정하게 속도를 떠날 방법이다.

+0

감사합니다. @GuthMD! 귀하의 수식이 잘 작동합니다! –

2

애니메이션 기간을 표준화해야합니다. 따라서 스택 패널 높이와 콘텐츠 컨트롤 높이의 비율이 0.5 인 경우 N 초의 지속 시간은 "정상 속도"로 간주됩니다 (이 시점에서 N이 무엇인지 결정해야합니다).

이제는 R의 비율이 0.5과 다른 것으로 가정하고 애니메이션 기간을 알아야합니다. 간단합니다 :

var duration = TimeSpan.FromSeconds(N * R/0.5); 

표준화 된 지속 시간 눈금으로 작업하기를 원한다고 가정 해 봅시다. 이 선형 눈금 100에서 "보통"속도에 해당한다고 가정 해 보겠습니다. 숫자가 낮을수록 이 더 빠릅니다. 애니메이션이므로 1은 "거의 순간적"이고 200은 "보통 속도의 절반"입니다. 정규화 기간은 norm입니다. 당신은 '다음 거라고 있습니다

var absoluteDuration = TimeSpan.FromSeconds(N * R/0.5); 
var normalizedDuration = absoluteDuration.Seconds * norm/100; 
관련 문제