前言

每一个页面都是这个App的门面,尤其是主页面,看上去干净整洁清爽宜人容易操作,那么你的App就成功了一半。这也反映出了你这个开发团队的基本审美素质和设计理念。如果你不是一个团队,而是一个个人开发者,建议你好好读读以下心得体会,相信会帮助你做出好看而实用的App。用一堆拥有丑陋UI的App充斥Window Store,不是我们高大上的程序员所为,被其他手机开发平台的开发者们耻笑。

三大纪律:

1)不乱用颜色。一个页面内不要超过3种颜色

2)不乱用大图片当背景。你是想让用户看你的背景图片呢,还是看你的内容?

3)不乱填充内容。页面元素如果太满,给读者压抑感,无所适从。

八项注意:我们从字号,字体,颜色,导航栏,标题栏,内容区,菜单栏,间距与对齐等八个方面介绍了我们开发App的心得体会。

字体

推荐一律使用Segoe WP字体。在特殊的显示符号的地方,可以使用其它字体,如:Segoe UI Symbol。有些字体在设计时可以呈现,但是在deploy到手机上后毫无效果,原因是手机上没有你指定的字体。

文字大小

在WP的设置中,有一项文字大小设置:

缺省时,文字最小,slider处于最左侧的位置。但是看邮件时太费劲啦,尤其是英文邮件,再加上喜欢坐城铁,基本上看几分钟我的K金狗眼就瞎了。所以我一般会把这个文字调到上图的大小。这时,WP内置的“节电模式”应用会这样:

看那个“节电模式”四个字,比上面的“设置”两个字大一些吧,这个页面的其它所有文字也都比正常要大。我不知道这是by design呢,还是bug呢?反正其它的内置App不这样。 这一点会被大多数人遗忘,以至于一些很有名头的App,或者是上述WP自带的App本身都掉入此坑。这个如何避免呢?

在Page中加入这么一句话即可:

<Page
......IsTextScaleFactorEabbled="False">

这个定义是告诉WP:我的App忽略那个文字大小调整的影响。否则,你所有的文字相关的控件,都会变得巨丑无比,整个UI就毁了。

在Windows 8.1中没有这个设置,因此以上代码只能在Windows Phone Project中编译通过,因此这句话要写在Page中,而不能写在任何Shared Project的XAML中。

主题色

看到应用商店中的很多简单的App都使用了黑色作为主题色,无非是以下几个原因之一:

1)是一个简单的App,没有designer,没仔细设计过,干脆用黑色的

2)看到Windows Phone自带的App都是黑色,以为黑色就是官方指定的

3)黑色上显示白色的字,天经地义,不用做特殊设置

4)黑色是万能搭配色

以上这些都可以理解。但是一个纯正的第三方App绝不可以用黑色,一个是避免和WP自带的App混淆,一个是避免别人以为你偷懒用个黑色在这里充数。反正我个人没见过哪个口碑好的App是用黑色的。如果是自己用黑色做个App随便玩玩也就罢了,一旦上传到应用商店去,就只能说明又多了一个屌丝了,注意素质。

最简单的避免成为屌丝的方法很简单:

1)定义一个主题色(比如就用红色怎么啦,和IT之家似的),用于标题栏,可点击文字(带link)等场合

2)定义一个浅主题色(可选),用于菜单栏

3)用一个白色或浅灰色(假设主题色是深色)做大字体颜色(比如标题栏之内的文字)

4)用一个深灰色做大量文本的颜色(在白色背景下)

反正一共就4种颜色就够了,足以展示程序员的素质了。如果要精益求精,还需要更多一些的颜色,比如作者/发布时间的颜色,摘要的颜色,以及下方attribution的颜色(推荐/阅读/评论)。

主题色也应该在Page中这样定义:

<Page
......RequestedTheme="Light"
......>

这样你就省去了在code中写this.RequestedTheme = Light的麻烦,这是为了做日间模式和夜间模式的切换。

状态栏

状态栏,就是Windows Phone顶部的那个大概有25像素高的横条,平时显示网络状态,时间,电池状态等等。下图中黑色的部分就是状态栏。

原则:不要轻易决定隐藏状态栏,除非你是在做一个游戏。因为在大多数情况下,用户是希望能随时看到自己的WIFI网络状态、电池状态和当前时间的。节省25个像素而用于显示更多的应用内容的想法有点儿小气。

如何隐藏状态栏呢?在Silverlight中,是在Page的XAML设置一个属性(忘记是什么了),但是在Win RT SDK中,目前知道的必须用code做这件事:

await Windows.UI.ViewManagement.StatusBar.GetForCurrentView().HideAsync();

一旦在一个页面内调用了上述语句,那么在该App本次的以后使用过程中,顶部状态条都不会再显示了,除非你再调用ShowAsync()来显示它。

如何让状态栏和你的App的色调搭配和谐呢?你应该在Page里这样定义:

<Page
......Background="{ThemeResource MyAppThemeColor}">

这里假设你在StyleDictionary.xaml里设置了MyAppThemeColor的值。这样的话,这个页面的状态栏也会被刷成应用主题色,一般来说会和你的这个页面的顶部标题栏颜色一致,看上去比较顺眼的啦。

但是这导致了一个问题:如果你的App有下方的命令栏(Command Bar)而且是淡蓝色背景,在页面切换动画时,能看到命令栏后面的深蓝色背景一闪而过,不太协调,原因是上面那个设置把整个页面都设置成了深蓝色,包括底部命令栏的后背景。这个虽然不是大问题,但作为程序员的我们一定要知道当有人Challenge这件事时,我们如何解决。

为了避免这个问题,我们可以只设置状态栏的背景色,而不设置页面背景,用code做:

Windows.UI.ViewManagement.StatusBar statusBar = Windows.UI.ViewManagement.StatusBar.GetForCurrentView();
statusBar.ForegroundColor = CNBlogsThemeColor;

但是别忘了去掉上面Page里的Background设置。

标题栏

博客园的标题栏设计如下:

特简单。注意了吗,页面上没有“博客园”或“CNBlogs”字样。同学们一般习惯把“博客园”字样作为Pivot的Title放在本页的最上方,但是仔细想想那有什么意义呢?人家用你这个App的人,知道你这是博客园,为何一定要占据宝贵的空间来展示自己的自恋情结呢?

另一个页的标题栏设计如下:

高度/颜色/字体等和其他页完全一致,切换页面时无跳跃感。和Android的App的最大区别是:由于Windows Phone有特定的底部Command Bar来放置命令按钮和菜单,所以顶部的标题栏一定不要再放任何可以操作的东西啦,而只能用于信息展示。比如上图,告诉你当前页面显示了热门博客的前20条。那个“2日内阅读排行”是一个辅助手段,告诉你当前页的具体展示类别。这么多字在标题栏里放不下,所以放在这里会随着ListView的滚动而上移从而隐藏。

内容区

内容区不要太杂,最好只放一类东西,除非你是在做那个叫做“找你妹”的游戏。如果只有一类内容,那么我们一般用ListView就搞定了。如果有两类以上的内容要显示,最好放在两个页面内;如果非要在一个页面内,就用这种方式:

用一个蓝条分开了不同种类的内容,而且每类内容可以单独展开或收起。这里你还可以选择用ListView的分组方式展示数据,第一个分组标题是“分类”,第二个分组标题是“博主”等等,但是不是最佳选择,因为两类内容的模板不一致,需要写很多code来实现。

菜单栏

菜单栏也有几个小技巧可以分享,看下图:

1)我们使用了主题色来显示菜单项和按钮(Foreground = CNBlogsThemeColor)

2)用淡雅主题色来作为菜单背景(在Flyout Menu的弹出式菜单中也是如此)(Background = CNBLogsThemeLightColor)

3)使用标准ICON做按钮,如果不够用,在Segoe UI Symbol中基本上可以找到你要的东西,就不要麻烦designer再去画了。如果非要自定义的话,就画一个25x25 png,放在40x40的png内。你可以试试其它尺寸,很难看的。

4)重要操作放在上面的按钮中(最多4个),不重要的放在菜单中,这个你自己定吧。

这个菜单栏的样式定义如下:

<Style TargetType="CommandBar"><Setter Property="Background" Value="{ThemeResource CNBlogsThemeLightColor}"/><Setter Property="Foreground" Value="{ThemeResource CNBlogsThemeColor}"/>
</Style>

这个定义放在了StyleDictionary.xaml中,这样所有页面的菜单项都会是同一个样式了。

间距与对齐

间距是屌丝程序员经常忽视的问题,但其实它是隐藏最深的能影响用户体验的关键元素之一。我们举例说明吧,看下图:

每个红色的圆形都表示一个间距(人家Designer给的设计叫做Redline,用红色直线表示),对称位置的两个间距要保持一致,整个界面才能好看。比如1和2,3和4,5和6,7和8,都要保证数值一样。

从对齐上看,标题区的WinRT/Metro的左边距,ListViewHeader的左边距,以及每篇博客的左边距都是一致的。

再比如设置页面,也是丝毫不能马虎,看那些红色的线条的长度,必须保证一样长:

小结

Windows 8.1上的App对审美的要求其实更高,因为它的显示面积大,不像Windows Phone上可以随便用点儿什么手段就能填满屏幕。我们会有专门一篇Blog介绍博客园 UAP的Windows 8.1版本的界面设计。

作为同样屌丝的我,实在是写不出什么更好的东西,只是在和designer接触过程中学了些皮毛,让大家见笑了。总之几句话概括一下:注意颜色,注意字体,注意间距,注意内容。让我想起了解放军的三大纪律八项注意,违纪者扣6分罚200!把自己的脸整容成雷锋也不行!呵呵,又扯远了…

分享代码,改变世界!

Windows Phone Store App link:

http://www.windowsphone.com/zh-cn/store/app/博客园-uap/500f08f0-5be8-4723-aff9-a397beee52fc

Windows Store App link:

http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059

GitHub open source link:

https://github.com/MS-UAP/cnblogs-UAP

MSDN Sample Code:

https://code.msdn.microsoft.com/CNBlogs-Client-Universal-477943ab

MS-UAP

2015/1/12

转载于:https://www.cnblogs.com/ms-uap/p/4218662.html

博客园客户端UAP开发随笔 -- App UI设计的三大纪律八项注意相关推荐

  1. 博客园客户端UAP开发随笔 -- App连接云端内容的桥梁:WebView

    当你辛苦的从网上爬下来一篇文章之后,怎么在你的应用内展示这些包含HTML标记的文章?如果你使用的是Javascript开发应用,恭喜你,直接塞进页面就可以了,同时说明你很熟悉页面开发,而现在windo ...

  2. 博客园客户端UAP开发随笔 -- 搭建App之间的桥梁

    开发Windows Phone应用的同学们应该都注意到了,Windows Phone 为了安全性,对应用的限制还是比较多的.我记得一位360的同学很无奈的说:WP太安全了,我们这些做WP上360卫士的 ...

  3. 博客园客户端UAP开发随笔 -- 适配不同尺寸的屏幕

    Windows 8诞生之初,Modern apps被设计在运行于全屏模式下.为了让Windows在运行Modern app时继续拥有前台多任务能力,Windows引入了一种全新的分屏技术"S ...

  4. 【完全开源】博客园客户端UWP版(上篇)

    目录 说明 PC截图 手机截图 关于源码 说明 这段时间一直在研究UWP开发,前段时间MS-UAP发布了淘宝UWP版,支持win10手机,看起来很叼.之后为了练手做了这个博客园客户端.目前只完成了一部 ...

  5. 【博客园客户端】博客园Android客户端正式发布

    原文地址为: [博客园客户端]博客园Android客户端正式发布 [最新消息]博客园Android客户端已经进驻官方Market,请各位园友果断给好评(手机Android Market中搜索" ...

  6. 用Qt写软件系列六:博客园客户端的设计与实现(1)

    引言 博客园是本人每日必逛的一个IT社区.尽管博文以.net技术居多,但是相对于CSDN这种业务杂乱.体系庞大的平台,博客园的纯粹更得我青睐.之前在园子里也见过不少讲解为博客园编写客户端的博文.不过似 ...

  7. 博客园客户端登录测试

    这是一个简单的博客园客户端登录,发送文章工具,主要用来测试socket通信,实现功能登录博客园,发表文章. 这是一个很简单的测试,未使用多线程,会有一种假死的现象,源码如下: 源码下载 1.登录界面 ...

  8. 用Office2010做博客园客户端

    关键字:Office2010发布cnblogs文章 原创啊,这个真的是原创的~~! 如何用Office2010作为博客园cnblogs的客户端: 1.打开Office2010,在"新建&qu ...

  9. 笔记-配置博客园客户端代码高亮(2016.08.20)

    参考博客文章:http://www.cnblogs.com/rollenholt/archive/2012/03/08/2384594.html 下载Window Live Writer 2012 最 ...

最新文章

  1. mysql 所有表的字段信息_mysql如何查询所有表和字段信息
  2. 如何使用 Arthas 定位 Spring Boot 接口超时 ?
  3. 如何成为一名现代的Linux程序员
  4. 闸流管(或双向可控硅) IGBT 应用
  5. 3.2 表达式的类别与类型
  6. boost::io::ostream_joiner模块相关的测试程序
  7. 记一次企业级爬虫系统升级改造(一)
  8. [Vue.js] 基础 -- 案例之Tab选项卡
  9. 解决 pathForResource 返回 nil的问题
  10. Apollo 对表名区分大小写 如何配置MYSQL不区分大小写呢
  11. 「快学springboot」SpringBoot整合freeMark模板引擎
  12. 【CS61A】学习笔记
  13. seo与sem的区别
  14. python金额转换汉字为数字
  15. 微信小程序云存储(文件上传到云端)
  16. Eclipse4.6(neno)配置Tomcat插件
  17. 【TV Picture Quality - 02】TV常见信号接口
  18. linux系统资源分析 - CPU篇
  19. SpringFramework教程
  20. 集群环境下,谁偷走quartz配置的定时任务

热门文章

  1. 解决H5在移动端overflow:scroll滚动条默认不显示和滚动后消失的问题
  2. 组合数学在计算机中的应用,组合数学在计算机科学中的应用
  3. 一、虚拟化技术发展概述
  4. 2022年第七届数维杯大学生数学建模挑战赛报名通知
  5. Spring Cloud OAuth2中访问/oauth/token报Unsupported grant type: password问题的解决
  6. 使用okHttp下载文件到本地
  7. ASP.NET中 RadioButtonList(单选按钮组)的使用
  8. mac电脑升级Monterey12.1版之后L2TP连接公司内网后无法正常访问的问题解决
  9. 糖尿病合并高血压高龄奥密克戎感染重症、危重症患者诊疗建议 v0(手稿)
  10. TiDB at ZaloPay Infrastructure Lesson Learned