Xamarin.Forms 画面サイズの取得方法

今回は端末の画面サイズの取得方法についてです。
各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();

以上です。

タイトルとURLをコピーしました