Как определить большое или маленькое устройство в формах xamarin

Как определить, большое или маленькое устройство? Мне не нужно определять, планшет это или нет.

Эта концепция была взята из https://devblogs.microsoft.com/xamarin/styling-for-multiple-device-resolutions/

Мы используем метод ниже и загружаем соответствующие стили соответственно, однако, поскольку я не принимаю во внимание плотность, это неточно.

Как я могу улучшить или переписать этот метод, чтобы он давал мне лучший результат и более точно определял, большое или маленькое устройство?

Текущий

const int smallWightResolution = 768;
const int smallHeightResolution = 1280;

public static bool IsASmallDevice()
{
        // Get Metrics
        var mainDisplayInfo = Xamarin.Essentials.DeviceDisplay.MainDisplayInfo;

        // Width (in pixels)
        var width = mainDisplayInfo.Width;

        // Height (in pixels)
        var height = mainDisplayInfo.Height;
        return (width <= smallWightResolution && height <= smallHeightResolution);
  }

Попробуйте использовать плотность, но не знаете, что это за формула

public static bool IsSmallDevice()
{ 
    //we don't support tablet so tablet don't apply.

    int smallWidthResolution = 768;
    int smallHeightResolution = 1280;
    double screenWidth;
    double screenHeight;
    bool isSmallDevice;
    
    var metrics = Xamarin.Essentials.DeviceDisplay.MainDisplayInfo;
    
    switch (Xamarin.Forms.Device.RuntimePlatform)
    {
        case Xamarin.Forms.Device.Android:
            //Android not sure how to sort of correctly detect if is a small device
            screenWidth = (metrics.Width - 0.5f) / metrics.Density;
            screenHeight = (metrics.Height - 0.5f) / metrics.Density;
            isSmallDevice = "???????";
            break;
        case Xamarin.Forms.Device.iOS:
            //ios no changes 
            isSmallDevice = metrics.Width <= smallWidthResolution
                            && metrics.Height <= smallHeightResolution;
            break;
    }

    return isSmallDevice;
}

ОБНОВЛЕНО

Huawei P9 Android 7.0
    Density=2.5
    Width=1080
    Height=2160
    ScreenHeight(Calculated)=864
    ScreenWidth(Calculated)=432


    Samsung A20 Android (new phone)
    Density=2
    Width=720
    Height=1560
    ScreenHeight(Calculated)=780
    ScreenWidth(Calculated)=360

Какие-либо предложения?


person developer9969    schedule 28.10.2020    source источник
comment
Application.Current.MainPage.Width может помочь?   -  person Shaw    schedule 28.10.2020
comment
Привет, как ты видишь работу?   -  person developer9969    schedule 28.10.2020
comment
Если вы ищете что-то, что подскажет, является ли устройство мобильным или планшетным, вы можете проверить идиому: docs.microsoft.com/en-us/dotnet/api/.   -  person FreakyAli    schedule 28.10.2020
comment
@FreakyAli, спасибо за ответ. Мне не нужно что-то, что говорит мне, планшет это или телефон, но что-то, что различает размер телефона / плотность, чтобы я мог загружать соответствующие стили согласно этой статье devblogs.microsoft.com/xamarin/   -  person developer9969    schedule 28.10.2020
comment
Ссылка ниже может быть полезной stackoverflow .com / questions / 10080451 / stackoverflow.com/questions/55351752/   -  person jai    schedule 31.10.2020


Ответы (2)


Отвечать

Я рекомендую использовать пакет NuGet Xamarin.Essentials для получения ширины, высоты и Плотность, затем по следующим формулам:

  • ScreenWidth = Ширина / Плотность
  • ScreenHeight = Высота / Плотность

Код

using Xamarin.Essentials;

// **** Example Screen Sizes ****
// iPhone SE 2nd Gen (aka iPhone 8), Width 750, Density 2, Width/Density 375
// iPhone 11, Width 828, Density 2, Width/Density 414
// Pixel 3, Width 1080, Density 2.75, Width/Density 392.7
// Galaxy S5, Width 1080, Density 3, Width/Density 360
// Galaxy Nexus, Width 720, Density 2, Width/Density 360
public static double ScreenWidth { get; } = DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density;
public static double ScreenHeight { get; } = DeviceDisplay.MainDisplayInfo.Height / DeviceDisplay.MainDisplayInfo.Density;

public static bool IsSmallScreen { get; } = ScreenWidth <= 360;

Образец приложения

Вот как я использую приведенный выше код в моем приложении GitTrends: https://github.com/brminnick/GitTrends/BLOB/aa0c0a2d53dab7306514287533330b4a3bfbf609/GitTrends/Услуги/XamarinFormsService.cs#L11-L18

person Brandon Minnick    schedule 31.10.2020
comment
привет, спасибо за ответ, не уверен, что это я, но в моих тестах я не получил ожидаемого результата. У меня есть новый Android-телефон Samsung A20 и старый Huawei, он определяет старый как большой, а новый как маленький, однако, если я заставляю его определять как большой и загружать разные стили, новый телефон в порядке, старый - нет. смотреть прямо! См. Подробности в вопросе в разделе ОБНОВЛЕНО. Глядя на данные, я получаю, что новый телефон меньше, но работает лучше. Надеюсь, я ничего не путаю, но я запутался, поскольку мне нужен надежный способ обнаружения маленьких и больших телефонов, если хотите. - person developer9969; 02.11.2020
comment
Физический размер экрана (6 против 4) отличается от его плотности (то есть количества пикселей на дюйм). Как разработчики мобильных приложений, нам нужно беспокоиться только о плотности экрана, потому что именно так наш пользовательский интерфейс Xamarin.Forms отображается на экране. - person Brandon Minnick; 05.11.2020
comment
Не стесняйтесь также поиграть с IsSmallScreen и настроить его так, как лучше всего подходит для вашего приложения. У меня мой установлен на ScreenWidth <= 360, но вы можете увеличить свой до ScreenWidth <= 375. - person Brandon Minnick; 05.11.2020

Вы можете использовать встроенную Idiom в Xamarin Forms для определения типа устройства:

  1. Рабочий стол

  2. Телефон

  3. Планшет

  4. TV

  5. Смотреть

    if (Device.Idiom == TargetIdiom.Phone) {// Здесь идет ваш код}

person sshary19    schedule 03.11.2020
comment
спасибо за ваш ответ, меня волнует только телефон, и ни одна другая идиома, и если телефон маленький или большой, мне нужно уметь его обнаруживать, вышеупомянутое не сработает для меня - person developer9969; 03.11.2020