我创建了一个Xamarin跨平台应用程序,它只打开相机进行录制,但相机应该只能以横向模式打开,即使用户将手机保持在纵向模式,也应该打开一个弹出消息应用程序在横向视图。
无论是横向模式还是纵向模式,我都无法感知移动的方向。当我运行我的应用程序时,它始终采用纵向模式下移动设备的宽度和高度,但不是基于方向。
protected override void OnSizeAllocated(double width, double height) {
if (height > width) {
IsPotrait = true;
}
else if (width > height) //Landscape mode
{
IsPotrait = false;
}
base.OnSizeAllocated(width, height);
}
protected async override void OnAppearing() {
if (IsPotrait) {
DisplayAlert("Error", "Please hold up your phone for Landscape
view.", "OK");
return;
}
else {
OpenCamera();
}
}
public void OpenCamera() {
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakeVideoSupported) {
DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
return;
}
var file = CrossMedia.Current.TakeVideoAsync(new Plugin.Media.Abstractions.StoreVideoOptions {
Name = "video.mp4",
Directory = "DefaultVideos"
});
if (file == null) return;
DisplayAlert("Video Recorded", "Location", "OK");
}
在“启动画面”屏幕中,使用高度和宽度检查设备方向。使用下面的代码
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
if (height > width ) //It means portrait mode
{
//Show popup here
}
else if(width > height)//Landscape mode
{
}
}
对于xamarin.android,您可以在MainActivity.cs文件中添加ScreenOrientation = ScreenOrientation.Landscape
以强制应用程序的方向。
[Activity(Label = "App", Icon = "@drawable/icon", MainLauncher = true, Theme = "@style/MainTheme",
LaunchMode = LaunchMode.SingleTask,
NoHistory = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.Locale |
ConfigChanges.LayoutDirection,
ScreenOrientation = ScreenOrientation.Landscape)]
对于iOS,您必须在info.plist文件中进行配置
有关更多详细信息,请查看here
现在最简单的方法是使用Xamarin.Essentials
nuget包。您可以使用设备显示信息:https://docs.microsoft.com/es-es/xamarin/essentials/device-display?context=xamarin%2Fxamarin-forms&tabs=android
// Orientation (Landscape, Portrait, Square, Unknown)
var orientation = mainDisplayInfo.Orientation;
你可以使用这个插件获得宽度和高度:
// Width (in pixels)
var width = mainDisplayInfo.Width;
// Height (in pixels)
var height = mainDisplayInfo.Height;
上面已经有了答案,但我认为它们不够具有描述性
根据我的知识,Xamarin.Forms
没有干净的方法来做这件事,我建议你做的是在你需要检查方向的页面上做以下事情:
添加一个布尔属性,用于检查设备是否处于纵向模式,默认情况下也将其设置为true:
private bool _isPotrait= true
public bool IsPotrait
{
get
{
return _isPotrait;
}
set
{
_isPotrait=value;
OnPropertyChanged(nameof(IsPotrait));
}
}
请确保您的ContentPage也继承自INotifyPropertyChanged
界面以便上述工作检查此guide
现在覆盖OnSizeAllocated方法:
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height); //must be called
}
请注意,旋转设备时可能会多次调用OnSizeAllocated方法。
现在如果设备的height > width
则意味着设备处于纵向模式。
因此,在OnSizeAllocated方法中添加以下内容:
protected override void OnSizeAllocated(double width, double height)
{
if (height > width )
{
IsPotrait =true;
}
else if(width > height)//Landscape mode
{
IsPotrait =false;
}
base.OnSizeAllocated(width, height);
}
在调用Camera API之前完成所有这些操作后,您所要做的就是检查:
if(IsPotrait) {//Yes} else {//No}
最好添加Xamarin.Essentials Nuget包:
完成后,在MainPage中使用Statement添加以下内容
using Xamarin.Essentials;
然后使用以下API获取显示指标:
// Get Metrics
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
然后使用以下内容获取方向,以下是可能的出现:
// Orientation (Landscape, Portrait, Square, Unknown)
var orientation = mainDisplayInfo.Orientation;
使用Xamarin Essentials这适用:
DisplayOrientation orientation = DeviceDisplay.MainDisplayInfo.Orientation;
if(orientation == Xamarin.Essentials.DisplayOrientation.Landscape)
{
outerStack.Orientation = StackOrientation.Horizontal;
}
else
{
outerStack.Orientation = StackOrientation.Vertical;
}
我将它放在OnAppearing()中。因此,当设备旋转时,它会以正确的格式重新显示页面。旋转设备时会触发OnAppearing()。
我将这个例子用于xaml,它显示在两列中,根据'outerStack.Orientation'堆叠在另一列之上或并排放置。