如何解决如何平滑加速度计的值,以将其显示在画布上?
我想使加速度计的值平滑一点,因为一点点摇晃会导致画布振动。
我该怎么做?
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,60,whiteLine);
canvas.DrawLine(0,-60,whiteLine);
canvas.DrawCircle(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;
解决方法
您想要采样加速度以使其平滑的声音。在这种情况下,延迟它没有帮助,因为该事件仍会被调用。
如果您无法控制事件的触发频率,则可以执行以下操作:
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
值。
如果这不是您想要的,则需要更加明确地说明要实现的目标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。