如何平滑加速度计的值,以将其显示在画布上?

时间:2020-09-22 09:28:01

标签: android xamarin canvas accelerometer

我想使加速度计的值平滑一点,因为一点点摇晃会导致画布振动。

我尝试添加一些延迟,但是并不能解决问题。

我该怎么做?

public BubblePage()
{
    InitializeComponent();

    Device.StartTimer(TimeSpan.FromSeconds(1f / 60), () =>
    {
        BubbleCenterCircle.InvalidateSurface();
        return true;
    });
}

void canvasView_BubbleCenterCircle(object sender, SKPaintSurfaceEventArgs e)
{
    var surface = e.Surface;
    var canvas = surface.Canvas;

    canvas.Clear(SKColors.Transparent);

    var width = e.Info.Width;
    var height = e.Info.Height;

    canvas.Translate(width / 2, height / 2);
    canvas.Scale(width / 300f);

    canvas.DrawLine(-60, 0, 60, 0, whiteLine);
    canvas.DrawLine(0, -60, 0, 60, whiteLine);
    canvas.DrawCircle(0, 0, 60f, blackPaint);

    float x = (float)Math.Round(acceleration.X * RoundingValue, 1);
    float y = (float)Math.Round(acceleration.Y * RoundingValue, 1);
    canvas.DrawCircle(x, -y, 15f, whitePaint);
}

void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
    acceleration = e.Reading.Acceleration;
}

Vector3 acceleration;
const float RoundingValue = 60f;

1 个答案:

答案 0 :(得分:0)

您想要采样加速度以使其平滑的声音。在这种情况下,延迟它没有帮助,因为该事件仍会被调用。

如果您无法控制事件的触发频率,则可以执行以下操作:

DateTime _lastRead;
TimeSpan _sampleRate = TimeSpan.FromSeconds(1);
void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
    var now = DateTime.Now;
    if ((now - _lastRead) >= _sampleRate)
    {
        acceleration = e.Reading.Acceleration;
        _lastRead = now;
    }
}

除非最后一次读取与现在的差值等于或大于采样率,否则不会分配acceleration值。

如果这不是您想要的,则需要更加明确地说明要实现的目标。