我只想获取设备的旋转状态而不旋转屏幕 Xamarin.Forms
I only want to get the rotation status of the device without rotating the screen at Xamarin.Forms
我正在使用 Xamarin.Forms 构建一个多页面应用程序。
基本上,这是一个非旋转设置。
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
但是,我们只想在相机页面上获取设备的旋转状态。
所以,在相机页面,我们调用下面的方法
private int GetDeviceRotation()
{
var activity = (Android.App.Activity)this.owner.Activity;
activity.RequestedOrientation = Android.Content.PM.ScreenOrientation.Sensor;
// Get Metrics
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
var rotation = mainDisplayInfo.Rotation == DisplayRotation.Rotation0 ? 0 :
mainDisplayInfo.Rotation == DisplayRotation.Rotation90 ? 90 :
mainDisplayInfo.Rotation == DisplayRotation.Rotation180 ? 180 : 270;
activity.RequestedOrientation = Android.Content.PM.ScreenOrientation.Portrait;
return rotation;
}
但是这种方法拍照的时候屏幕会旋转一会。
不需要旋转屏幕。
只想获取设备旋转状态,不旋转屏幕
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
var rotation = mainDisplayInfo.Rotation;
如果您只使用 mainDisplayInfo 而没有 activity.RequestedOrientation,则旋转始终为 0。
请帮我。
感谢阅读。
你可以用 OrientationEventListener
来做到这一点。
自定义一个 MyOrientationEventListener
扩展 OrientationEventListener
并在 onCreate
方法中实例化它。
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
private OrientationEventListener orientationEventListener;
public static int currentOrientation;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
...
orientationEventListener = new MyOrientationEventListener(this);
}
class MyOrientationEventListener : OrientationEventListener
{
public MyOrientationEventListener(Context context):base(context)
{
}
public override void OnOrientationChanged(int orientation)
{
if (orientation >= 330 || orientation < 30)
{
currentOrientation = (int)SurfaceOrientation.Rotation0;
}
else if (orientation >= 60 && orientation < 120)
{
currentOrientation = (int)SurfaceOrientation.Rotation90;
}
else if (orientation >= 150 && orientation < 210)
{
currentOrientation = (int)SurfaceOrientation.Rotation180;
}
else if (orientation >= 240 && orientation < 300)
{
currentOrientation = (int)SurfaceOrientation.Rotation270;
}
}
}
//Enables and disables listening
protected override void OnResume()
{
base.OnResume();
orientationEventListener.Enable();
}
protected override void OnPause()
{
base.OnPause();
orientationEventListener.Disable();
}
}
我正在使用 Xamarin.Forms 构建一个多页面应用程序。 基本上,这是一个非旋转设置。
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
但是,我们只想在相机页面上获取设备的旋转状态。 所以,在相机页面,我们调用下面的方法
private int GetDeviceRotation()
{
var activity = (Android.App.Activity)this.owner.Activity;
activity.RequestedOrientation = Android.Content.PM.ScreenOrientation.Sensor;
// Get Metrics
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
var rotation = mainDisplayInfo.Rotation == DisplayRotation.Rotation0 ? 0 :
mainDisplayInfo.Rotation == DisplayRotation.Rotation90 ? 90 :
mainDisplayInfo.Rotation == DisplayRotation.Rotation180 ? 180 : 270;
activity.RequestedOrientation = Android.Content.PM.ScreenOrientation.Portrait;
return rotation;
}
但是这种方法拍照的时候屏幕会旋转一会。 不需要旋转屏幕。
只想获取设备旋转状态,不旋转屏幕
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
var rotation = mainDisplayInfo.Rotation;
如果您只使用 mainDisplayInfo 而没有 activity.RequestedOrientation,则旋转始终为 0。 请帮我。 感谢阅读。
你可以用 OrientationEventListener
来做到这一点。
自定义一个 MyOrientationEventListener
扩展 OrientationEventListener
并在 onCreate
方法中实例化它。
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
private OrientationEventListener orientationEventListener;
public static int currentOrientation;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
...
orientationEventListener = new MyOrientationEventListener(this);
}
class MyOrientationEventListener : OrientationEventListener
{
public MyOrientationEventListener(Context context):base(context)
{
}
public override void OnOrientationChanged(int orientation)
{
if (orientation >= 330 || orientation < 30)
{
currentOrientation = (int)SurfaceOrientation.Rotation0;
}
else if (orientation >= 60 && orientation < 120)
{
currentOrientation = (int)SurfaceOrientation.Rotation90;
}
else if (orientation >= 150 && orientation < 210)
{
currentOrientation = (int)SurfaceOrientation.Rotation180;
}
else if (orientation >= 240 && orientation < 300)
{
currentOrientation = (int)SurfaceOrientation.Rotation270;
}
}
}
//Enables and disables listening
protected override void OnResume()
{
base.OnResume();
orientationEventListener.Enable();
}
protected override void OnPause()
{
base.OnPause();
orientationEventListener.Disable();
}
}