c# - 我只想在 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
.
自定义 a在方法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();
}
}
推荐阅读
- java - 数据绑定没有在android中将数据与xml绑定
- php - 如何解决codeigniter中的Access-control-Allow_origin
- c - 如何打印出一对以上的素数
- java - Java 是否忽略了我的 -Xmx 和 -Xms 参数?
- mysql - 如何从nodejs中的嵌套函数返回db的结果
- javascript - jQuery 验证不适用于焦点输出?
- embedded - 如何将 .ino 文件转换为 .bin 文件,从 arduinoIDE 使用“草图 + WiFi 设置”通过“ESP8266 下载工具”上传到 S3 ESP8266?
- javascript - 在现有项目中使用 Vue.js 和 ReactiveSearch
- jmeter - jmeter中的长时间浸泡测试
- typescript - 使用 UMD 构建时如何使用带有类型定义的 RxJS?