2017-12-04 3 views
1

나는 가로 텍스트 애니메이션/텍스트 스크롤에 대해 많은 스레드가 있다는 것을 안다. 그러나 불행하게도 그 중 아무 것도 반복 가능한 텍스트로 부드러운 스크롤을 제공하지 못한다. 텍스트를 포함하는 다양한 WPF 컨트롤을 사용하여 두 배/두께 애니메이션을 시도했습니다. 또한 시각적 브러시로 애니메이션을 시도했는데 다른 방법 (예 : Canvas.Left 속성을 가지고 노는 등)에 비해 가장 우아한 스크롤이 가능했지만 텍스트 길이 나 애니메이션 속도가 너무 빠르면 텍스트가 흐려집니다.부드러운 애니메이션 텍스트 선택 윤곽을 만드는 방법은 무엇입니까?

저는 SharpDX 라이브러리를 사용하여 순수한 DirectX C# 구현을 끝 냈습니다. 나는 또한 DirectX 프로그래밍의 초보자라는 것을 언급해야한다. 코드는 다음과 같습니다.

public void RunMethod() 
{ 
    // Make window active and hide mouse cursor. 
    window.PointerCursor = null; 
    window.Activate(); 

    var str = "This is an example of a moving TextLayout object with no snapped pixel boundaries."; 

    // Infinite loop to prevent the application from exiting. 
    while (true) 
    { 
     // Dispatch all pending events in the queue. 
     window.Dispatcher.ProcessEvents(CoreProcessEventsOption.ProcessAllIfPresent); 

     // Quit if the users presses Escape key. 
     if (window.GetAsyncKeyState(VirtualKey.Escape) == CoreVirtualKeyStates.Down) 
     { 
      return; 
     } 

     // Set the Direct2D drawing target. 
     d2dContext.Target = d2dTarget; 

     // Clear the target. 
     d2dContext.BeginDraw(); 
     d2dContext.Clear(Color.CornflowerBlue); 

     //float layoutXOffset = 0; 
     float layoutXOffset = layoutX; 

     // Create the DirectWrite factory objet. 
     SharpDX.DirectWrite.Factory fontFactory = new SharpDX.DirectWrite.Factory(); 

     // Create a TextFormat object that will use the Segoe UI font with a size of 24 DIPs. 
     textFormat = new TextFormat(fontFactory, "Verdana", 100.0f); 

     textLayout2 = new TextLayout(fontFactory, str, textFormat, 2000.0f, 100.0f); 

     // Draw moving text without pixel snapping, thus giving a smoother movement. 
     // d2dContext.FillRectangle(new RectangleF(layoutXOffset, 1000, 1000, 100), backgroundBrush); 
     d2dContext.DrawTextLayout(new Vector2(layoutXOffset, 0), textLayout2, textBrush, DrawTextOptions.NoSnap); 

     d2dContext.EndDraw(); 

     //var character = str.Substring(0, 1); 
     //str = str.Remove(0, 1); 
     //str += character; 
     layoutX -= 3.0f; 

     if (layoutX <= -1000) 
     { 
      layoutX = 0; 
     } 

     // Present the current buffer to the screen. 
     swapChain.Present(1, PresentFlags.None); 
    } 
} 

기본적으로 무한 루프를 생성하고 수평 오프셋을 뺍니다. 도전 과제는 다음과 같습니다. 간격이없는 HTML 선택 윤곽과 비슷한 반복 가능한 텍스트가 필요합니다. 여러 개의 모니터로 확장해야 할 수도 있습니다.

좋습니다.

답변

0
나는 어느 쪽도 다이렉트도 sharpdx을 사용하는 방법,하지만 당신이 원하는 경우에 당신이

내가 얼마 전에 비슷한 문제를 가지고이 솔루션을 고려할 수 모른다

하지만, 콤보 상자 안의 텍스트와. 현상금 후에 내가 뭘 찾고 있는지 알아 냈어. 관련 코드를 예제로 게시하고 있지만 전체 답변을 확인할 수 있습니다. here

기본적으로 텍스트 블록/텍스트 상자에 완전히 표시 할 수없는 문자열이 있으면 그 길이가 텍스트 블록을 초과하게됩니다/상자 길이는 이런 종류의 접근법을 사용할 수 있습니다. 마우스에만 때 활성화로이 동작을 원하고 당신이 내 예에서 다음

_animation = new DoubleAnimation() 
{ 
     From = 0, 
     RepeatBehavior = SlideForever ? RepeatBehavior.Forever : new RepeatBehavior(1), //repeat only if slide-forever is true 
     AutoReverse = SlideForever 
}; 

처럼 스토리 보드에 대한 애니메이션을 정의 : 당신은 (콤보 예를 들어 SlidingComboBox) 당신이 필요로하는 기초에서 파생 된 사용자 지정 UserControl을 정의 할 수 있습니다 콤보 상자에, 그래서 내 사용자 정의 OnMouse 입력이 코드 조각을 가지고

if (_parent.ActualWidth < textBlock.ActualWidth) 
{ 
    _animation.Duration = TimeSpan.FromMilliseconds(((int)textBlock.Text?.Length * 100)); 
    _animation.To = _parent.ActualWidth - textBlock.ActualWidth; 
    _storyBoard.Begin(textBlock); 
} 

여기서 _parent는 선택한 항목의 컨테이너를 나타냅니다. 텍스트 길이와 콤보 박스 길이를 확인한 후에 애니메이션을 시작하고 텍스트 끝 부분에서 끝내십시오.

제가 언급 한 질문에 다른 해결책이 있습니다. 나는 나를 위해 일한 것을 게시하고있다.

+0

고맙다, 그것은 좋아 보인다! 나는 그것을 시도해 보겠다. – adhiman

+0

그래서, 나는 지금 아주 작은 조각으로 그것을 휘저었다. 텍스트의 길이와 길이를 변경 한 후 깜박이기 시작했습니다. 또한 텍스트는 반전 옵션없이 간격없이 반복 가능해야합니다. – adhiman

+0

@adhiman 글쎄, "깜박 거림"이란 무슨 뜻인지 모르겠다. 그러나 반복적 인 텍스트에 관해서는, 나는 그것을하는 방법에 대한 단서가 없기 때문에, 상황은 훨씬 더 복잡해진다. 내 마음에 오는 유일한 것은 표시되는 텍스트라는 다른 속성을 만드는 것입니다. 그러면 루프 효과를 시뮬레이션 할 수 있도록 텍스트의 N 반복을 저장합니다. –

관련 문제