I liked this: iphone Web App 导航设计探讨

23 10月

最近在做iphone端Web App的项目。由于产品形式新颖,技术环境不成熟,公司给与了较宽松的研发时间。在一个月的交互设计阶段,每个环节都得到多次讨论推敲,我从中感悟颇多。导航系统的设计是一个比较典型的点,拿出来与大家分享讨论一下。
导航系统所遭遇的挑战

iphone Native App较常见的导航如下图所示:

手机屏幕底端:A、B、C、D四个tab组成该Native App的全局导航,这是我们经常见到的tab导航栏。

手机屏幕顶端:主要有四种形式。第①种形式是在该位置中心显示产品的logo;也可以将logo适当调整位置,将常用操作或快捷入口放在该位置的右侧。第②种形式是在该位置有两或三个tab选项。第③种形式是在该位置中间显示当前任务标题,在左右两侧放置导航控件或功能控件。第④种形式是在该位置放置搜索框。

与以上的Native App导航方式相比,Web App导航方式有着巨大的不同,如下图所示:

Safari浏览器的工具栏将一直占据着屏幕的底端位置,全局导航只能被动移动到屏幕的顶端位置。这是影响Web App导航设计的最重要因素。

如果产品的功能比较少,且没有特别要突出的功能的时候,可以设计成上图中第①种导航方式。此时存在的问题是如何表现出产品的品牌,毕竟在Safari浏览器登录某网站比运行一个Native App给人的品牌认同感弱很多。

如果将产品logo表现出来,且产品需要将用户常用功能突出(比如刷新功能或者发布入口),就需要设计成上图中的第②种导航方式。

如果在A功能板块下,还需要设置子类别选项,则导航栏中又多一组tab。此时的导航方式就如同上图中的第③种了。

当然,在执行某一项任务的时候,全局导航可以暂时“归隐”,只保留一行标题栏和左右两侧的导航控件或功能控件。如上图中第④种导航方式所示。

在该产品设计中,为方便用户在各功能板块之间快速省力地切换,设计师希望全局导航栏可以保持长久悬停,不要像一般wap网页似的让导航随网页滚动消失。这样的话,基于浏览器的Web App 导航系统便捷性就和Native App相媲美了。

然而,浏览器工具栏将全局导航逼到了屏幕的顶端,却又造成了导航头部过于沉重的问题。如下图所示:

如果将logo栏中的常用功能(例如刷新或发布入口)和全局导航都设计为悬浮停留的形式,内容区的信息展示空间就比Native App减少了一行的高度,如上图中的①。而且,某些页面需要在全局导航的下方出现二级导航;悬停不动的3行导航大大吞噬了屏幕本来就很宝贵的内容显示空间,如上图中的②。

让用户在如此狭小的空间不得不频繁滑动屏幕浏览信息,这样的体验太糟糕了。这个严重的问题很让设计师困扰,因此需要重新设计一下导航系统。设计过程主要包括:优秀竞品分析、方案遴选。

优秀竞品分析

首先,分析对比了三款优秀的Web App:Google+、FT Web App、Twitter的导航方式。浏览环境均为iphone Safari浏览器。

1.Google+

导航系统特点:

全局导航单独形成一个页面,其他页面不出现全局导航;

导航栏沿用了ios系统原生控件的形式:标题+导航或功能控件;

标题栏在页面中悬停不动

优点分析:

保证了每个信息浏览页面的导航栏简洁轻薄,尽量少的占用信息详情的显示空间;保证了其核心功能(此处是微博浏览功能)的良好使用体验。

缺点分析:

全局导航隐藏较深,降低了用户在不同功能板块快速切换的便利性;全局导航隐藏较深,用户看不到其它板块功能,大大降低了用户点击使用其他功能的可能性。

2. FT Web App

导航系统特点:

Safari浏览器URL一栏一直悬停存在,并将品牌文字FT Web App显示在顶端;

全局导航被隐藏起来,点击功能键后在页面顶端出现;

二级导航出现在页面顶端;

全局导航和二级导航由于新闻板块数量较多,都采取了单行空间不完全呈现的方式,可滑动选择其中某一项;

所有导航随页面滚动,不在屏幕中保持悬停;

优点分析:

FT Web App导航设计最大的优点就是繁重导航的轻量化处理。全局导航和二级导航中的新闻板块都非常多,若将这些板块都展示出来,恐怕要占用屏幕的一半显示空间。FT Web App于是将全局导航隐藏在一个功能键之后,二级导航也只给了一行的显示空间。

缺点分析:

展示给用户的导航只是其全部新闻板块的冰山一角,无法给予用户全部概况浏览的机会,也就无法很好的激励用户去尝试被隐藏的新闻版块;同时,用户寻找某一个新闻版块或者在页面底端回到页面顶端的操作成本略高。

3.Twitter

导航设计特点:

全局导航只有一行,品牌展示浓缩在主页图标中(Twitter小鸟图标);

全局导航一直保持在屏幕顶端悬停不动,不随页面滚动而滚动;

二级导航在点击全局导航某tab后,以菜单列表形式出现。

优点分析:

在屏幕顶端悬停不动的全局导航,可以方便用户在不同的功能板块之间快捷切换,降低了用户的信息寻找成本;Twitter Web App的导航只有一行,为用户保证了尽量大的正文内容显示空间。

缺点分析:

一些常用的功能键被隐藏在二级导航中(比如新信息发布入口),一方面增大了用户的寻找成本,另一方面降低了这些常用功能对用户的激励使用效用。

基于对以上三款Web App产品导航系统的分析,设计师对目标项目的导航系统设计形成了以下框定:

全局导航方便用户快速寻找以及功能板块间的切换;

导航尽量轻薄化处理,尽量保证足够的正文内容区显示空间;

将用户经常使用的功能键呈现在前面。

方案遴选阶段

基于项目的实际需要以及对竞品分析的思考总结,设计师尝试了3款导航设计方案,并对每一款方案的优劣之处进行了详细分析。

导航设计方案一

设计说明:

ABCD是产品的四个功能板块,组成全局导航。

全局导航在屏幕顶端保持悬停不动。

E是新消息发布入口,属于用户常用功能。

E采用半透明显示方式。

E停留在屏幕的右下角

该方案的优点:

屏幕顶端只有全局导航一栏,导航的轻量化为正文内容区节省了尽量大的显示空间;全局导航悬停不动,可以便于用户快速切换到不同的功能板块。

该方案的缺点:

右下角的新信息发布入口致使浏览页面不够清爽,会对用户造成一定的视觉干扰;新信息发布入口没有必要在任何页面都显示,于是可寻性出现了危机;品牌logo无法显示,品牌感较弱。

导航设计方案二

设计说明:

E是新消息发布入口,属于用户常用功能。

ABCD是产品的四个功能板块,组成全局导航。

屏幕顶端的两行导航栏在用户刚进入页面的时候出现,在用户滑动屏幕浏览信息的时候消失。

屏幕右下角半透明功能键在导航栏消失后出现,点击该键导航栏出现。

该方案的优点:

浏览信息的时候导航栏消失,为用户提供提供了最大的正文内容显示空间;可以显示logo,品牌感较强;新信息发布入口的可寻性较好。

该方案的缺点:

屏幕右下角半透明功能键致使浏览页面不够清爽,会对用户造成一定的视觉干扰。

导航设计方案三

设计说明:

E是新消息发布入口,属于用户常用功能。

ABCD是产品的四个功能板块,组成全局导航。

屏幕顶端的两行导航栏在用户刚进入页面的时候出现,在用户滑动屏幕浏览信息的时候第一栏向上消失,第二栏上移至顶部保持悬停不动。

手动下拉全局导航栏,可以下拉出第一栏导航。

该方案的优点:

浏览正文信息的时候,仅显示全局导航一栏,做到了导航的轻薄化;全局导航悬停不动,可以便于用户快速切换到不同的功能板块。

该方案的缺点:

下拉全局导航时,可能会有误操作的危险,虽然可能性很小。

综合以上的分析,考虑到正文内容区显示空间的大小、对产品的操作便利性以及产品品牌感三方面因素,最终决定将方案三作为导航设计的基本形式,并继续进行进一步丰富细化。

总结:

浏览器的工具栏一直占据着屏幕的底端位置,全局导航只能被动移动到屏幕的顶端位置。如何平衡操作的便捷性与正文信息显示空间最大化的关系,是Web App导航设计的关键所在。

最佳方案总是权衡的结果。每一款设计方案解决某些问题的同时也会产生新的问题。此时设计师需要知道哪些功能是最重要、优先级最高的,保证核心功能的良好用户体验是评判设计方案的重要准绳。



posted on 网易用户体验设计中心博客: http://uedc.163.com/7998.html

Advertisements

I liked this: 使用socket.io和node.js搭建websocket应用

7 10月

http://feedads.g.doubleclick.net/~ah/f/mblfmm6fhtqrklq9d6687fcj2g/468/60#http%3A%2F%2Fwww.js8.in%2F784.html

websocket是HTML5的一种新的通信协议,它是实现了浏览器与服务器的双向通讯。在 WebSocket API 中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
关于websocket的更多信息,请移步维基百科

使用WebSocket

在客户端使用websocket需要创建WebSocket对象,通过提供的open、send、message、close等方法实现创建、发送、监听信息、关闭连接。例如下面的代码:

if('WebSocket' in window){
	// 创建websocket实例
	var socket = new WebSocket('ws://localhost:8080');
	//打开
	socket.onopen = function(event) {
	  // 发送
	  socket.send('I am the client and I\'m listening!');
	  // 监听
	  socket.onmessage = function(event) {
		console.log('Client received a message',event);
	  };
	  // 关闭监听
	  socket.onclose = function(event) {
		console.log('Client notified socket has closed',event);
	  };
	  // 关闭
	  //socket.close()
	};
}else{
	alert('本浏览器不支持WebSocket哦~');
}

现在chrome、firefox等浏览器都已经支持了websocket,而IE却没有。下面我们来简单说说服务器端对websocket的支持。

服务器端支持websocket的语言不少,而且都有相关的开源项目,例如php的phpwebsockets:http://code.google.com/p/phpwebsockets/,java的jWebsocket:http://jwebsocket.org/
更多的信息可以浏览这篇文章:Start Using HTML5 WebSockets Today

socket.io

socket.IO是一个websocket库,包括了客户端的js和服务器端的nodejs。官方地址:http://socket.io

客户端使用socket.io

去github clone socket.io的最新版本,或者直接饮用使用socket.io的CDN服务:

<script src="http://cdn.socket.io/stable/socket.io.js"></script>

下面可以创建使用socket.io库来创建客户端js代码了:

var socket = io.connect('http://localhost');
socket.on('news', function (data) {
	console.log(data);
	socket.emit('my other event', { my: 'data' });
});

socket.on是监听,收到服务器端发来的news的内容,则运行function,其中data就是请求回来的数据,socket.emit是发送消息给服务器端的方法。

使用socket.io和nodejs搭建websocket服务器端

socket.io不仅可以搭建客户端的websocket服务,而且支持nodejs服务器端的websocket。

nodejs安装socket.io

使用node插件管理包,运行下面的命令就可以安装成功socket.io

npm install socket.io

没有npm的或者windows用户可以使用github下载socket.io并且放入到node_modules文件夹中,具体配置可以参考文章:《nodejs教程:配置nodejs.exe的windows目录结构

nodejs建立socket.io服务

通过nodejs的http模块就可以方便的搭建websocket服务器环境,例如下面的代码:

// 引入需要的模块:http和socket.io
var http = require('http'), io = require('socket.io');
//创建server
var server = http.createServer(function(req, res){ 
  // Send HTML headers and message
  res.writeHead(200,{ 'Content-Type': 'text/html' }); 
  res.end('<h1>Hello Socket Lover!</h1>');
});
//端口8000
server.listen(8080);
//创建socket
var socket = io.listen(server);
//添加连接监听
socket.on('connection', function(client){   
	//连接成功则执行下面的监听
	client.on('message',function(event){ 
		console.log('Received message from client!',event);
	});
	//断开连接callback
	client.on('disconnect',function(){
		console.log('Server has disconnected');
	});
});


保存为socket.js然后在命令行执行:node socket.js 即可启动服务器,现在访问localhost:8000就可以了。

使用express和socket.io

前篇文章我提到了nodejs的web框架:express,下面的代码就可以创建一个基于express和socket.io的socket应用:

var app = require('express').createServer(), 
	io = require('socket.io').listen(app);
app.listen(80);
app.get('/', function (req, res) {
	res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
	//发送消息给客户端
	socket.emit('news', { hello: 'world' });
	socket.on('my other event', function (data) {
		console.log(data);
	});
	//广播信息给除当前用户之外的用户
	socket.broadcast.emit('user connected');
	//广播给全体客户端
	io.sockets.emit('all users');
});

和客户端的方法一样,socket.io的监听都是使用on方法,发送使用emit方法。另外提供了广播功能:broadcast

写在最后

最近写文章比较勤,主要是怕自己十一放假回来头绪就乱了,所以在十一之前整理出来最近胡乱学习nodejs的一些心得体会,国内的nodejs资料太少了,学习成本挺高的。
前天晚上写的一个基于express+socket.io的聊天室已经放到了网上,欢迎大家下载测试:http://1.nodejsdemo.sinaapp.com/chat/chat.zip

下篇文章可能要写在express和socket.io中实现session认证。因为上面的聊天室用到了session判断用户是否登录。另外自己写了个nodejs的斗地主,可是逻辑相当的复杂,于是代码也就越写越烂,写到最后测试逻辑就开始混淆,有空还要整理下才能放出来哦~省的拿出去丢人。羞愧啊~

收藏本文到:新浪微博 | QQ书签 | 人人网 | 豆瓣 | 开心网 | 腾讯微博 | Google书签 | 百度搜藏
声明:文章未声明为原创文章,本文链接 http://www.js8.in/784.html. 转载请注明转自 JS8.IN ™

相关文章


© 断桥残雪 for 断桥残雪部落格, 2011. |
One comment |在微博关注我:@清-三水清

收藏到:
人人网 | 豆瓣 | 开心网 | QQ书签 | 新浪微博 | 腾讯微博

Post tags: , ,

posted on 断桥残雪部落格: http://www.js8.in/784.html

I liked this: 利用位反操作来简化 indexOf 判断

7 10月

补码

在计算机系统中,数值用补码来表示。任何数值 n 的位反等于 -(n + 1):

~n === -(n + 1)

可以得到:

~9 === -10
~8 === -9
~1 === -2
~0 === -1
~-1 === 0
~-2 === 1
~-9 === 8
~-10 === 9

很明显,只有 ~-1 才等于 0. 对非 -1 值取反永远不为 0.

String#indexOf

String 的 indexOf 方法,找到时,返回自然数;没找到,则返回 -1. 常见代码:

if (str.indexOf('sub') !== -1) {
  // code
}

利用位反操作,可简化为:

if (~str.indexOf('sub')) {
  // code
}

更普适的规律是:

  1. n !== -1 可简化为 ~n
  2. n === -1 可简化为 !~n

Array#indexOf

涉及状态判断时,很容易写出以下代码:

if (statusCode === 301 || statusCode === 302) {
 // code
}

利用 Array#indexOf, 上面的代码可简化成:

if ([301, 302].indexOf(statusCode) !== -1) {
  // code
}

用位反操作,可进一步简化:

if (~[301, 302].indexOf(statusCode)) {
  // code
}

类似的,可以:

if (~["loaded", "complete"].indexOf(readyState)) {
  // code
}

写在最后

一般来说,位反等简化方式有损可读性。可读性有两方面:

  1. 自己的代码给他人看。这时代码的通俗易懂很重要,尽量少用奇技淫巧。
  2. 自己看他人的代码。这时要让自己的知识面尽可能广,包括吃透各种奇技淫巧。

从学习的角度讲,吃透一些奇技淫巧,经常能深入到语言的部分底层细节,非常有益处。

还有一个不容忽视的现象:奇技淫巧有阶段性。好的技巧,在小圈子流行后,有可能会慢慢被大众接受,也就不再是奇技淫巧了,比如 (function(){ /* code */ })().

总之,技巧不怕多,权衡去用就好。


posted on 岁月如歌: http://lifesinger.wordpress.com/2011/09/30/simplify-indexof-using-bitwise-not/

I liked this: CSS Media Queries & Using Available Space

3 10月

We’ve covered using CSS media queries to assign different stylesheets depending on browser window size. In that example, we changed the layout of the entire page based on the space available. It isn’t required that we make such drastic changes with this technique though, so in this tutorial we’ll go over a design tweak with a smaller scope. We’ll also cover the syntax for using media queries within a single stylesheet and more examples of that.

The CSS media query syntax for calling an external stylesheet is like this:

<link rel='stylesheet' media='screen and (min-width: 701px) and (max-width: 900px)' href='css/medium.css' />

You may be familiar with the media attribute, normally being “screen” or “print” or even a comma separated list, like “screen, projection”. The media attribute can be brought directly inside a CSS file, like this:

@media screen {
      body {
          width: 75%;
      }
}

@media print {
      body {
          width: 100%;
      }
}

Likewise, you can use more advanced CSS media queries like:

@media all and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) {
  body {
    background: #ccc;
  }
}

You may use as many media queries as you would like in a CSS file. Note that you may use the and operator to require multiple queries to be true, but you have to use the comma (,) as the or operator to separate groups of multiple queries. The not keyword can be used to alter the logic as well.

Example

Let’s say we have a fluid width design where the sidebar is 35% of the width of the page. That means depending on the width of the browser window, that sidebar could be quite narrow or quite wide, that’s just the nature of fluid width designs. With CSS media queries, we can say “if the browser is really narrow, do this, if it’s wider, do this, if it’s really wide, do this.” Note that measuring width isn’t the only thing media queries can do, it’s just a particularly practical example.

In our example sidebar, we are going have a list of names of the Super Team which function as email links. The HTML is fairly simple:

<ul id="nav">
   <li><a data-email="chriscoyier@gmail.com" href="mailto:chriscoyier@gmail.com">Chris Coyier</a></li>
   <li><a data-email="isuredo@likeher.com" href="mailto:isuredo@likeher.com">Elisabeth Moss</a></li>
   <li><a data-email="marry@me.com" href="mailto:marry@me.com">Amanda Righetti</a></li>
</ul>

It’s just a list of links. The href attribute is a mailto: link. The only thing you might find unusual is the data-email attribute. In HTML5, you can use attributes prefixed with data- to store information, and it’s perfectly valid. We are going to want to use that data later, but the href value isn’t quite what we need having that mailto: link, hence the data attribute.

The default styling for the list will be this:

#sidebar ul li a {
  color: #900;
  text-decoration: none;
  padding: 3px 0;
  display: block;
}

At narrow browser window widths, the default styling applies. Just a list of links.

When the browser gets a bit wider, in our example between 520 and 699px, we’re going to use that extra space that opens up in the sidebar to apply an email icon to each list item.

@media all and (max-width: 699px) and (min-width: 520px) {
  #sidebar ul li a {
    padding-left: 21px;
    background: url(../images/email.png) left center no-repeat;
  }
}

Icons are applied to the list items as we know that we have room for them now.

As we get wider, from 700 to 1000px, we’ll use the extra space again to preface the links with the text “Email: ” (using CSS Content) instead of just the icon.

@media all and (max-width: 1000px) and (min-width: 700px) {
  #sidebar ul li a:before {
    content: "Email: ";
    font-style: italic;
    color: #666;
  }
}

Using CSS content / psuedo element, we can preface the link with descriptive text without altering the content in the HTML

Wider still, at browser window widths above 1001px, we’ll literally append the email address to the links. This is where that HTML5 data attribute comes in.

@media all and (min-width: 1001px) {
  #sidebar ul li a:after {
    content: " (" attr(data-email) ")";
    font-size: 11px;
    font-style: italic;
    color: #666;
  }
}

Again the content is adjusted, the email is added as a pseduo element purely with CSS.

At really wide widths, above 1151px, we will again add the icon as we used before. The cool part here is that we don’t have to write an additional media query segment, we can just append an additional media query to our already existing one using a comma (behaves like OR operator) on the medium-width one we already wrote.

@media all and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) {
  #sidebar ul li a {
    padding-left: 21px;
    background: url(../images/email.png) left center no-repeat;
  }
}

At the widest, we can use all the flair we have available.

All together now

#sidebar ul li a {
  color: #900;
  text-decoration: none;
  padding: 3px 0;
  display: block;
}

@media all and (min-width: 1001px) {
  #sidebar ul li a:after {
    content: " (" attr(data-email) ")";
    font-size: 11px;
    font-style: italic;
    color: #666;
  }
}

@media all and (max-width: 1000px) and (min-width: 700px) {
  #sidebar ul li a:before {
    content: "Email: ";
    font-style: italic;
    color: #666;
  }
}

@media all and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) {
  #sidebar ul li a {
    padding-left: 21px;
    background: url(../images/email.png) left center no-repeat;
  }
}

Video demo

http://reader.googleusercontent.com/reader/embediframe?src=http://vimeo.com/moogaloop.swf?clip_id%3D13048400%26server%3Dvimeo.com%26show_title%3D1%26show_byline%3D0%26show_portrait%3D0%26color%3Dff9933%26fullscreen%3D1&width=570&height=164

Live demo / download

View Demo   Download Files

Browser support

The browser support for media queries is surprisingly decent. For the queries in this particular demo (utilizing min and max widths), current version of Firefox, Safari (including Mobile), Chrome, and Opera are all supporting it. Internet Explorer 9 will be supporting it, but 8 and below do not. If I wanted to deliver the best possible experience in IE 8 and below, I’d either fake it with JavaScript like I did in this article, or use an IE specific stylesheet and style it in the same style as the most common browser width according to analytics.

Note that milage may vary on individual types of queries. For example, the iPhone supports the width queries but does not support the orientation queries. The iPad supports both.

More on media queries

Measuring width is a nice practical example of media queries, but it isn’t the only thing available. Below are some more of them (not a comprehensive list). The spec lists lots more.

Types

HTML4 had these media types, which are all still valid: aural, braille, handheld, print, projection, screen, tty, and tv. HTML5 may include more as it needs them. The spec includes ‘3d-glasses’, which is awesome. The all keyword will target all types.

@media screen, projection { ... }

Dimensions

You get height and width, which query against the current browser window height and width. You could use them as-is, but that would probably be rare. Both of them accept min/max prefixes, so more commonly you’d used them as min-width, max-width, min-height, max-height.

There is also device-width and device-height, which also provide min-device-width, max-device-width, min-device-height, and max-device-height.

@media (min-device-width: 640px) { ... }

Orientation / Aspect Ratio

You can query against the aspect ratio of the screen as well with device-aspect-ratio.

@media screen and (device-aspect-ratio: 16/9) { ... }

Or if the screen is in portrait (height larger than width) or landscape (width larger than height) mode.

@media (orientation:portrait) { ... }

Color

You can query on if the screen is in color or not and details about that.

@media (color) { /* Screen is in color */ }

@media (min-color-index: 256) { /* Screen has at least 256 colors */ }

@media (monochrome) { /* Screen is monochrome */ }

Elsewhere

This has been a hot topic lately. You can hear some smart people talk about it on The Big Web Show. Here are some other cool uses of it going around recently:

  • Andy Clarke shows how the the longer the line length the more readable text can be with taller line height.
  • Jon Hick’s site rearranges itself to have double sidebars, single sidebar, or no sidebar according to available space. It even scales down to mobile sizes nicely.
  • Ethan Marcotte’s demo for A List Apart doesn’t use media queries, but shows other ways a design can be effectively flexible.
  • Simon Collison’s site rearranges it’s grid to fit different browser sizes.
  • Panic uses @media in their HTML emails to make them look awesome in desktop or mobile email clients.

posted on CSS-Tricks: http://css-tricks.com/6731-css-media-queries/

I liked this: 移动界面隐喻设计

2 10月

界面是什么?

是的,有些时候,我就在想这个简单的问题,而那时我的答案还是:界面是对软件应用解决方案的显性,使用图形化符号,向使用者解释它的功能与任务。

但最近一些认知却让我对这个问题有了新的回答:界面就是软件应用它本身。它不是一份对软件应用功能的图形化说明书,不是对软件应用功能与任务的图形化翻译,它就是软件应用本身,并且与之浑然天成。
一个简单的问题,仅仅从展开的iPad文件夹时界面的呈现,你觉得,有多少种方法,可以收缩起这个文件夹?

方法其实有三种:点击(Tap)文件夹图标或者点击其他区域;向上拖动(Flick)界面;双指在两侧向内滑动(pin close)。

第一种也许你早就知道,但后面两种,你也许会将信将疑地去尝试,相信我的说法。

所以,从我的角度上而言,这也许是人家常说iOS操作简单易懂的原因。在你点击文件夹后,文件夹展开的的这个动画,以及最终他的视觉样式,已经告诉你了,他应该怎么去关闭,你会不由自主的,就学会这些操作。

而这就是隐喻。《iOS Human Interface Guidelines》里面是这样解释隐喻对体验的影响的:当你应用中的可视化对象和操作按照现实世界中的对象与操作仿造,用户就能快速领会如何使用它。(When virtual objects and actions in an application are metaphors for objects and actions in the real world, users quickly grasp how to use the app.)

对我而言,iOS的文件夹更多的像一个抽屉的隐喻,并且,它的顶部还是玻璃材质的。从拉开的动画当中,他建立了一个类似抽屉的空间,你一看就明白了。

界面与界面之间,并不是简单的线性关系

我们不得不否认的一点是,界面与界面之间其实是应该纯在联系的,我指的这种联系是说,空间感。存在相互之间的层级和逻辑关系的,而且这种关系,越符合现实的,越好。越容易让别人理解,越来越不用让别人学习。

这就是我们需要做隐喻,我们需要通过它,去表现界面之间的关系。

隐喻给人以可预测性,用户能够轻易的理解你设计的软件应用。这是一种掌握的感觉,是一种控制的感觉。当用户操作时,他们知道下一步即将出现什么、怎么回去——即使是在第一次操作。

为什么需要在移动界面中注意隐喻设计?

1.导航缺失

一个触摸屏手机的物理尺寸在3.7寸左右,与一张信用卡相当。在这么狭窄的空间内,我们则不能秉着PC客户端“在一个主界面内完成大部分的任务”的思想,去设计移动客户端。我们必须把界面分拆。

与之而来的问题是,分拆后的界面是有逻辑的,但我们并不能照搬PC客户端中的方法:使用任务栏,层叠的模态对话框去表现这种逻辑。

因为我们根本就没有空间,所以我们得另辟蹊径。

所以,我们把界面拆分得更多独立化,让界面变成卡片式,一个界面只完成一项任务,保证界面之间联系的单一化,避免界面之间逻辑,或者跳转的混乱。

2.缺乏物理力学反馈

传统的手机上,用户使用键盘,去操作屏幕上的视觉对象,键盘在这个阶段中,扮演的其实是用户操作行为的翻译器。而iPhone的出现砍掉了这种操作行为的翻译,变成直接触摸,这是一项伟大的进步。

iPhone虽然缩短了操作行为的执行阶段,但却给操作行为的反馈阶段带来了麻烦:只有视觉反馈,手指触摸的物理力学反馈消失了。

你的手指不再能够感受到键盘按下的物理力学压力,甚至,假设你手指粗壮一点,你就几乎没法看见按钮是否被按下。而在输入时,这种情况尤甚,键盘手机上有着悠久历史的高效的“盲打”输入方式只能进入历史的存档中。

因此,我们更多的需要利用用户的视觉和听觉,去提供反馈。

隐喻设计内容

对于一个产品来说,隐喻设计不仅仅是动画,各种即时状态细节的设计,更多情况下,我们需要按步骤的去完成整个隐喻的系统性与结构化设计。他包含以下几项内容:

1.拟物化视觉外观与听觉反馈

隐喻设计的第一步,从应用的外观着手,如果可以的话,你应该考虑应用的外观表现出真实物理的肌理材质,以及合理的光影效果,并且,得正确的显示界面的元素的相互之间的空间层次感。

另外我们不能忽视的一种拟物化设计:音效。它不仅是对缺乏物理力学反馈的一种弥补的手段,在某些情况下,也是一种有效的反馈机制,如当屏幕处于关闭状态下时(这是经常的事情),拟物化的音效更能让用户了解当前用户的状态。iOS解锁屏幕的声音你还记得吗?还有敲击键盘的声音,以及照片拍摄的声音。这都很好的拟物化音效。

拟物化的外观很大程度上降低了用户的认知成本,无需阅读额外的文字,用户只要看到软件的样子,就知道它的用途。

2.即时反馈

假设,你在触摸屏的设备上,使用手势执行某项操作,但界面上没有任何的反馈。你就不得不去猜测一下,你遇到的是下面的那种情况:

  1. 你的操作手势有误,软件无法响应
  2. 程序当机了,暂时没有响应

对于情况二,很抱歉,我们也许实在无能为力。但是对于情况一,我们得有必要讨论一下,如果反馈用户操作手势有误,并指引或者帮助用户到正确的操作中了。

由此看来,传统网页上使用的反馈方式,移植到触摸屏设备上,实在是水土不服。移动设备最好的错误反馈,应该是即时跟随用户的手势操作的。

如上图示意,这才是一个触摸屏上,应该具备的一种反馈,它即时响应了用户的手势动作(即使可能是错误的),而当用户释放操作时,又自动回归到正确的操作结果中来。

对于任何一个软件应用来说,他都是有学习成本的。有的成本高到离谱,比如Office,Photoshop之类的生产力软件,但也有低成本的,如计算器,记事本等。当软件应用而行拟物化设计之后,其实这已经降低了一些学习的成本。但如何继续降低学习成本?让用户犯错,并从错误中学习。

即时反馈缩减了操作与反馈之间的距离,有效降低了用户纠正错误的修复成本,也提高了用户学习的效率。

3.流动式动画

传统的软件界面之间的切换表现得较为粗暴,大部分情况下,他只显示命令执行前和执行后两个界面,而忽略了他们之间的那段过程。而在真实世界中,倘若没有这个过程,你甚至很难理解过程两端的界面,是如何联系起来的。

动画有一种无法比拟的表现力,它是与用户的最有效的沟通方式,一个精致,微细的动画,能够友好的衔接两个界面之间的切换,同时他还有以下的作用:

  1. 表现软件当前状态
  2. 提供对用户有用的反馈信息
  3. 加强用户直接操作的控制感
  4. 通过视觉表现用户的操作的结果

流动式的动画贯穿在整个iPhone操作系统中,也包括在非沉浸式应用程序中。但作为隐喻设计的一种手段,我们需要留意的是:动画只是常用于提高用户体验,它本身并不是用户体验的焦点。

隐喻设计的评判标准

1.符合现实逻辑的界面空间

流动式的动画成为隐喻设计的最后一块拼图,但是我们仅仅把拼图拼起来是不够的,我们还需要检验,这样的拼图是否符合真实世界的逻辑。

Flipboard始终如一地采用翻页的动画效果,无论是从首页进入,抑或是从某个订阅源中返回。他甚至还精细的制作了三种翻页动画效果:只翻动一页,翻动两页,翻动三页和以上;他给以用户这样一种感觉:

  • 我订阅的所有内容,是一本杂志
  • 任何页面都没有互相从属的关系,只有先后秩序的关系
  • 在首页上的方块型的东西,等于杂志的目录

而国内的同类产品杂客,他所呈现的界面空间却稍有不同,整体上,他像是一个时刻变换封面的杂志柜。

但个人感觉,从杂志柜进入杂志的过程动画,有点粗暴且难以在现实生活中找到相关性。个人观点,若此过程动画能与iBooks打开书籍的动画类似或相同。也许更加符合现实逻辑。

2.自圆其说

简单来说,你的界面是如何进入用户的视眼,也应该以相反的方式,从界面中消失,并且,这个过程,是能够自圆其说的,且符合真实生活的隐喻的。

3.响应用户的直觉手势

移动设备最大的特点是:直接操作。如果你设置了你的界面是从下方推入,那用户可能会直觉性的认为,我把新界面向下拉,这个界面即可消失。

从图可以看到腾讯爱看成功的照顾到了用户从隐喻设计中所得到的直觉性手势,只需向下拉,用户就可以关闭此界面。

从外观上看,评论界面都处于主界面之下,而动画效果都属于主界面向下拉伸,评论界面向上推至界面顶部。但是杂客的同样响应了用户的直觉性手势,只需在正文界面中,向下拖动,即可激活评论界面,这不得不算是在twitter客户端上的一种进步和超越。

总结

其实理解移动界面的隐喻设计,并不是一件非常困难的事情,因为这是一个化繁为简过程后的结果。而困难的是:设计师应该跳出传统的按钮,点击等交互操作的局限中来,更多了考虑到和现实生活的逻辑结合和用户的直觉手势的响应。

对于移动的软件应用来说,隐喻设计的初衷是为了解决导航缺失和物理力学反馈缺失的问题,但同样,这也是移动产品的竞争力的核心体现。如何帮助用户更快的理解你的软件应用,如何帮助用户更顺畅的使用你的软件应用。这是我们每个设计师,都应该去真实生活中去寻找的答案。


posted on 网易用户体验设计中心博客: http://uedc.163.com/5593.html

I liked this: 移动支付热门创业公司汇总

25 9月

数据显示,全球移动支付市场将从2011年的2400亿美元增加到2015年的6700亿美元;同时,全球使用手机支付数字商品的用户人数也…
Tags:移动支付  创业  
posted on 草根网: http://www.20ju.com/content/V177292.htm

I liked this: Web App 的胜利!金融时报公布一些运营数据

25 9月

《金融时报》(Financial Times)旗下有一个网络版 FT.com ,原本还有一个 iOS App 放在苹果的应用商店里…
Tags:Web App  评论  
posted on 草根网: http://www.20ju.com/content/V177285.htm