Xamarin.forms 使指南针始终指向Xamarin形式中的特定位置

Xamarin.forms 使指南针始终指向Xamarin形式中的特定位置,xamarin.forms,xamarin.android,xamarin.ios,Xamarin.forms,Xamarin.android,Xamarin.ios,我正在尝试实现罗盘跟踪,以到达特定点。为了实现和测试,我添加了SfCircularGauge,它可以很好地使用相同的逻辑。因为,我不想使用XF,所以在没有XF的情况下尝试了它。但是在没有XF的情况下工作时,箭头不会指向正确的方向,并且箭头只指向北方。计算和点是相同的,这都是因为箭头没有指向正确的方向。(我正在iOS中测试,没有在Android中检查) XAML(XF和普通) 问题是箭头没有指向特定的方向,但它始终位于北方。 该项目也可在 下面我解开了这个谜。更新后的代码如下所示 void C

我正在尝试实现罗盘跟踪,以到达特定点。为了实现和测试,我添加了SfCircularGauge,它可以很好地使用相同的逻辑。因为,我不想使用XF,所以在没有XF的情况下尝试了它。但是在没有XF的情况下工作时,箭头不会指向正确的方向,并且箭头只指向北方。计算和点是相同的,这都是因为箭头没有指向正确的方向。(我正在iOS中测试,没有在Android中检查)

XAML(XF和普通)


问题是箭头没有指向特定的方向,但它始终位于北方。 该项目也可在


下面我解开了这个谜。更新后的代码如下所示

void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
        {
            try
            {
                //Qibla lat and long
                var qiblaLocation = new Location(QiblaLatitude, QiblaLongitude);
                //current position
                var position = new Location(current_latitude, current_longitude);
                var res = DistanceCalculator.Bearing(position, qiblaLocation);
                var TargetHeading = (360 - res) % 360;

                var currentHeading = 360 - e.Reading.HeadingMagneticNorth;
                Heading = currentHeading - TargetHeading;
                
                Info = string.Format("Lat: {0} Long: {1} degree:{2}", current_latitude, current_longitude, Heading);

            }catch(Exception ex){//log exception}
        }

完整的项目在

下面我解开了这个谜。更新后的代码如下所示

void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
        {
            try
            {
                //Qibla lat and long
                var qiblaLocation = new Location(QiblaLatitude, QiblaLongitude);
                //current position
                var position = new Location(current_latitude, current_longitude);
                var res = DistanceCalculator.Bearing(position, qiblaLocation);
                var TargetHeading = (360 - res) % 360;

                var currentHeading = 360 - e.Reading.HeadingMagneticNorth;
                Heading = currentHeading - TargetHeading;
                
                Info = string.Format("Lat: {0} Long: {1} degree:{2}", current_latitude, current_longitude, Heading);

            }catch(Exception ex){//log exception}
        }

整个项目位于

是否正在更新UI线程上的
ImageArrow.Rotation
?如果硬编码旋转值,它是否正确显示?你确定你所有的数学都是正确的吗?这段代码也会改变,但它不会停留在那个点上。设置静态值不会改变。使用上面的代码,它指向了正确的方向,但并没有停留在那里。您将更新
ImageArrow的
rotation属性两次—一次是通过调用RotateTo()更新,一次是直接设置。这是有原因的吗?删除该行指向正确的方向并保持不变,但在xf更改移动方向时不会更改。您是否正在更新UI线程上的
ImageArrow.Rotation
?如果硬编码旋转值,它是否正确显示?你确定你所有的数学都是正确的吗?这段代码也会改变,但它不会停留在那个点上。设置静态值不会改变。使用上面的代码,它指向了正确的方向,但并没有停留在那里。您将更新
ImageArrow的
rotation属性两次—一次是通过调用RotateTo()更新,一次是直接设置。这是有原因的吗?删除该行指向正确的方向并保持不变,但在xf改变移动方向时不会改变。
void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
        {
            try
            {
                //Qibla lat and long
                var qiblaLocation = new Location(QiblaLatitude, QiblaLongitude);
                //current position
                var position = new Location(current_latitude, current_longitude);
                var res = DistanceCalculator.Bearing(position, qiblaLocation);
                var TargetHeading = (360 - res) % 360;

                var currentHeading = 360 - e.Reading.HeadingMagneticNorth;
                Heading = currentHeading - TargetHeading;
                
                Info = string.Format("Lat: {0} Long: {1} degree:{2}", current_latitude, current_longitude, Heading);

            }catch(Exception ex){//log exception}
        }