アイキャッチ画像

.Net MAUIで画面の明るさを変更する方法について

.Net MAUIで画面の明るさを変更する方法を紹介していきます。

当記事は、Android・iOSの内容になります。Windows・Macでは利用できないので気を付けてください。

紹介環境

当記事は以下の環境で作成しています。

開発環境

  • Visual Studio 2022
  • .Net 8

画面の明るさを変更する方法について

画面の明るさの変更方法を紹介します。

Androidの場合

Androidは以下のように画面の明るさを変更します。

public async Task SetScreenBrightnessAsync(float brightness)
{
    Activity activity = await Platform.WaitForActivityAsync();
    if (activity.Window?.Attributes is null) return;
    WindowManagerLayoutParams layoutParams = activity.Window.Attributes;

    // 画面の明るさを設定します
    layoutParams.ScreenBrightness = brightness;

    activity.Window.Attributes = layoutParams;
}

画面の明るさは「0.0~1.0」で指定できます。定数が用意されており、最大値はWindowManagerLayoutParams.BrightnessOverrideFull(1.0)で、最低値はWindowManagerLayoutParams.BrightnessOverrideOff(0.0)になります。

デフォルトに戻す場合は、WindowManagerLayoutParams.BrightnessOverrideNone(-1)を指定します。

iOSの場合

iOSは以下のように画面の明るさを変更します。

public Task SetScreenBrightnessAsync(float brightness)
{
    // 画面の明るさを設定します
    UIScreen.MainScreen.Brightness = brightness;

    return Task.CompletedTask;
}

画面の明るさは「0.0~1.0」で指定できます。

実装方法について

実装方法を紹介していきます。

以下のようなファイル構造で実装していきます。

ファイル構造

DIの実装方法は以下で紹介していますので参考にしてみてください。

手順1:インターフェースを準備します

インターフェースを以下のように準備します。インターフェースの内容は画面の明るさの取得・設定になります。

// 名前空間はプロジェクトに合わせます
namespace SampleApp.DI;

public interface IDeviceDI
{
    /// <summary>
    /// 画面の明るさを取得します
    /// </summary>
    public Task<float> GetScreenBrightnessAsync();

    /// <summary>
    /// 画面の明るさを設定します。
    /// </summary>
    public Task SetScreenBrightnessAsync(float brightness);

    /// <summary>
    /// 画面の明るさを通常に設定します。
    /// </summary>
    public Task SetScreenBrightnessToNormalAsync();

    /// <summary>
    /// 画面の明るさを最大にします。
    /// </summary>
    public Task SetScreenBrightnessToMaxAsync();
}

手順2:インターフェースを実装します

各プラットフォームごとに画面の明るさの設定・取得を実装していきます。

Androidの場合

Androidは以下のように実装します。

using Android.App;
using Android.Views;
using SampleApp.DI;

// 名前空間はプロジェクトに合わせます
namespace SampleApp.Platforms.Android.DI;

public class DeviceDI : IDeviceDI
{
    public async Task<float> GetScreenBrightnessAsync()
    {
        Activity activity = await Platform.WaitForActivityAsync();
        if (activity.Window?.Attributes is null) return -1;
        WindowManagerLayoutParams layoutParams = activity.Window.Attributes;
        return layoutParams.ScreenBrightness;
    }

    public async Task SetScreenBrightnessAsync(float brightness)
    {
        Activity activity = await Platform.WaitForActivityAsync();
        if (activity.Window?.Attributes is null) return;
        WindowManagerLayoutParams layoutParams = activity.Window.Attributes;
        // 画面の明るさを設定します
        layoutParams.ScreenBrightness = brightness;
        activity.Window.Attributes = layoutParams;
    }

    public async Task SetScreenBrightnessToMaxAsync()
    {
        Activity activity = await Platform.WaitForActivityAsync();
        if (activity.Window?.Attributes is null) return;
        WindowManagerLayoutParams layoutParams = activity.Window.Attributes;
        // 画面の明るさを最大に設定します
        layoutParams.ScreenBrightness = WindowManagerLayoutParams.BrightnessOverrideFull;
        activity.Window.Attributes = layoutParams;
    }

    public async Task SetScreenBrightnessToNormalAsync()
    {
        Activity activity = await Platform.WaitForActivityAsync();
        if (activity.Window?.Attributes is null) return;
        WindowManagerLayoutParams layoutParams = activity.Window.Attributes;
        // 画面の明るさを初期状態に設定します
        layoutParams.ScreenBrightness = WindowManagerLayoutParams.BrightnessOverrideNone;
        activity.Window.Attributes = layoutParams;
    }
}

iOSの場合

iOSは以下のように実装します。

using SampleApp.DI;
using UIKit;

// 名前空間はプロジェクトに合わせます
namespace SampleApp.Platforms.iOS.DI;

public class DeviceDI : IDeviceDI
{
    /// <summary>
    /// 初期の画面の明るさ
    /// </summary>
    private nfloat _normalScreen;

    public DeviceDI()
    {
        // 初期の画面の明るさを設定します
        _normalScreen = UIScreen.MainScreen.Brightness;
    }

    public Task<float> GetScreenBrightnessAsync()
    {
        return Task.FromResult((float)UIScreen.MainScreen.Brightness);
    }

    public Task SetScreenBrightnessAsync(float brightness)
    {
        // 画面の明るさを設定します
        UIScreen.MainScreen.Brightness = brightness;
        return Task.CompletedTask;
    }

    public Task SetScreenBrightnessToMaxAsync()
    {
        // 画面の明るさを最大に設定します
        UIScreen.MainScreen.Brightness = 1;
        return Task.CompletedTask;
    }

    public Task SetScreenBrightnessToNormalAsync()
    {
        // 画面の明るさを初期状態に設定します
        UIScreen.MainScreen.Brightness = _normalScreen;
        return Task.CompletedTask;
    }
}

その他の場合

Windows・Macは以下のように実装します。

// 名前空間はプロジェクトに合わせます
namespace SampleApp.DI;

#if !ANDROID && !IOS

public class DeviceDI : IDeviceDI
{
    public Task<float> GetScreenBrightnessAsync()
    {
        return Task.FromResult(-1f);
    }

    public Task SetScreenBrightnessAsync(float brightness)
    {
        return Task.CompletedTask;
    }

    public Task SetScreenBrightnessToMaxAsync()
    {
        return Task.CompletedTask;
    }

    public Task SetScreenBrightnessToNormalAsync()
    {
        return Task.CompletedTask;
    }
}

#endif

手順3:DIを登録します

作成したDIを以下のように登録していきます。

using Microsoft.Extensions.Logging;
using SampleApp.DI;

#if ANDROID

using SampleApp.Platforms.Android.DI;

#elif IOS

using SampleApp.Platforms.iOS.DI;

#endif

// 名前空間はプロジェクトに合わせます
namespace SampleApp;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

#if DEBUG
        builder.Logging.AddDebug();
#endif

        builder.Services.AddSingleton<IDeviceDI, DeviceDI>();
        builder.Services.AddSingleton<MainPage>();

        return builder.Build();
    }
}

iOSで利用する場合

iOSで利用すると画面の明るさがアプリを閉じても保持されます。以下のように実装することで、アプリを閉じたときに画面の明るさを初期状態に戻すことができます。

using SampleApp.DI;

// 名前空間はプロジェクトに合わせます
namespace SampleApp;

public partial class App : Application
{
    private IDeviceDI _deviceDI;

    public App(IDeviceDI deviceDI)
    {
        InitializeComponent();
        MainPage = new AppShell();

        _deviceDI = deviceDI;
    }

#if IOS

    protected override Window CreateWindow(IActivationState? activationState)
    {
        Window window = base.CreateWindow(activationState);

        float brightness = -1;

        // アプリへ復帰した時
        window.Activated += async (s, e) =>
        {
            if (brightness == -1) return;
            await _deviceDI.SetScreenBrightnessAsync(brightness);
        };

        // アプリから離れた時
        window.Deactivated += async (s, e) =>
        {
            brightness = await _deviceDI.GetScreenBrightnessAsync();
            await _deviceDI.SetScreenBrightnessToNormalAsync();
        };

        return window;
    }

#endif
}

おわりに

画面の明るさの変更方法を紹介してきました。画面の明るさの変更は、バーコードを読みやすくすることによく利用されます。当記事の内容が役に立てば幸いです。