在屏幕上畫個C—基于人機工程學(xué)的安卓導(dǎo)航碎片化解決方案

1 評論 15849 瀏覽 2 收藏 24 分鐘

這是一篇讓人興奮的文章,作者Greg Nudelman是一位安卓系統(tǒng)專家,他在文中提出了“C手勢”導(dǎo)航代替現(xiàn)有安卓導(dǎo)航的構(gòu)想,而且毫不吝嗇的提供了兩種設(shè)計方案并對關(guān)鍵代碼做了詳盡的解釋。 “C手勢”是作者提出的解決安卓導(dǎo)航碎片化的方案。強調(diào)的是“在需要的時候隨時從屏幕任何區(qū)域調(diào)用上下文導(dǎo)航是適用于任何觸屏設(shè)備的功能模型。”也就是“隱藏式瑞士軍刀風(fēng)格”(Hidden Swiss Army knife-style)的一種。作者認(rèn)為“C手勢”是最自然,最符合人機工程學(xué)的手勢,可以很好地彌補大屏幕觸屏設(shè)備導(dǎo)航不便的缺陷。 正如作者所說,文中提到的方案并不是完美的,他只是提供了一種解決問題的思路,而這種思路也是本文的精華所在。

原文鏈接:http://mobile.smashingmagazine.com/2013/03/25/c-swipe-navigation-on-android/#top

目前市面上使用安卓系統(tǒng)的設(shè)備多達(dá)3997種(http://opensignal.com/reports/fragmentation.php)。你的產(chǎn)品可能在多種設(shè)備上運行,因此你不得不考慮跨平臺導(dǎo)航的問題。幸好“C手勢”(C-Swipe)可以助你一臂之力:這是一種可用于平板電腦和移動設(shè)備的替代性導(dǎo)航方法(可以取代目前的導(dǎo)航方式),具有新穎(安卓設(shè)備匯中沒有用到這種手勢)、符合人機工程學(xué)(最大減小手指應(yīng)變)和區(qū)域性(在屏幕局部隨時可以調(diào)用)的特點。本文詳盡介紹了這種導(dǎo)航方式的設(shè)計方法和代碼,并且提供了一個可以下載的小應(yīng)用,你可以親測一下,試試“C手勢”是否適于你的產(chǎn)品。

尺寸和復(fù)雜性不斷升級
觸屏設(shè)備的數(shù)量與日俱增,新設(shè)備、新功能日新月異。如果平時關(guān)注Windows OS的發(fā)展,我們不難發(fā)現(xiàn)這樣一個趨勢:觸屏設(shè)備越來越大。目前,安卓設(shè)備大軍中已經(jīng)出現(xiàn)了12英寸、15英寸和21英寸觸摸屏;觸屏設(shè)備中的應(yīng)用越來越復(fù)雜,功能日益齊全,甚至標(biāo)準(zhǔn)版的 Microsoft Office 應(yīng)用都針對觸摸操作做了優(yōu)化。如果說最新的Chromebook(擁有一塊12.85英寸,2560×1700像素的觸摸顯示屏)能顯示出某些跡象的話,那一定是谷歌同樣樂于將觸摸操作集成到更大的硬件上。
這只是一個時間問題,只待Andriod系統(tǒng)迎頭趕上。但是,通過縮放當(dāng)前安卓4.x(4.0、4.1、4.2…)系統(tǒng)的操作欄(Action Bar)來適配所有設(shè)備和應(yīng)用是不現(xiàn)實的也是不符合人機工程學(xué)的。
我建議用“C手勢”作為替代操作欄的導(dǎo)航方式,這是基于手部自然人機工學(xué)提出的一種方法。使用“C手勢”可以在屏幕任何位置調(diào)用上下文菜單(contextual menu),而你要做的只是用拇指在屏幕上很自然的畫一個半圓弧。當(dāng)你用右手操作的時候,這種手勢看起來像個字母“C”——因此,我把它命名為“C手勢”(C-Swipe。當(dāng)你用左手操作時,可以稱為“反C手勢”,Reverse C)。
內(nèi)容為王(Content Is King)
想象一下,把移動設(shè)備或平板電腦的屏幕全部填上內(nèi)容,用拇指在屏幕的任何位置很自然的畫一個半圓就能調(diào)用應(yīng)用的功能和導(dǎo)航。用戶可以在任何姿勢、任何角度下完成這個動作,例如用兩只手拿著設(shè)備時,把設(shè)備平方放在桌子上時,以及在床上閱讀時等等。
拇指在屏幕上滑動會觸發(fā)一個半圓形的上下文菜單。當(dāng)菜單出現(xiàn)后,最常用的功能在頂部,也就是拇指自然狀態(tài)下能觸及的地方。Icon和文字放在拇指不會擋住的地方。用戶可以點選他們的目標(biāo)選項,點選或點擊屏幕其他位置后,半圓形菜單就會消失。
看到容易,點擊難
Flipboard是一款非常優(yōu)秀的應(yīng)用,以其優(yōu)質(zhì)的UI設(shè)計和內(nèi)容導(dǎo)航功能贏得了大量忠實粉絲的青睞。然而,F(xiàn)lipboard詳情頁有一些選項——“返回”(Back),“最愛”(Favorite)和“喜歡”(Like)——被放在了頂部操作欄中。
(圖1)
在Andriod 4中頂部操作欄是導(dǎo)航和功能選項的必爭之地,而且Andriod 4設(shè)計規(guī)范也建議把導(dǎo)航和功能選項放在此處。頂欄位置有利于發(fā)現(xiàn)應(yīng)用的功能:在頂欄,按鈕可以很容易被看到,而且永遠(yuǎn)不會被用戶的手遮住。
可是,把按鈕放在屏幕的頂部實際上是一把雙刃劍:對有些設(shè)備來說,頂欄是手指很難觸及到的。即使在小型設(shè)備上也需要費一番功夫。如果設(shè)備再大一點(如很受歡迎的Galaxy Note),要想點擊頂欄的按鈕,你不得不用上另外一只手。這樣一來,不管是多任務(wù)操作還是放松隨意的使用都會變得艱難。
而且,操作欄占據(jù)了屏幕頂部一塊非常重要的位置。當(dāng)用戶在學(xué)習(xí)使用這款應(yīng)用的時候,可見的功能選項可以給他們提供有效的幫助。不幸的是,用戶一旦學(xué)會了如何使用,頂欄就會變成“視覺噪聲”,而且浪費了屏幕最引人注目、最寶貴的位置。
導(dǎo)航無處不在
如果有一種方法可以讓整個屏幕100%只顯示內(nèi)容,同時又允許用戶毫不費力的調(diào)用功能菜單(不管手指在什么位置,在屏幕什么區(qū)域),而且可以輕而易舉的點擊任何選項,這樣的方法是不是很好?是的,這就是“C手勢”要做的。
(圖2)
用拇指在屏幕任何地方畫一個半圓即可調(diào)用一個隱藏的菜單,菜單中的選項和頂部操作欄中的相同。菜單出現(xiàn)后,用同一個手指點擊所需的選項也是一件很容易的事。
兩種菜單設(shè)計
我介紹的“C手勢”有兩個形式不同但一樣重要的方案:“滑動—松開”( swipe and release)和“僅滑動”(swipe only)。兩個方案調(diào)用的菜單在形式上不太一樣,你需要選一種適合自己的?!盎瑒印砷_”方案把icon放在菜單選項內(nèi)部,如上方圖2所示。
使用這個方案的的用戶可以先在屏幕表面畫一個半圓,然后手指移開屏幕。在這里移開手指是很必要的,由于icon在菜單選項內(nèi)部,不移開手指大部分選項會被遮住,那會造成使用上的不便。
第二種方案只需要滑動一下,不需要移開手指。如下方圖3所示。系統(tǒng)識別手勢的方法和上面的方案一樣。但此時的菜單會隨著手指的滑動即時出現(xiàn)在屏幕上(不是彈出)。由于拇指擋住了部分選項,icon需要展示在選項外部才能保證其可見性。
(圖3)
你應(yīng)該選擇哪種交互方式?
“僅滑動”方案,拇指和設(shè)備時刻處于接觸狀態(tài),能夠即時觸發(fā)菜單。這一點保證了導(dǎo)航效率:理論上沒有“無用功”(no wasted motion)。但是很多被測用戶更喜歡icon在菜單內(nèi)部的設(shè)計方案。試用一下附件中的小應(yīng)用,自己抉擇吧。附件中的小應(yīng)用是這兩種方案的合體:它使用“滑動—松開”手勢,但把icon放在了菜單選項外面。因此,你可以同時感受兩種方案。
提示:謹(jǐn)記,我們提供的小應(yīng)用調(diào)用菜單的滑動手勢非常簡單,你只要在屏幕上畫一個很小的半圓就行,可能比你想象的小得多。我希望這個最簡單不過的demo可以在任何設(shè)備上運行,不管屏幕大還是小,這種方案都能適用。(我們希望可以完美適用3997種屏幕)。畫小半圓的原因是出于對人體解剖學(xué)的考慮:大手掌的人畫小半圓遠(yuǎn)比小手掌的人畫大半圓容易。
替換操作欄
基本上可以用“C手勢”替換目前所有的Android導(dǎo)航欄菜單。也就是說使用導(dǎo)航欄的地方都可以換成“C手勢”。正如我在及即將出版的一本書( Android Design Patterns: Interaction Solutions for Developers)中提到的一樣,這種很不錯的“C手勢”,是熄燈模式(lights-out mode,屏幕顯示內(nèi)容為主,不顯示導(dǎo)航控件。即隱藏式瑞士軍刀風(fēng)格的導(dǎo)航)即將引領(lǐng)潮流的先聲。
另外一個重點是“C手勢”幾乎可以無限擴展:它容納的選項比屏幕上能顯示的選項多很多,可能比一級菜單、二級菜單、三級菜單的總和還要多。半圓形菜單的內(nèi)環(huán)部分可以作為切換按鈕,點擊即可看到更多選項,如下面圖4所示,點擊中心按鈕,在半圓菜單外圈顯示更多選項,再次點擊返回初始菜單界面。這樣,用戶就能很輕松地訪問8-12個優(yōu)先級最高的功能。


你可以嘗試分別為“滑動—松開”和“僅滑動”兩種方案添加子菜單。

(圖5)
上圖第一排展示的是“滑動—松開”顯示子菜單的方式。點擊“Favorite”選項,在半圓菜單外圈出現(xiàn)一串星形按鈕。用戶把拇指移開即可看到子菜單上的功能選項,之后就可以按需點選了。
第二排展示了“滑動—按住”顯示子菜單的方式,工作原理和上一中有些相似。拇指在屏幕上畫“C”,保持手指接觸屏幕,菜單出現(xiàn)后將手指滑動到目標(biāo)選項上(例如“Favorite”),松開手指后子菜單就會代替原先的主菜單。
要點在于“C手勢”有很多種版本,而且子菜單不需要也是半圓形,它可以是一串文本或icon也可以是一個特定的收藏夾。只要保證子菜單出現(xiàn)在“C手勢”菜單附近即可。
為什么要用“C手勢”?
“C手勢”有很多優(yōu)點:
1、提供沉浸式體驗(Immersive Experiences)
這種模式具有高度沉浸式特性,所有的功能按鈕都被隱藏起來,直到你需要的時候才會出現(xiàn)。它可以100%利用安卓設(shè)備的屏幕(包含全部3997種),為購物、閱讀、看視頻、虛擬現(xiàn)實等提供沉浸式體驗。
2、最大限度減小手臂應(yīng)變(Arm Strain)
“C手勢”尤其適合大尺寸觸屏設(shè)備,如即將上市的15-、17-、21-英寸平板電腦。在目前Andriod 4系統(tǒng)導(dǎo)航模式中,點擊頂部或底部操作欄需要較大幅度手臂動作,很快就會造成手臂疲勞。相反,“C手勢”可以讓菜單出現(xiàn)在手指能觸及的區(qū)域附近,不需要手臂大幅度運動就能完成操作。
3、符合費茨定律(Fitts’Law)
費茨定律指出點擊按鈕的速度和難易程度與目標(biāo)的大小和到目標(biāo)的距離有關(guān)。也就是說,在大屏平板電腦上點擊一個小按鈕必定是一件非常痛苦的事。相比之下“C手勢”具有獨到之處:它可以在屏幕任何位置調(diào)用導(dǎo)航,而且菜單出現(xiàn)的位置永遠(yuǎn)在手指放置的位置附近。如此一來定位選項的時間就減少了,點擊的動作會更加精確和自然。
4、觸發(fā)動作唯一性
目前看來“C手勢”還沒用在其他功能上(作者發(fā)表文章時,2013.3.25)。因此,使用“C手勢”并不會導(dǎo)致使用上的沖突,而且點擊菜單以外的任何位置(取消菜單的動作)同樣很簡單。
強調(diào)一下,當(dāng)用左手操作時,觸發(fā)動作為“反C手勢”。下面提供的源代碼和小應(yīng)用都支持左右手完成操作。
其他建議
“C手勢”不一定在屏幕邊緣才能被觸發(fā)。當(dāng)用戶站著使用大屏幕設(shè)備時,他可能需要將屏幕傾斜找到一個舒服的姿勢。這時,用戶可以用手指在屏幕任何位置畫個半圓調(diào)用“C手勢”導(dǎo)航。通常情況下,用戶可以用任何一只手指,如食指,來完成這個動作。
“C手勢”是很獨特的,因為菜單出現(xiàn)的時候伴隨著“天然的”動畫過渡效果。隨著拇指劃過屏幕,半圓形菜單也緊接著出現(xiàn)在拇指劃過的區(qū)域,非常自然。
警告
“C手勢”隱藏的很深,并不容易被發(fā)現(xiàn)。不過這個缺點可以通過添加水印動畫彌補,或者用其他優(yōu)雅的方式作為引導(dǎo)。給用戶一些提示如:“用手指在屏幕任意位置畫個”C”?!被蛘哂盟赢嬙谄聊坏牟煌恢锰崾編状危湍軒椭脩舭l(fā)現(xiàn)這一手勢的奧秘。


當(dāng)用戶發(fā)現(xiàn)這種手勢之后,水印動畫就可以永久消失了?!癈手勢”非常易學(xué),因為我們對這種手勢非常熟悉,而且使用時手臂和手指都很放松。
有些人認(rèn)為“C手勢”的缺陷在于它只是人機工程學(xué)上符合用戶要求,沒有映射現(xiàn)實世界中真實的事物(如卷軸或鐵鍋)。很多設(shè)計師喜歡Windows現(xiàn)代 風(fēng)格的UI設(shè)計,其中用到的都是“大手勢”(larger gestures)。他們很喜歡那種整條手臂從左滑到右從上滑到下的感覺。還有一些設(shè)計師喜歡用替代“大手勢”的方法:一種特殊的多點觸控手勢——如五指輕點,或五指一起捏。
我是不同意這種觀點的
盡管人們提出了很多導(dǎo)航方法,而且每個都承諾很好用。但我仍然覺得“C手勢”是最自然、最真實、最經(jīng)濟(jì)的觸摸動作。它是很自然的動作,就像用戶在輕撓或抓取屏幕上的內(nèi)容一樣。
不管設(shè)備處于什么樣的姿態(tài),在什么樣的任務(wù)場景中,這個滑動動作可以輕易的用一只手完成。為了驗證這一觀點的正確性,我們還需要擴大被測用戶的范圍做更多測試。
但是有一點可以明確:不管手勢如何變化,在需要的時候從屏幕局部隨時調(diào)用上下文導(dǎo)航是適用于任何觸摸屏設(shè)備的功能模型——所以我最大的建議莫過于一定不要忘了這個重要的趨勢。
源代碼解釋
可以想象到這一功能著實復(fù)雜,下面的代碼只是一個粗略的預(yù)覽,看的時候關(guān)注重點就好。
要做一個完整的應(yīng)用,你需要先用Android SDK中的GestureBuilder記錄自定義“C手勢”。詳細(xì)步驟可以查看Micha Kops的文章: 《Creating a Simple Gesture App With Android》
然后,在 CSwipeActivity 類(class)里,從庫(library)中載入自定義“C手勢”:
// Load gestures library
mGestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures_cswipe);
if (!mGestureLib.load()) {
// Show toast if gestures library could not be loaded
Toast.makeText(this, R.string.KMsgErrLoadingGestures, Toast.LENGTH_SHORT).show();
}
接下來,建立一個監(jiān)聽器(listener)來監(jiān)視目標(biāo)手勢(識別“C手勢”):

// Register gestures listener
mGestureOverlayView.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
@Override
public void onGesturePerformed(GestureOverlayView gestureOverlayView, Gesture gesture) {
onGesture(gestureOverlayView, gesture);
}
});
執(zhí)行任何手勢時都可以用onGesture()判斷一下該手勢是否滿足“C手勢”條件。你可以通過對比預(yù)測值是否高于某些預(yù)定值來判斷用戶的手勢是否滿足要求。在我們提供的demo中,我們把預(yù)定值設(shè)置成一個中間值(middle-of-the-road value)—3D,這個值是試驗得出來的,如果數(shù)值過低,簡單的滑動都有可能意外觸發(fā)這個功能,如果門檻太高,這個手勢就很難被觸發(fā)。當(dāng)檢測到正確手勢之后,應(yīng)用就會調(diào)用特殊的半圓菜單,同時填充預(yù)置的選項:
if (prediction.score > 3D) {
// Switch content from gesture overlay view to original content view
mGestureOverlayView.removeView(mContentView);
setContentView(mContentView);
// Inflate the CSwipe control view
final View cSwipePopupContentView = getLayoutInflater().inflate(R.layout.view_cswipe, null);
mCSwipe = (CSwipe) cSwipePopupContentView.findViewById(R.id.cswipe);
我們提供的小應(yīng)用demo,支持兩種方向的“C手勢”:向左和向右。可以用下面的代碼判斷,然后設(shè)置菜單錨點的方向:
// Check the orientation of the CSwipe control based on the selected gesture prediction
final String predictionName = prediction.name;
CSwipe.Anchor cSwipeAnchor = CSwipe.Anchor.RIGHT;
if (predictionName.equals(GESTURE_CSWIPE_LEFT_MARGIN)) { cSwipeAnchor = CSwipe.Anchor.LEFT; }
else if (predictionName.equals(GESTURE_CSWIPE_RIGHT_MARGIN)) { cSwipeAnchor = CSwipe.Anchor.RIGHT; }

// Set the CSwipe control anchor according to the selected gesture prediction
mCSwipe.setAnchor(cSwipeAnchor);
讓菜單盡可能出現(xiàn)在手勢錨點附近,從而呈現(xiàn)出一種菜單伴隨手勢平滑出現(xiàn)的視覺效果:

// Show the CSwipe control popup window as close as possible to the gesture bounding rectangle
final RectF gestureBoundingRect = gesture.getBoundingBox();
mCSwipePopupWindow.showAtLocation(mContentView, Gravity.NO_GRAVITY, (int) gestureBoundingRect.left, (int) gestureBoundingRect.top);
用CSwipe類來啟動這個由外圓和內(nèi)圓定義的特殊半圓菜單。你可以在Widget folder中找到完整的CSwipe.java代碼:
public CSwipe(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);

final TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CSwipe);

mInnerArcRadius = attributes.getDimensionPixelSize(R.styleable.CSwipe_innerArcRadius,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_INNER_RADIUS_DP, getResources().getDisplayMetrics()));
mOuterArcRadius = attributes.getDimensionPixelSize(R.styleable.CSwipe_outerArcRadius,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_OUTER_RADIUS_DP, getResources().getDisplayMetrics()));

總結(jié):
親愛的讀者們,剩下的任務(wù)就交給你們了。你可以繼續(xù)潤色代碼以提供更多增強功能:提高反應(yīng)速度;創(chuàng)建平滑的轉(zhuǎn)場效果;調(diào)試判斷手勢的初始值;甚至在學(xué)習(xí)中隨著時間的推移重新編寫手勢檢測的算法,從而最大程度上匹配各種設(shè)備型號和用戶手掌尺寸?,F(xiàn)在,是時候感受一下我們提供的demo了,我想它應(yīng)該可以體現(xiàn)出“C手勢”導(dǎo)航的潛力。
附:demo下載地址:(安裝方法同普通安卓APP)

http://media.smashingmagazine.com/wp-content/uploads/2013/02/CSwipeDemo2.zip

作者:Greg Nudelman 翻譯:王林(Ryan)

微博UDC原創(chuàng)博文,轉(zhuǎn)載請注明出處?)

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 是一個不錯的思路,但考慮后可能存在以下問題:
    1. C手勢調(diào)出的導(dǎo)航為保持美觀性,tab標(biāo)簽內(nèi)均使用icon,但并非所有功能都可找到合適的被大多數(shù)人所接受的icon;
    2. 導(dǎo)航的目的是告訴用戶身在何處,會去向哪里,c手勢在這點上的踐行有待考究,同時不同模塊下會有諸多功能,如果兩者兼顧,這樣c手勢引出的導(dǎo)航是否過于龐大,可能對輕量化的應(yīng)用會合適一些;
    3. 如果在企業(yè)應(yīng)用,很可能遇到投入產(chǎn)出比過低的情況,長路漫漫啊~

    來自上海 回復(fù)