【问题标题】:Improve win2d lines animation UWP改进win2d线条动画UWP
【发布时间】:2020-01-11 08:51:39
【问题描述】:

我创建了一个音频频谱,并为我使用 CanvasAnimatedControl 的线条动画制作了线条动画。

Draw 事件代码:

    private void OnDraw(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl 
        sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedDrawEventArgs args)
    {
        double height = sender.Size.Height;
        double width = sender.Size.Width;

        for (int a = 0; a < nBands; a++)
        {
            _data.Add(new List<double>());
            for (int i = 0; i < DataPointsPerFrame; i++)
            {
                _lastValue = Math.Max(0d, Math.Min(1d, _lastValue + (list[a] * 0.00001)));
                _data[a].Add(list[a]);
            }
        }

        for (int a = 0; a < nBands; a++)
        {
            double total = 0;
            double range = 0;

            double widthBand = (width - 120 - ((nBands - 1) * 1)) / nBands;
            var padding = 60 + (a * widthBand) + (a * 1);
            for (int start = 0; start < _data[a].Count; start += ColumnAvgDataRange)
            {
                total = 0;
                range = Math.Min(ColumnAvgDataRange, _data[a].Count - start);

                for (int i = start; i < start + range; i++)
                {
                    total += _data[a][i];
                }
            }

            total = total * 0.0008;

            var point1 = new Vector2((float)padding, (float)height);
            var point2 = new Vector2((float)padding, (float)height - (float)(height * (total / range)));
            args.DrawingSession.DrawLine(point1, point2, Colors.Green, (float)widthBand);
        }
        canvasBands.Invalidate();
    }

我把项目上传到这个link

如何改善线条的动画以避免出现镜头?

提前致谢。

更新

    private void canvasBands_Update(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, 
        Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedUpdateEventArgs args)
    {
        double height = sender.Size.Height;
        double width = sender.Size.Width;

        point2 = new Vector2((float)padding, (float)height - (float)(height * (total / range)));
    }

我尝试按照您所说的进行修改,但我无法获得良好的结果,因为更新事件仅更改一次并且仅返回一点二。我上传了文件here。 我怎样才能变得更好?

永远感谢。

【问题讨论】:

  • 我们的团队成员已经回复了类似的案例here,请检查是否有帮助。

标签: c# canvas uwp line win2d


【解决方案1】:

您不需要在画布上调用 invalidate。
你需要分开你的代码: 您应该在控件的 Update 事件处理程序中更新几何图形,然后在 Draw 事件处理程序中进行绘制。

这是一个使用随机数生成器创建值的示例。您可以根据自己的用途进行调整。请注意,Draw 函数中没有进行任何计算:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Windows.UI;
using Windows.UI.Xaml.Controls;

namespace Test_One_Bar_UWP
{
    public sealed partial class MainPage : Page
    {
        private List<double> _values = new List<double>();
        private List<Vector2> _points = new List<Vector2>();
        private Random _random = new Random();
        private float _barWidth = 30.0f;

        public MainPage()
        {
            this.InitializeComponent();
        }

        private void canvas_Draw(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedDrawEventArgs args)
        {
            lock (_points)
            {
                double height = sender.Size.Height;

                foreach (var point in _points)
                {
                    args.DrawingSession.DrawLine(
                        point.X * _barWidth,
                        Convert.ToSingle(height),
                        point.X * _barWidth,
                        Convert.ToSingle(height) - point.Y,
                        Colors.Green, 1);
                }
            }
        }

        private void canvas_Update(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedUpdateEventArgs args)
        {
            _values.Add(_random.NextDouble());

            double width = sender.Size.Width;

            var lastPoints = _values.TakeLast(Convert.ToInt32(width / _barWidth));

            lock (_points)
            {
                _points.Clear();

                for (var i = 0; i < lastPoints.Count(); i++)
                {
                    _points.Add(new Vector2(i, Convert.ToSingle(sender.Size.Height * lastPoints.ElementAt(i))));
                }
            }
        }
    }
}

【讨论】:

  • 我试过了但没有得到好的结果我上传了新文件谢谢你的帮助。
  • 您以错误的方式思考问题 - 作为保留模式图形。使用 CanvasAnimatedControl,您可以绘制所有条形图,而不仅仅是最新的一条。在你的更新函数中,你应该生成一个点数组,在 Draw 函数中,你应该在这些点之间画线。
  • 但是如果我创建一个矩阵然后用for循环绘制它,你看不到动画,这是我的错误......你能给我一个例子吗?
  • 您不需要自己的循环。 Update 和 Draw 函数将以每秒 60 次的速度连续调用。 microsoft.github.io/Win2D/html/…
  • 我能做到的最好的速度是this我不明白我真的需要一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2014-04-23
相关资源
最近更新 更多