как создать анимированный прямоугольник на CanvasVirtualControl с помощью win2d, как в .gif?

как нарисовать анимированный прямоугольник в canvasVirtualControl, как показано на рисунке ниже. Я не знаю, как этого добиться. Может ли кто-нибудь предложить мне?

введите описание изображения здесь


person PremKumar Shanmugam    schedule 19.08.2020    source источник


Ответы (1)


В Win2d для создания анимации рекомендуется использовать CanvasAnimatedControl вместо CanvasVirtualControl. Первый может быть отрисован динамически со скоростью 60 кадров в секунду.

Если вы хотите использовать CanvasAnimatedControl для создания динамически изменяющегося прямоугольника, вы можете написать:

<canvas:CanvasAnimatedControl x:Name="canvas" Draw="canvas_DrawAnimated"
                              Width="400" Height="400"/>
Rect rect = new Rect(0, 0, 300, 200);
private void canvas_DrawAnimated(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventArgs args)
{
    var session = args.DrawingSession;
    session.DrawRectangle(rect, Colors.Green);
    if (rect.Width > 30 && rect.Height > 5)
    {
        // The rectangle change parameter here has no practical meaning 
        // and is only used for adjustment
        rect.Width -= 5;
        rect.Height -= 3;
        rect.X += 5;
        rect.Y += 3;
    }
}

Вы можете динамически регулировать начальный размер, уменьшенный диапазон и положение прямоугольника в соответствии с вашими потребностями.


Обновить

Если вам нужен эффект анимации линии муравья, вот идея:

  1. Мы можем создать градиент (например, черно-белый градиент) для имитации пунктирной линии.
  2. Нарисуйте прямоугольник и используйте цвет градиента в качестве цвета границы
  3. Постоянно корректируйте начальную и конечную точки цвета градиента, чтобы создать плавный эффект.

Вот пример:

<canvas:CanvasAnimatedControl   
       x:Name="CanvasAnimatedControl"                      
       CreateResources="CanvasAnimatedControl_CreateResources"
       Draw="CanvasAnimatedControl_Draw"
       Update="CanvasAnimatedControl_Update"
       />
CanvasLinearGradientBrush Brush;
private void CanvasAnimatedControl_CreateResources(CanvasAnimatedControl sender, CanvasCreateResourcesEventArgs args)
{
    CanvasGradientStop[] stops = new CanvasGradientStop[2]
    {
       new CanvasGradientStop { Color = Colors.White, Position = 0 },
       new CanvasGradientStop { Color = Colors.Black, Position = 1 }
    };
    //Create linear gradient
    this.Brush = new CanvasLinearGradientBrush(sender, stops, CanvasEdgeBehavior.Mirror, CanvasAlphaMode.Premultiplied)
    {
        StartPoint = new Vector2(0, 0),
        EndPoint = new Vector2(6, 6)
    };
}
private void CanvasAnimatedControl_Draw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventArgs args)
{
    CanvasCommandList CommandList = new CanvasCommandList(sender);
    using (var ds = CommandList.CreateDrawingSession())
    {
        ds.DrawRectangle(0, 0, 100, 100, this.Brush);
    }
    args.DrawingSession.DrawImage(CommandList);
}
private void CanvasAnimatedControl_Update(ICanvasAnimatedControl sender, CanvasAnimatedUpdateEventArgs args)
{
    Vector2 space = new Vector2(0.5f, 0.5f);
    this.Brush.StartPoint -= space;
    this.Brush.EndPoint -= space;
}
person Richard Zhang - MSFT    schedule 19.08.2020
comment
извините, я не спрашиваю об этом прямоугольнике. Я спрашиваю о большом прямоугольнике с линиями обводки, которые выглядят как тире (----), которые непрерывно перемещаются или вращаются. Есть ли способ нарисовать это в canvasVirtualcontrol? - person PremKumar Shanmugam; 24.08.2020
comment
Кажется, мне чего-то не хватает, я обновил ответ, проверьте его - person Richard Zhang - MSFT; 07.09.2020