(译)使用更多的像素——Windows 8 屏幕和视觉状态适配

标签: 更多 像素 windows | 发表时间:2012-04-21 07:33 | 作者:F-sea
出处:http://www.cnblogs.com/

本文同步发表于:WP7开发论坛 Windows Phone Developer Network: http://www.wpdevn.com/showtopic-115.aspx

原文: http://blogs.msdn.com/b/windowsappdev/archive/2012/04/19/getting-the-most-out-of-your-pixels-adapting-to-view-state-changes.aspx
翻译的很烂。。。。

在Windows 8 你的应用运行在不同的屏幕尺寸和视图状态中。 用户可以将你的应用运行在一个 25寸台式机显示器上,也可以将它运行在一个10寸的宽屏平板设备上。无论在什么样的情况下,你始终希望你的应用可以充分使用所有的可用控件。在这片文章中,我将告诉你如何在应用中跟踪屏幕大小和视觉状态,同时给你一些关于在编写win8客户预览版应用中处理处理屏幕大小和视觉状态改变的建议。 在Build 大会中我们提供一些关于如何设计你的应用以适应不同的屏幕场景的建议,你可以在这里看到 XMALHTML 的建议

最近在 Buding Windows 8 Blog 我们分享了一些关于屏幕缩放的研究和设计思想。 通常你可以只是用标记(标记语言?) ( use pure markup) 去适配各种屏幕尺寸无需专门去写一些代码。 但是有时候你需要时刻跟踪你的应用所处于的 视觉状态,无论你的应用是在 portrait, full-screen, filled, snapped 模式你都需要,写相应的代码做出响应。例如: 如果你使用 HTML 的ListView 来显示一堆Items 你也许 希望在FullScreen 模式中使用个GridLayout ,在Snapped 模式中使用 ListLayout ,在XAML 中你也许同样希望在GridView 和 ListView中切换。为了弄清如何实现这功能,我么来看看如何检查缩放和视觉的变化。

左侧的Full Screen 的视觉状态中使用了一个 GridLayout (HTML)/GridView (xmal)

右侧的Snapped 视觉装弹中使用了List Layout(HTML)/ListView (XAML)

屏幕缩放和视觉装弹基础 (The basics of resize and view state changes

在Windows 8 中使用 XMAL 和 HTML 处理屏幕缩放和 视觉状态变化的技术模式是一样的: 只需要简单的为在各自框架中所提供的事件提供回调函数和一些必要的查询数据。

例如: 在JAVASCRIPT 中你可以为一个基础的窗口缩放事件提供处理程序。在下面的例子中 你可以使用一个事件去检查一个应用的显示区域的变化和应用程序所使用的区域大小。

JavaScript:

function handleResize(eventArgs) { 
var appWidth = eventArgs.view.outerWidth; 
var appHeight = eventArgs.view.outerHeight; 
    ... 
} 
 
window.addEventListener("resize", handleResize); 

同样在 在XAML 中你可以使用当前的窗口的SizeChanged 事件创建一个事件处理器:

c#

private void OnWindowSizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) 
{ 
double AppWidth = e.Size.Width; 
double AppHeight = e.Size.Height; 
} 
 
Window.Current.SizeChanged += OnWindowSizeChanged;

在编写 Windows 8 应用时, 你同样可以使用Win RT 来直接查询当前的视觉状态 Win Rt 提供了个描述应用视觉状态的 枚举

JavaScript

var currentViewState = Windows.UI.ViewManagement.ApplicationView.value; 

c#

var CurrentViewState = Windows.UI.ViewManagement.ApplicationView.Value; 

同样 使用JavaScript 写的Windows8 应用支持msMatchMedia 方法 ,使用DOM 窗口对象 可以用于 a condition with multiple media queries (啥意思。。。。 )例如: 1600像素宽的全屏景观模式(full-screen landscape )

JavaScript

var isSnapped = window.msMatchMedia(“(-ms-view-state:fullscreen-landscape) and  
(min-width: 1600px”).matches; 
JavaScript 
function handleSnappedMode(mql) { 
if (mql.matches) { 
        ... 
        } 
} 
window.msMatchMedia(“(-ms-view-state:fullscreen-landscape) and (min-width:  
1600px”).addListener(handleSnappedMode); 

在客户预览版中的 缩放和视觉状态(Resize and view state in consumer preview)

现在我们已经了解了如何访问视觉状态屏幕尺寸的基础方法。现在来讨论下如何使用这些功能来处理屏幕缩放(screen resize )。 在Window 8 客户预览版中,订阅缩放事件(resize event)和视觉状态事件(view state event)的触发顺序是确定的, 视觉状态变化事件(和相关的回调函数)总是发生在缩放事件(resize event),因为你总是必须等待在触发缩放事件(resize event)之前访问当前的视觉状态。 这将给你一个简单和统一的途径在代码中去处理尺寸和 视觉状态的改变。 在等待缩放事件(resize event) 触发(和等待任何随同的回调函数调用) 你可以确定返回的显示区域和视觉状态信息是同步的。

我同样建议 你可以使用缩放事件(resize event)去处理layout 的改变(you use resize events to trigger code that handles layout changes)因为有一些缩放事件(resize event ) (例如: 修改显示器分辨率和远程连接到一个PC) 并不会倒是视觉状态改变。此外,这是一个好的开发方法用来确保代码是在同一的地方处理layout 的变化,即便有不同的代码被不懂的屏幕改变事件(screen chnage event) 调用。

比如: 你想写一个根据当前屏幕分辨率大小下载不同的背景图片的应用。在Snapped模式中 你也许希望下载一个小的瓷贴悲剧图, 在filled 模式中 你希望是一个4:3 的图或者是一个用户full screen-landscape模式中的16:9 图片。同时你想根据不同的屏幕高度选择不同的图片分辨率 以满足不同的高宽比。

接下来的指导中,我们写了个缩放事件(resize event )回调函数,这个函数使用WinRT API 查询当前的视觉状态:

JavaScript

function handleResize(eventArgs) { 
var currentViewState = Windows.UI.ViewManagement.ApplicationView.value; 
var appHeight = eventArgs.view.outerHeight; 
var appWidth = eventArgs.view.outerWidth; 
 
// downloadImage requires accurate view state and app size! 
    downloadImage(currentViewState, appHeight, appWidth); 
} 
 
window.addEventListener("resize", handleResize); 

C#

private void OnWindowSizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) 
{ 
    var CurrentViewState = Windows.UI.ViewManagement.ApplicationView.Value; 
    double AppWidth = e.Size.Width; 
    double AppHeight = e.Size.Height; 
 
// DownloadImage requires accurate view state and app size! 
    DownloadImage(CurrentViewState, AppHeight, AppWidth); 
} 
 
Window.Current.SizeChanged += OnWindowSizeChanged; 

相比之下, 我们在视觉状态变化时触发的回调函数中查询应用显示区域大小( we were to query the app display area size in a callback function triggered by a view state change)我们需要获得当前的视觉状态信息,但是应用显示区域大小并不会立即更新。 在这样的情况下, 如果我们的应用从snapped 模式过渡到 fullscreen-landscape 模式,应用宽也许是320 像素视觉状态也许是fullscreen-landscape. 如果我们根据这些信息去下载图片我们将得到一个错误的图片。

这个缩放事件(resize event )触发回调的方式适用于太多的其他情况。比如: 在JavaScirpit中 如果你希望修改根据视觉状态修改ListView的部署从Grid 到List,那么你需要设置一个视觉状态改变的回调。 但是在屏幕改变之前设置ListView 布局会导致将两个布局传给了ListView ——一个是屏幕改变之前的一个是之后的(WinJs ListView 会自动处理缩放事件(resize event)但是不会处理视觉状态改变事件(view state change event ) )。 还是之前那个下载图片的例子, 用户也许不会直接看到这个区别, 但是应用将会开销更多的时间处理布局,将导致运行缓慢和相应延迟。 所以 较好的方式是等待回调, 由于屏幕改变是在你查询当前视觉状态之前然后设置相应的ListView布局。

JavaScript

function handleResize(eventArgs) { 
var isSnapped = (Windows.UI.ViewManagement.ApplicationView.value ===  
Windows.UI.ViewManagement.ApplicationViewState.snapped); 
listView.layout = isSnapped ? new WinJS.UI.ListLayout() : new WinJS.UI.GridLayout(); 
} 
 
window.addEventListener("resize", handleResize); 

在 XAML中 个人的意见是: 在不同的视觉状态切花是使用 View State Manager(VSM) API 去定义不同的视觉状态元素。 如果你使用 Visual Studio 201 Beta 你可以看见一个在程序模板中的Grid APP template 中定义这些API的例子。

XAML

<VisualStateManager.VisualStateGroups> 
<!-- Visual states reflect the application's view state --> 
<VisualStateGroup> 
<VisualState x:Name="FullScreenLandscape"/> 
<VisualState x:Name="Filled"/> 
 
<!-- The entire page respects the narrower 100-pixel margin convention for portrait --> 
<VisualState x:Name="FullScreenPortrait"> 
<!-- definition of what UI elements should display or change would go here in Storyboard  
elements --> 
</VisualState> 
 
<!-- The back button and title have different styles when snapped, and the list representation  
is substituted for the grid displayed in all other view states --> 
<VisualState x:Name="Snapped"> 
<!-- definition of what UI elements should display or change would go here in Storyboard  
elements --> 
</VisualState> 
</VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

注意: 这些VisualState Group 是为不同的视觉状态定义的。 当状态改变时可以在代码中的SizeChanged 事件中修改他们

C#

private void OnWindowSizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) 
{ 
// get the view state after the size has changed 
string CurrentViewState = Windows.UI.ViewManagement.ApplicationView.Value.ToString(); 
 
// using VisualStateManager make sure we navigate to the correct state definition 
VisualStateManager.GoToState(this, CurrentViewState, false); 
} 

如你所看到的在这例子中使用VSM 结合 SizeChanged 和 ApplicationView API 提供了个灵活的机制以适应屏幕变化

结论:

在本文中我们讨论了如何检测屏幕变化事件 和 视觉状态事件, 在客户预览版中我们建议你 在屏幕大小改变前通过WinRT API 查询视觉状态信息。如果你遵循这些建议你的代码能获取到正确的屏幕尺寸和视觉状态。要进看更多的例子可以看 Windows 8 SDK sample 。我们同样邀请你就有关此主题的进一步思考和反馈!

--Chris Jones, Program Manager, Windows

With special thanks to Tim Heuer, who helped craft this blog post.

本文同步发表于:WP7开发论坛 Windows Phone Developer Network: http://www.wpdevn.com/showtopic-115.aspx

本文链接

相关 [更多 像素 windows] 推荐:

(译)使用更多的像素——Windows 8 屏幕和视觉状态适配

- - 博客园_首页
本文同步发表于:WP7开发论坛 Windows Phone Developer Network: http://www.wpdevn.com/showtopic-115.aspx. 原文: http://blogs.msdn.com/b/windowsappdev/archive/2012/04/19/getting-the-most-out-of-your-pixels-adapting-to-view-state-changes.aspx.

Windows XP PC感染更多rootkit病毒

- Orzogc - Solidot
杀毒软件公司Avast Software调查了超过60万Windows PC,发现在感染rootkit病毒的PC中,Windows XP PC的比例与其市场份额不相称. 十年历史的Windows XP在所有Windows PC中的使用比例为58%,但在所有感染rootkit病毒的PC中占了74%. Windows 7的使用比例为31%,而感染比例仅为12%.

2GB+300万像素足矣:微软公布低端Windows Phone硬件标准

- 洞箫 - cnBeta.COM
  早在今年4月份的微软MIX11技术会议上,微软针对手机制造商讨论了Windows Phone新的硬件最低要求. 当时出炉的最新硬件标准显示Windows Phone最低要求内置储存为8GB,不过近日ZTE Tania的发布打破了这一标准,其内置储存仅为4GB. 不难看出,微软似乎为了获得更多厂商的支持修改了部分标准.

更多企业选择Mac和iPad 抛弃Windows PC

- - 博客园_新闻
更多企业选择 Mac 和 iPad. 1月 11 日消息,据国外媒体报道,市场研究机构 ForresterResearch 发布的最新报告显示,越来越多的企业选择 Mac、iPad,而不是 Windows 电脑. Forrester Research 称,虽然 Windows 电脑到 2013 年仍将在办公场所占据主导地位,但是苹果产品正改变企业硬件市场.

即将推出的 2,400 万像素 Sony A77 更多规格及照片漏出

- Thomas - Engadget 中国版
Sony A77 的规格与照片在经过了无数次揭露后,其实拼拼凑凑我们也知道的差不多了. 目前传出的可能规格为由 ISO 100-16000 并可延伸至 ISO 50 的 2,400 万像素 Exmor HD CMOS 感光组件、具备每秒 12 张连拍与 1/8000 的快门速度还拥有 19 点的自动对焦系统,还可能内建闪灯及 GPS 功能等令人惊喜的规格,这些规格也 符合 Sony 所荣获的奖项的说明,应该有不错的可靠程度.

Windows Phone 的 WordPress 入门套件释出,期望吸引开发者端出更多优质软件

- kxxoling - Engadget 中国版
对于 Wordpress 的爱用者们来说,应该没有什么比得上发现 Windows Phone 平台上,竟没有提供该网站优化版的移动软件要来的令人失望了吧. 不过不用担心,Microsoft 现在已经释出入门套件,让开发 Wordpress 的行动软件变得更为简易快速. 通过此工具开发程序,开发者将仅需在其所提供的骨干代码,简单地取代单行程序代码加入部落格网址并调整几项 CMS 的选项设定即可完成.

Windows 8就是Windows 6.2

- Darth Noctis - cnBeta.COM
Windows Vista内核版本号为Windows 6.0,Windows 7为Windows 6.1,微软近日也证实,Windows 8就是Windows 6.2,尽管这个消息已经是尽人皆知了. 想必微软在Vista身上受到了惨痛的教训,以至于今后很长一段时间都无法痊愈. 如果Windows 8下一代的内核版本号采用Windows 6.3,你也不必太过惊讶.

Windows工具集

- - 互联网 - ITeye博客
参考: https://community.rapid7.com/servlet/JiveServlet/downloadBody/2881-102-2-6389/Mitigating%20Service%20Account%20Credential%20Theft%20on%20Windows.pdf.

Windows Phone已死,Windows Phone 将死?

- Yu - cnBeta.COM
现在Windows Phone的销售是一个茶几啊. 微软已经承认,Windows Phone的表现低于预期. 而在4-6月这个季度的数据显示,Windows Phone的销量只有140万台,市场占有率只有1.3%,已经达到了历史上的新低. 而comScore的最新数据也表示,他在美国和欧洲5国的总市场占有率也由2.8%下降到2.2%.

windows下配置node.js

- We_Get - CNode社区
Cygwin网站:http://cygwin.com/,Cygwin是什么就不多说了,反正是必须的. 先下载setup文件,就算安装完了这个文件也别删,以后万一还有用得着的地方. 如果首次安装有些包忘记装了,还得用这个再次安装. 我一开始就忘记了好几个包,导致浪费了好多时间. 主要是记得第一个界面时选择“install from internet”,否则就会失败.