天天看點

WP8.1:關于螢幕尺寸和分辨率的那些事兒

介紹了WP8.1螢幕尺寸和分辨率相關的概念及轉換方法;有了這些基礎資訊,就可以獲得螢幕上任意元素的實際尺寸或是邏輯尺寸了。

目前市面上的Windows Phone裝置越來越多,尺寸和分辨率也越來越多,特别是WP8.1時代的到來。做過wp開發的人都知道應用适配其實較安卓要簡單太多了,其中有一個重要原因,就是微軟号稱所有WP裝置都将以2個基準分辨率來發展,即800 : 480和853 : 480。WP8+的應用适配相對來說比較簡單,主要讓螢幕布局适配這兩種比例足矣,想必對WVGA、WXGA和720p三種分辨率及對應的模拟器都有一定了解。

撸主最近深陷Universal Apps的大坑,雖說API變化很大,卻提供了更多有價值的資訊,比如螢幕的邏輯尺寸、實際尺寸、邏輯分辨率、實際分辨率等等資訊,下面我們就讨論WP8.1的螢幕尺寸和分辨率的那些事兒!

我們先了解一下以下的概念,并将細說它們之間的關系和換算方法。

1. Window Size

表示視窗大小或視圖大小。WP8.1和WIN8.1一樣,采用視窗的概念來代表目前應用的窗體。請見Windows.UI.Xaml.Window

我們通過Window.Bounds來擷取目前視窗的大小:

// Window Size
var bounds = Window.Current.Bounds;
WindowSize.Text = string.Format("H {0}  x  W {1}", bounds.Height, bounds.Width);      

2. Logical Dpi

表示目前裝置每邏輯像素所包含的像素數量。請見Windows.Graphics.Display.DisplayInformation.LogicalDpi

// Logical Dpi
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
LogicalDpi.Text = logicalDpi.ToString();      

3. RawPixelsPerViewPixel

表示每個可視像素對應的實際像素個數,這是WP8.1獨有得到屬性,WIN8.1使用ResolutionScale來表達。請見Windows.Graphics.Display.DisplayInformation.RawPixelsPerViewPixel

// RawPixelsPerViewPixel
var dpiRatio = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
RawPixelsPerViewPixel.Text = dpiRatio.ToString();      

4. Scale Factor

表示基準分辨率到實際分辨率的擴充因子,這個屬性在WP8.0上為App.Current.Host.Content.ScaleFactor,我們是通過這個擴充因子來判斷分辨率是WVGA、WXGA或是720p的。我們熟悉的1.0、1.6、1.5倍率因子在WP8.1上都不見了,無法直接擷取,但是我們可以這樣來計算,[Window.Bounds.Width] * [RawPixelsPerViewPixel] / 480,即我們通過實際的分辨率和基準分辨率來反推:

// ScaleFactor
var scaleFactor = bounds.Width * dpiRatio /480;
ScaleFactor.Text = scaleFactor.ToString();      

5. Screen Resolution

表示螢幕分辨率,即實際分辨率。通過[Window.Bounds.Width] * [RawPixelsPerViewPixel]和[Window.Bounds.Height] * [RawPixelsPerViewPixel] 來計算:

// ScreenResolution
var resolutionH = Math.Round(bounds.Height*dpiRatio);
var resolutionW = Math.Round(bounds.Width*dpiRatio);
ScreenResolution.Text = string.Format("{0} x {1}", resolutionH, resolutionW);      

6. Logical Resolution

表示邏輯分辨率,即基準分辨率。通過[Screen Resolution] / [Scale Factor] 來計算:

// LogicalResolution
LogicalResolution.Text = string.Format("{0} x {1}", resolutionH/scaleFactor, resolutionW/scaleFactor);      

7. Raw Dpi

表示螢幕x軸或y軸方向上每英寸的實際點數,這個值和實際的螢幕裝置密不可分,分别有RawDpiX和RawDpiY兩個值:

// RawDpi
var rawDpiX = DisplayInformation.GetForCurrentView().RawDpiX;
var rawDpiY = DisplayInformation.GetForCurrentView().RawDpiY;
RawDpi.Text = string.Format("RawDpiX:{0}, RawDpiY:{1}", rawDpiX, rawDpiY);      

8. Screen Size

表示螢幕尺寸,即實際螢幕對角線的長度,機關英寸。通過上面幾個數值,完全能夠算出目前使用裝置的螢幕尺寸。通過[Screen Resolution] / [Raw Dpi] 兩個方向上的歐氏距離來計算:

// ScreenInch
var screenInch = Math.Sqrt(Math.Pow(resolutionH / rawDpiY, 2) + Math.Pow(resolutionW / rawDpiX, 2));
ScreenInch.Text = string.Format("{0} inches", screenInch.ToString());      

實驗結果

撸主分别在三個模拟器上做了實驗,即8.1 WVGA 4 inch 512M、8.1 720p 4.7 inch 和 8.1 1080p 5.5 inch,這三個模拟器是我們WP8.1上用得最多的模拟器。單從模拟器的标題我們就能得出一些資訊:

WVGA 4 inch:螢幕尺寸4英寸,WVGA分辨率800x480,邏輯和實際分辨率都是這個值;

720p 4.7 inch:螢幕尺寸4.7英寸,720p分辨率1280x720,基準分辨率為853x480;

1080p 5.5 inch:螢幕尺寸5.5英寸,1080p分辨率1920x1080,基準分辨率為853x480。

下面分别是這三種模拟器的結果:

WP8.1:關于螢幕尺寸和分辨率的那些事兒
WP8.1:關于螢幕尺寸和分辨率的那些事兒
WP8.1:關于螢幕尺寸和分辨率的那些事兒

特别注意螢幕分辨率、邏輯分辨率和螢幕尺寸,和我們預想的結果完全吻合。

總結