我想在我的Xamarin.Forms项目中使用StepCounter 如果我已经正确理解,我需要使用Dependency Service,编写stepcounter的接口以及他在Android / IOS应用程序上的实现。
问题在于,当步进传感器状态发生变化时,我想每时刻更新ui控制(文本)。例如在Android中我们有
using Android.Hardware;
/*Dependency Service header
[assembly: Dependency(typeof(.....
*/
...
namespace tmp
{
public class Stepper : ISensorEventListener, INameOfDependencyInterface
{
public static void Init()
{
SensorManager senMgr = (SensorManager)GetSystemService(SensorService);
Sensor counter = senMgr.GetDefaultSensor(SensorType.StepCounter);
if (counter != null)
{
senMgr.RegisterListener(this, counter, SensorDelay.Normal);
}
}
public void OnSensorChanged(SensorEvent e)
{
/*something that change text on ui*/
}
}
}
在这里,正如您所看到的,我想在OnSensorChanged中更改UI中的文本。
也许这个问题有更好的解决方案,例如:
向PCL调用表单平台依赖服务类实现或在PCL中创建类似侦听器的东西
在PCL make timer中,响应依赖服务并获取stepcounter值,例如每秒
忘记Xamarin.Forms并迁移到Xamarin.Native
答案 0 :(得分:1)
我在Action
构造函数中添加了Init
,当传感器发生变化时会调用它:
public class Stepper : ISensorEventListener, INameOfDependencyInterface
{
private Action<float> _stepCountChanged;
public static void Init(Action<float> stepCountChanged)
{
SensorManager senMgr = (SensorManager)GetSystemService(SensorService);
Sensor counter = senMgr.GetDefaultSensor(SensorType.StepCounter);
if (counter != null)
{
senMgr.RegisterListener(this, counter, SensorDelay.Normal);
}
_stepCountChanged = stepCountChanged;
}
public void OnSensorChanged(SensorEvent e)
{
_stepCountChanged(e.Values.First());
}
}
在你Activity
中以这样的方式初始化它:
DependencyService.Get<...>().Init((steps) => {
// Label.Steps = steps;
});