Xamarin.Forms Klasa pomocnika DualScreenInfo
Klasa DualScreenInfo
umożliwia określenie, na którym okienku znajduje się widok, jak duży jest, na jakim poziomie znajduje się urządzenie, kąt zawiasu i nie tylko.
Konfigurowanie funkcji DualScreenInfo
Postępuj zgodnie z tymi instrukcjami, aby utworzyć układ dwuekranowy w aplikacji:
- Postępuj zgodnie z instrukcjami rozpoczynania pracy , aby dodać pakiet NuGet i skonfigurować klasę systemu Android
MainActivity
. - Dodaj
using Xamarin.Forms.DualScreen;
do pliku klasy. DualScreenInfo.Current
Użyj klasy w aplikacji.
Właściwości
SpanningBounds
funkcja zwraca, gdy obejmuje dwa ekrany, dwa prostokąty wskazujące granice każdego widocznego obszaru. Jeśli okno nie zostało włączone, zostanie zwrócona pusta tablica.HingeBounds
wskazuje położenie zawiasu na ekranie.IsLandscape
wskazuje, czy urządzenie jest poziome. Jest to przydatne, ponieważ interfejsy API orientacji natywnej nie raportują poprawnie orientacji, gdy aplikacja jest rozpięta.SpanMode
wskazuje, czy układ jest w trybie wysokiego, szerokiego lub pojedynczego okienka.
Ponadto zdarzenie jest uruchamiane, PropertyChanged
gdy wszelkie właściwości się zmieniają, a HingeAngleChanged
zdarzenie jest uruchamiane, gdy kąt zawiasu się zmienia.
Kąt zawiasu sondy w systemach Android i UWP
Podczas uzyskiwania DualScreenInfo
dostępu z projektów platformy Android i UWP jest dostępna następująca metoda:
GetHingeAngleAsync
pobiera bieżący kąt zawiasu urządzenia. W przypadku korzystania z symulatora można ustawić zawiasy, modyfikując czujnik ciśnienia.
Tę metodę można wywołać z niestandardowych modułów renderujących w systemach Android i UWP. Poniższy kod przedstawia przykład niestandardowego modułu renderowania systemu Android:
public class HingeAngleLabelRenderer : Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer
{
System.Timers.Timer _hingeTimer;
public HingeAngleLabelRenderer(Context context) : base(context)
{
}
async void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (_hingeTimer == null)
return;
_hingeTimer.Stop();
var hingeAngle = await DualScreenInfo.Current.GetHingeAngleAsync();
Device.BeginInvokeOnMainThread(() =>
{
if (_hingeTimer != null)
Element.Text = hingeAngle.ToString();
});
if (_hingeTimer != null)
_hingeTimer.Start();
}
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (_hingeTimer == null)
{
_hingeTimer = new System.Timers.Timer(100);
_hingeTimer.Elapsed += OnTimerElapsed;
_hingeTimer.Start();
}
}
protected override void Dispose(bool disposing)
{
if (_hingeTimer != null)
{
_hingeTimer.Elapsed -= OnTimerElapsed;
_hingeTimer.Stop();
_hingeTimer = null;
}
base.Dispose(disposing);
}
}
Uzyskiwanie dostępu do funkcji DualScreenInfo w oknie aplikacji
Poniższy kod pokazuje, jak uzyskać dostęp do DualScreenInfo
okna aplikacji:
DualScreenInfo currentWindow = DualScreenInfo.Current;
// Retrieve absolute position of the hinge on the screen
var hingeBounds = currentWindow.HingeBounds;
// check if app window is spanned across two screens
if(currentWindow.SpanMode == TwoPaneViewMode.SinglePane)
{
// window is only on one screen
}
else if(currentWindow.SpanMode == TwoPaneViewMode.Tall)
{
// window is spanned across two screens and oriented top-bottom
}
else if(currentWindow.SpanMode == TwoPaneViewMode.Wide)
{
// window is spanned across two screens and oriented side-by-side
}
// Detect if any of the properties on DualScreenInfo change.
// This is useful to detect if the app window gets spanned
// across two screens or put on only one
currentWindow.PropertyChanged += OnDualScreenInfoChanged;
Stosowanie funkcji DualScreenInfo do układów
Klasa DualScreenInfo
ma konstruktor, który może przyjąć układ i przekaże informacje o układzie względem urządzeń dwóch ekranów:
<Grid x:Name="grid" ColumnSpacing="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding Column1Width}" />
<ColumnDefinition Width="{Binding Column2Width}" />
<ColumnDefinition Width="{Binding Column3Width}" />
</Grid.ColumnDefinitions>
<Label FontSize="Large"
VerticalOptions="Center"
HorizontalOptions="End"
Text="I should be on the left side of the hinge" />
<Label FontSize="Large"
VerticalOptions="Center"
HorizontalOptions="Start"
Grid.Column="2"
Text="I should be on the right side of the hinge" />
</Grid>
public partial class GridUsingDualScreenInfo : ContentPage
{
public DualScreenInfo DualScreenInfo { get; }
public double Column1Width { get; set; }
public double Column2Width { get; set; }
public double Column3Width { get; set; }
public GridUsingDualScreenInfo()
{
InitializeComponent();
DualScreenInfo = new DualScreenInfo(grid);
BindingContext = this;
}
protected override void OnAppearing()
{
base.OnAppearing();
DualScreenInfo.PropertyChanged += OnInfoPropertyChanged;
UpdateColumns();
}
protected override void OnDisappearing()
{
base.OnDisappearing();
DualScreenInfo.PropertyChanged -= OnInfoPropertyChanged;
}
void UpdateColumns()
{
// Check if grid is on two screens
if (DualScreenInfo.SpanningBounds.Length > 0)
{
// set the width of the first column to the width of the layout
// that's on the left screen
Column1Width = DualScreenInfo.SpanningBounds[0].Width;
// set the middle column to the width of the hinge
Column2Width = DualScreenInfo.HingeBounds.Width;
// set the width of the third column to the width of the layout
// that's on the right screen
Column3Width = DualScreenInfo.SpanningBounds[1].Width;
}
else
{
Column1Width = 100;
Column2Width = 0;
Column3Width = 100;
}
OnPropertyChanged(nameof(Column1Width));
OnPropertyChanged(nameof(Column2Width));
OnPropertyChanged(nameof(Column3Width));
}
void OnInfoPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
UpdateColumns();
}
}
Poniższy zrzut ekranu przedstawia wynikowy układ: