2013-06-13 44 views
18

Được rồi, vì vậy tôi đang làm việc trên màn hình tải và tôi muốn kích hoạt nó một chút.Hoạt ảnh WPF uốn cong và theo một số hình dạng đường dẫn

Về cơ bản những gì tôi đang cố gắng làm là động một đối tượng cùng dữ liệu hình học đường ... Tôi nhấn mạnh 'cùng' vì giữ một đối tượng cố định dọc theo con đường trên tiếp tuyến không phải là những gì tôi muốn làm

Đây là đại diện tốt nhất của những gì tôi đang cố gắng để làm:

enter image description here

tôi có thể sử dụng một ma trận chuyển để gửi yếu tố biên giới này dọc theo con đường nhưng nó gió lên sắp ra như một phim hoạt hình tiếp tuyến mà di chuyển và quay với đường dẫn, nhưng không được nd để phù hợp với hình dạng của con đường ... Dưới đây là một ví dụ về điều đó:

<Border Background="Black" BorderBrush="Transparent" Width="20" Height="20"> 
<Border.RenderTransform> 
    <MatrixTransform x:Name="MatrixT"> 
     <MatrixTransform.Matrix> 
      <Matrix/> 
     </MatrixTransform.Matrix> 
    </MatrixTransform> 
</Border.RenderTransform> 
<Border.Triggers> 
    <EventTrigger RoutedEvent="Border.Loaded"> 
     <BeginStoryboard> 
      <Storyboard> 
       <MatrixAnimationUsingPath Storyboard.TargetName="MatrixT" Storyboard.TargetProperty="Matrix" DoesRotateWithTangent="True" Duration="0:0:5" RepeatBehavior="Forever"> 
        <MatrixAnimationUsingPath.PathGeometry> 
         <PathGeometry Figures="M201.1,50.501C201.1,78.138,178.737,100.501,151.1,100.501L150.799,100.501C123.162,100.501,114.933,77.834,100.8,50.501L100.8,50.5C86.666,23.167,78.437,0.5,50.8,0.5L50.5,0.5C22.863,0.5,0.500000000000014,22.863,0.500000000000014,50.5L0.500000000000014,50.501C0.500000000000014,78.138,22.863,100.501,50.5,100.501L50.8,100.501C78.437,100.501,86.666,77.834,100.8,50.501L100.8,50.5C114.933,23.167,123.162,0.5,150.799,0.5L151.1,0.5C178.736,0.5,201.1,22.863,201.1,50.501L201.1,50.501z" PresentationOptions:Freeze="True"/> 
        </MatrixAnimationUsingPath.PathGeometry> 
       </MatrixAnimationUsingPath> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Border.Triggers> 

tôi đã đưa ra một giải pháp thay thế mà trông thật sự sắc nét, nhưng tôi muốn để pitch câu hỏi này ra với cộng đồng để xem họ có ý tưởng nào về cách thực hiện nhiệm vụ này hay không. Tôi đã thực hiện một số vấn đề lớn về vấn đề này và đã không tìm ra cách để thực hiện điều này một cách hiệu quả có nghĩa.

Các yêu cầu:

  1. Nó phải làm theo (hoặc 'uốn cong cùng') con đường
  2. Nó phải có khả năng mở rộng về quy mô mà không vi phạm các hình ảnh động (rất nhiều các cơ quan đại diện hình ảnh động đột quỵ Tôi đã thấy điều này chỉ có thể hoạt động ở một kích thước mà không phải định cấu hình lại các thuộc tính hoạt ảnh) ... một hộp xem hoàn toàn có thể chấp nhận để thực hiện điều này

Nếu hình dạng có thể bị mờ và mờ dần ở phía sau thậm chí còn lớn hơn (xem hình ảnh ở trên), nhưng có thể nhiều hơn là có thể

CHỈNH SỬA: Để làm rõ ý tôi là 'uốn cong' ... Ý tôi là hình B bên dưới ... hình A là tiêu chuẩn mà tôi đã thấy truyền thống:

enter image description here

+0

bạn đã thử PathListbox http://www.microsoft.com/design/toolbox/tutorials/pathlistbox/ – JSJ

+0

hmmm ... đó là điều khiển thú vị mà tôi chưa thấy, tôi thực sự có một vài cách sử dụng khác cho rằng ... nhưng cuối cùng vẫn không cho phép đối tượng uốn cong/cong dọc theo con đường, chỉ cần tiếp tục xoay dọc theo nó –

+0

điều này thực sự làm những gì bạn đang tìm kiếm chỉ cần làm một chút google. – JSJ

Trả lời

4

Biến đổi hình dạng của bạn thành một đường dẫn sẽ rất khó khăn trong WPF. Tuy nhiên có một xấp xỉ gần đúng có thể bằng cách làm động hai đường dẫn riêng biệt, và cũng làm động hai vùng cắt cùng một lúc.

Đưa ra dưới đây là XAML cho xấp xỉ những gì bạn muốn. Nếu bạn nhìn kỹ vào điểm giao nhau của biểu tượng vô cực, bạn sẽ thấy một chút gián đoạn trong độ bóng của độ bóng khi chuyển đổi. Điều này là do tôi có một chút tùy ý trong việc thiết lập các điểm Bắt đầu, Kết thúc và Bù đắp cho các đối tượng LinearGradientBrush. Một công việc nhỏ trên những người sẽ làm mịn quá trình chuyển đổi đó. Bạn thậm chí có thể chọn làm động các thuộc tính trên bàn chải để trợ giúp điều đó.

<Window x:Class="AnimationTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Background="#FF486CBF"> 
    <Viewbox> 
    <Grid> 
     <Canvas Width="50" Height="50" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top"> 
     <Canvas.Clip> 
      <RectangleGeometry Rect="0,0,50,55"> 
      <RectangleGeometry.Transform> 
       <TranslateTransform x:Name="_clip1"/> 
      </RectangleGeometry.Transform> 
      </RectangleGeometry> 
     </Canvas.Clip> 
     <Path StrokeStartLineCap="Round" 
       StrokeEndLineCap="Round" 
       StrokeThickness="10" 
       RenderTransformOrigin="0.5,0.8571" 
       Data="M 5,25 c 0,-25 40,-25 40,0"> 
      <Path.Stroke> 
      <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> 
       <GradientStop Color="#FFFFFFFF" Offset="0"/> 
       <GradientStop Color="#00FFFFFF" Offset="0.7"/> 
      </LinearGradientBrush> 
      </Path.Stroke> 
      <Path.RenderTransform> 
      <RotateTransform x:Name="_rot1" /> 
      </Path.RenderTransform> 
      <Path.Triggers> 
      <EventTrigger RoutedEvent="Path.Loaded"> 
       <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation From="360" To="0" 
            Duration="0:0:3" 
            RepeatBehavior="Forever" 
            Storyboard.TargetName="_rot1" 
            Storyboard.TargetProperty="Angle"/> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="_clip1" 
         Storyboard.TargetProperty="Y" 
         RepeatBehavior="Forever"> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="0"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:1.5" Value="25"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:2.8" Value="55"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:4.5" Value="-30"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:5.8" Value="0"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:6" Value="0"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
      </Path.Triggers> 
     </Path> 
     </Canvas> 

     <Canvas Width="50" Height="50" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top" 
       Margin="40,0,0,0"> 
     <Canvas.Clip> 
      <RectangleGeometry Rect="0,0,50,55"> 
      <RectangleGeometry.Transform> 
       <TranslateTransform x:Name="_clip2"/> 
      </RectangleGeometry.Transform> 
      </RectangleGeometry> 
     </Canvas.Clip> 
     <Path StrokeStartLineCap="Round" 
       StrokeEndLineCap="Round" 
       StrokeThickness="10" 
       RenderTransformOrigin="0.5,0.8571" 
       Data="M 5,25 c 0,-25 40,-25 40,0"> 
      <Path.Stroke> 
      <LinearGradientBrush StartPoint="1,0" EndPoint="0,0"> 
       <GradientStop Color="#FFFFFFFF" Offset="0"/> 
       <GradientStop Color="#00FFFFFF" Offset="0.7"/> 
      </LinearGradientBrush> 
      </Path.Stroke> 
      <Path.RenderTransform> 
      <RotateTransform x:Name="_rot2" /> 
      </Path.RenderTransform> 
      <Path.Triggers> 
      <EventTrigger RoutedEvent="Path.Loaded"> 
       <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation From="0" To="360" 
         Duration="0:0:3" 
         RepeatBehavior="Forever" 
         Storyboard.TargetName="_rot2" 
         Storyboard.TargetProperty="Angle"/> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="_clip2" 
         Storyboard.TargetProperty="Y" 
         RepeatBehavior="Forever"> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="55"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:1.5" Value="-30"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:2.8" Value="0"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:4.5" Value="25"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:5.8" Value="55"/> 
        <DiscreteDoubleKeyFrame KeyTime="0:0:6" Value="55"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
      </Path.Triggers> 
     </Path> 
     </Canvas> 
    </Grid> 
    </Viewbox> 
</Window> 

Điều quan trọng cần lưu ý là các vùng cắt cần được áp dụng cho các đối tượng Canvas.Nếu chúng được áp dụng cho các đối tượng Path, như bạn thường làm cho hình ảnh, vùng cắt sau đó sẽ được xoay cùng với Path theo RenderTrasform. Không phải là hiệu ứng mong muốn.

+0

CLIPPING! a-HA! Đó là mảnh tôi đã mất tích hoàn toàn ... Tôi thấy rằng tôi sẽ cần phải giả mạo các hình ảnh động một chút, nhưng tôi với điều đó luôn luôn là do không có khả năng để làm cho các cạnh morphed mịn ... cắt rất nhiều là một giải pháp cho điều đó. +1 kudo cho mã hoạt động –

+0

WPF có thay đổi không? Tôi nhận được một lỗi cho '' VS tuyên bố đó là một tài sản không hợp lệ cho 'RoutedEvent'. – JoshVarty

+0

@JoshVarty Tôi vừa tải lại dự án cũ này và nó chạy tốt. Tôi vẫn đang sử dụng Visual Studio 2012 Professional. Nó đang chạy trong khung công tác .NET 4.0. – Stewbob

1

Bạn chỉ có thể đặt nhiều vòng tròn trên đường dẫn và tạo hiệu ứng đường kính của chúng.

+1

Về mặt kỹ thuật, đây là một câu trả lời, nhưng nó không thực sự lý tưởng ... có một cách tốt hơn để hoàn thành nhiệm vụ này ... cộng với, trừ khi bạn mở rộng quy mô siêu nhỏ, bạn sẽ phải có rất nhiều vòng kết nối để không thấy rằng nó không phải là đường trơn tru –

+0

Nó phụ thuộc vào những gì bạn cho là lý tưởng và Để được. Nó có thể là quá phức tạp để tạo ra một giải pháp 'hoàn hảo' và hoàn toàn chấp nhận được để giả mạo nó. –

+0

Đồng ý, giải pháp hiện tại của tôi là sử dụng một tập hợp gồm 7 hoặc 8 vòng tròn theo đường dẫn và đường mòn (với khoảng cách giữa nhau), phần nào giống như giải pháp của bạn ... những gì tôi đang tìm kiếm đối tượng sử dụng hình học đường dẫn, điều này hữu ích cho nhiều hơn là hoạt hình ... Tôi có một cảm giác khá tốt rằng điều này không thể thoát khỏi hộp, vì vậy nếu tôi không nhận được bất kỳ giải pháp nào trong số này ngày hoặc lâu hơn, tôi sẽ lấy câu trả lời cho câu hỏi –

Các vấn đề liên quan