WP8多分辨率解決方案


// 潛水多年來第一次寫這么多字^_^

看見你出剪刀我再出石頭

由於之前Windows Phone OS 7.1只有一個分辨率,所以我們無須擔心我們的應用在這台手機運行ok在其他機型上會出問題.

我常聽到同事抱怨,人類已經無法阻止android的分辨率了.蘋果的開發者是幸福的^_^.

單一的分辨率,也意味着單一的機型.

不能給用戶提供多樣化的體驗,也不是一件好事.作為后來者,微軟在這兩者間做出了權衡.要多分辨率.但不要泛濫!

WP8支持的分辨率

下面是WP8 開發者預覽版所支持的分辨率,及比例

分辨率

分辨率

長寬比

Delta from Windows Phone OS 7.1

縮放結果

WVGA

480 × 800

15:9

None

480 × 800

WXGA

768 × 1280

15:9

1.6x scale

480 × 800

720p

720 × 1280

16:9

1.5x scale, 80 pixels taller (53 pixels, before scaling)

480 × 853

 

如何以最小的成本,適應這三款分辨率.是我們接下來要思考的話題.

在布局上最好是使用Grid

使用Grid,我們可以使用*和auto.來自適應分辨率.

比如:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="14,0,10,0">

        <ScrollViewer HorizontalAlignment="Left" Height="540" VerticalAlignment="Top" Width="456">

             <Grid HorizontalAlignment="Center" Height="618" VerticalAlignment="Top" Width="456">

                 <Grid.RowDefinitions>

                     <RowDefinition Height="98*"/>

                     <RowDefinition Height="13*"/>

                 </Grid.RowDefinitions>

                 <TextBlock TextWrapping="Wrap" Margin="22,20,10,0" Text="fasdfasdfasd"/>

             </Grid>

        </ScrollViewer>

 </Grid>

 

這里

<RowDefinition Height="98*"/>

<RowDefinition Height="13*"/>

不要寫死數值硬編碼. 要使用*或auto.

像canvas那種絕對定位,布局的控件盡量少的使用.

 

根據不同的分辨率加載圖像

 

[注意]這里的圖像不是我們想像的所有圖片.只是像背景圖像,應用初始化圖.

由於分辨率的比例不同.我們需要做一些適配的工作.至於其他的如瓦片,應用圖標.我們只需要按着WXGA的分辨率做一套就可以了.

系統會自動縮放合適的大小.

下面是如何動態加載[應用初始化圖]

  1. 把圖像的Copy to Output Directory屬性值設成copy always.

2.

public enum Resolutions { WVGA, WXGA, HD720p };

public static class ResolutionHelper

{

   private static bool IsWvga

   {

      get

      {

         return Application.Current.Host.Content.ActualHeight == 800

         && Application.Current.Host.Content.ScaleFactor == 100;

      }

   }

 

   private static bool IsWxga

   {

      get

      {

         return Application.Current.Host.Content.ScaleFactor == 160;

      }

   }

    

   private static bool Is720p

   {

      get

      {

         return Application.Current.Host.Content.ScaleFactor == 150;

      }

   }

 

   public static Resolutions CurrentResolution

   {

      get

      {

         if (IsWvga) return Resolutions.WVGA;

         else if (IsWxga) return Resolutions.WXGA;

         else if (Is720p) return Resolutions.HD720p;

         else throw new InvalidOperationException("Unknown resolution");

      }

   }

}

 

3.

public class MultiResImageChooser

{

   public Uri BestResolutionImage

   {

      get

      {

         switch (ResolutionHelper.CurrentResolution)

         {

            case Resolutions.HD720p:

               return new Uri("Assets/MyImage.screen-720p.jpg",             UriKind.Relative);

            case Resolutions.WXGA:

               return new Uri("Assets/MyImage.screen-wxga.jpg", UriKind.Relative);

            case Resolutions.WVGA:

                return new Uri("Assets/MyImage.screen-wvga.jpg", UriKind.Relative);

            default:

               throw new InvalidOperationException("Unknown resolution type");

           }

        }

     }

}

 

4.xaml中

<!--ContentPanel - place additional content here-->

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

   <Image Source="{Binding BestResolutionImage, Source={StaticResource    MultiResImageChooser}}"/>

</Grid>

5.在app.xaml

xmlns:h="clr-namespace:MultiResSnippet"

6.

App.xaml

<!--Application Resources-->

<Application.Resources>

   <h:MultiResImageChooser x:Key="MultiResImageChooser"/>

</Application.Resources>

瓦片和圖標

前面說過,對於瓦片和圖標我們只需要制作一套WXGA的資源.

不過官方的說法很奇怪.用了[必須只有一套]…

下面是瓦片的尺寸

Tile size

WXGA

App list

100 × 100

Small

159 × 159

Medium

336 × 336

Large

691 × 336

關於從7.1升級到8.0

基於7.1的應用,基本上是不需要任何改動,就能運行於wp8.0的.

至於分辨率.如果是7.1的應用運行於8.0的WXGA的話.應用會像是一張480*800的圖片放大成768*1280的樣子.

在模擬器中100%顯示的時候會有寫模糊.

如果可以的話,推薦首先把7.1的應用打開轉換成8.0

這樣就可以使用8.0的新api了.

對於不同分辨率的邏輯上的處理.

我們可以使用條件編譯來解決.

  #if WP8

  #end if

  這里只是舉例,條件編譯用法請查一下相關資料 .

另外.如果不能使一個項目實現就實現多辨率.可以再建一個項目.

不過維護起來要麻煩不少了.

覺得對您有用,請點支持謝謝!

轉載請注明出處.

作者:蝗蟲的大腿

http://www.cnblogs.com/beyoung/archive/2012/08/07/2627448.html

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM