如何根据移动方向改变(感知)Xamarin形式的定位?

问题描述 投票:-1回答:5

我创建了一个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");
}
xamarin xamarin.android
5个回答
0
投票

在“启动画面”屏幕中,使用高度和宽度检查设备方向。使用下面的代码

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
        {

        }
}

0
投票

对于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文件中进行配置

enter image description here

有关更多详细信息,请查看here


0
投票

现在最简单的方法是使用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;

0
投票

上面已经有了答案,但我认为它们不够具有描述性

根据我的知识,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}

UPDATE

最好添加Xamarin.Essentials Nuget包:

完成后,在MainPage中使用Statement添加以下内容

using Xamarin.Essentials;

然后使用以下API获取显示指标:

// Get Metrics
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;

然后使用以下内容获取方向,以下是可能的出现:

// Orientation (Landscape, Portrait, Square, Unknown)
var orientation = mainDisplayInfo.Orientation;

0
投票

使用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'堆叠在另一列之上或并排放置。

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/device-orientation?tabs=windows

© www.soinside.com 2019 - 2024. All rights reserved.