今回は端末の画面サイズの取得方法についてです。
各OSごとに処理を書き、DependencyServiceを使って呼び出します。
1.画面サイズを取得する処理のインターフェースを共通プロジェクトに用意
using System;
using Xamarin.Forms;
namespace TestPrj {
public interface IDisplaySizeService {
Rectangle GetDisplaySize();
}
}
2.Androidの画面サイズ取得処理を書いたクラスをAndroidプロジェクトに追加
using Application = Android.App.Application;
using Android.Util;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: Dependency(typeof(TestPrj.Android.DisplaySizeService))]
namespace TestPrj.Android {
public class DisplaySizeService : IDisplaySizeService {
public Rectangle GetDisplaySize() {
var context = Application.Context;
if (context is null)
return new Rectangle(0, 0, 0, 0);
double height;
double width;
var resources = context.Resources;
var resourceId = resources.GetIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
var metrics = resources.DisplayMetrics;
// ステータスバーのHeight
var statusBarHeight = resources.GetDimensionPixelSize(resourceId) / metrics.Density;
// 画面全体のHeight
var totalHeight = metrics.HeightPixels / metrics.Density;
width = metrics.WidthPixels / metrics.Density;
height = totalHeight - statusBarHeight;
} else {
DisplayMetrics metrics = new DisplayMetrics();
context.GetActivity().WindowManager.DefaultDisplay.GetMetrics(metrics);
width = (double)metrics.WidthPixels / (double)metrics.Density;
height = (double)metrics.HeightPixels / (double)metrics.Density;
}
return new Rectangle(0, 0, width, height);
}
}
}
3.iOSの画面サイズ取得処理を書いたクラスをiOSプロジェクトに追加
using System;
using UIKit;
using Xamarin.Forms;
[assembly: Dependency(typeof(TestPrj.iOS.DisplaySizeService))]
namespace TestPrj.iOS {
public class DisplaySizeService : IDisplaySizeService {
public Rectangle GetDisplaySize() {
double width = UIScreen.MainScreen.Bounds.Width;
double height = UIScreen.MainScreen.Bounds.Height;
return new Rectangle(0, 0, width, height);
}
}
}
4.共通プロジェクトから呼び出す
var size = DependencyService.Get<IDisplaySizeService>().GetDisplaySize();
以上です。