入控件作為最常用的界面設計控件之一,包含了哪些類型以及各類型與特征以及使用關鍵點有哪些呢?一起來了解下。
文章大綱:
數值參數是對象屬性之一,其值為數字。
具體例子包括:電商網站上的商品價格、數量,以及照片編輯應用中的照片透明度等。
常用的數值參數交互控件包括:文本輸入框、滑塊、旋鈕控件、可編輯的二維曲線控件以及能對預先給定的默認值進行遞增或遞減的步進器等。
不同控件適用于不同的交互場景來傳達編輯數值信息。
多數情況下,控件的類型和參數值之間存在一定的自然映射關系。比如旋鈕控件,可以自然地跟角度參數相對應。
這些UI控件傳達編輯數值信息的同時,也遵循了「尼爾森十大可用性原則」之一 ——環境貼切原則:匹配系統與真實世界
許多創意類或數據分析類的應用和網站均包含了較長的表單,允許用戶對特定屬性進行詳細調整??丶趯崿F連續復雜的數值變化的同時,需要建立以下兩種體驗上的平衡:
輸入控件的兩種主要類型:
嚴格來說,范圍值從0到100的滑塊是一個離散型控件,因為它的值并不是連續的。而實際使用當中,如果一個滑塊可選的數值范圍夠大而且不僅限于有限的幾個固定選項值的話,可以被認為是連續型控件,從用戶的實際體驗上來看它也是連續的。
Mac 版本 Kindle 包含了離散型及連續型兩種控件:
線性滑塊是一種有用的控件,當對應值屬于給定的范圍內(明確的最大值和最小值),并且數值的精確度對用戶來說沒那么重要時。
根據 Accot-Zhai 提出的“引導法則”(Steering Law),在滑塊上選定一個精確值并不容易。
所謂“引導法則”,是由人機交互原則之一的費茨定律推導而來。
引導法則:用戶滑動二維路徑上的滑塊時所需的時間受路徑的長度和寬度影響。簡單地說,路徑越寬或長度越短,則滑塊移動速度越快。大多數的滑塊寬度較窄,使得用戶很難選中相對精確值。
線性滑塊的高效性在于:用戶在滑動滑塊的過程中可以實時預覽效果。一旦用戶的操作和實際效果存在一定延遲,線性滑塊可能就不是個合適的選擇。(根據標準響應時間原則,延遲的時間最多不應超過0.1s)
如果是頁面顯示結果比較費時的情況下,滑塊同樣不是個很好的選擇。
可選擇諸如:實時渲染視頻效果,龐大的數據集合的篩選控件(e.g.價格范圍的篩選)等等……
IOS系統屏幕亮度滑塊并不是用于選定一個準確的亮度值,而是獲取一個相近的、類似的亮度值。
通常來說,用戶移動滑塊僅僅是為了讓屏幕比現有的更亮或更暗些。
這種控件的易用性關鍵在于——系統是否能夠在用戶滑動滑塊的同時通過改變屏幕亮度來給予即時反饋。
一旦用戶的操作和它產生的實際屏幕亮度效果存在較大延遲,用戶也就無法在滑塊上準確地選定合適的亮度值。
滑塊控件的其中一種變體是:具有兩個在可選值范圍內移動的滑塊。
這種滑塊變體常用于網頁界面的篩選,用戶可以設定最小最大價格,航班的起始和結束時間等。
和其他類型的滑塊類似,雙滑塊控件選取準確值比較困難,因此這種控件僅適用于少數情況。
雙滑塊與直方圖之類的圖表結合使用時,可以確保選擇的范圍值可實際匹配到對應的內容或選項,從而避免無搜索結果的情況的發生。
Kayak 網站(提供機票、酒店服務的旅游網站)的一大特征就是提供范圍選擇滑塊來篩選航班起飛時間段。
雖然精確的起飛時間如12:15pm比較難選中,但航班起飛時間與對應費用圖表的搭配使用,使得用戶在平衡時間和費用后作出較優選擇變為可能。
旋鈕控件或其他用戶需要旋轉的控件自然地代表了平移(音頻工程師可以在混合音頻的時候調節音頻的左右聲道)之類的參數。
然而,使用常用的鼠標、觸控板等輸入設備去操作旋鈕有一定的難度,在旋轉功能上不具備較好的功能可見性。
鑒于鼠標之類的線性輸入設備執行旋轉操作比較困難,一些設計中會賦予旋鈕一種隱式的線性拖動操作。用戶可以任意通過點擊、上下或垂直拖動來調整數值大小。
但這種線性拖動操作往往是意料之外的,通常不作任何提示,難以被用戶發現。
另外,如果應用不當,會使那些試圖通過鼠標轉圈去模仿旋鈕旋轉的人失去自主控制權。
GarageBand (一款數碼音樂創作軟件) 為用戶提供多個旋鈕,通過點擊或垂直拖動進行旋轉。
該設計彌補了不能很好掌控旋轉的設備(鼠標等)的缺陷,但是不容易被發現,并且與用戶嘗試移動光標轉圈來轉動旋鈕的意圖相違背。
這個例子里,旋鈕控件的靈感來源于過去的音頻工程師所使用的旋鈕,是擬物設計的不恰當應用實例之一。
既然它的參數值并不能很好地映射到一個圈內,水平的滑塊可能更適用于該參數。
Adobe 圖像管理器 Lightroom 的設置面板針對數值參數使用了多種輸入控件,其中包括了滑塊和旋鈕。
盡管每個控件都代表連續的數值,他們也反映了一些重要的額外的關于這些被修改數據的信息。
其中包括:用旋鈕來代表物體周邊陰影角度的角度控件;包含最小和最大值范圍值的滑塊(e.g.0% – 100%透明度滑塊)。
二維曲線輸入控件是一種通過調整一個復雜曲線來同時修改多個相關參數的專業控件。
通常情況下與之交互方式是,通過在已有的直線或曲線上添加一個節點。
一旦添加了新的節點,并且將節點拖曳至新位置時,系統會在兩個節點之間繪制出一條新的曲線。
這種控件在以下情況下非常實用:有兩個相關聯、互相牽制、會被同時修改的參數(e.g.圖像視頻編輯應用里的亮度和RGB曲線)或需要通過二維空間來描述物體的位置和路徑時(e.g. 電影的環繞聲)。
GIMP(GNU圖像處理程序)用二維曲線控件來同時控制多個參數,否則可能需要多個滑塊才能實現。
上述例子中,X 軸 Y 軸代表不同參數,其中 X 軸(從暗到亮)對應輸入,Y 軸對應輸出。曲線越接近于水平,圖片的整體色調范圍越小。
如果這些數值用滑塊來表示并進行調節,可能需要多對控件來實現,每個對應用戶需要調整的參數值。
使用二維網格的情況下,用戶簡單地通過點擊在線上添加任意位置節點,將節點拖曳至新的坐標處。
這類設計使得用戶可以通過一些小的調整來完成復雜曲線的創建。
實現精確值輸入最簡單的一種方式是使用輸入框,用戶可以輸入該精確值。
然而,這種解決方案提供精確輸入的同時,不支持用戶高效地探索參數值范圍。
輸入一個提前已知的值比較簡單,但在你不知道要輸入什么值的情況下,如果讓你不停地隨機輸入一個看起來像樣的顏色值,整個過程是冗長乏味的。
即使額外提供增減顏色值的步進器按鈕。有些文本框甚至不會顯示可輸入值的范圍。比如,RGB 顏色值輸入框,對于新手用戶來說 RGB 顏色值的范圍是0-255就不是那么直觀。
Microosoft Ofiice 通過在輸入框旁添加上下箭頭按鈕的步進器,來快速地增減數值。
上述輸入框問題的一個典型的解決方案是,使用兩個互相獨立而又相關聯的控件來對同個參數進行或粗略或精準的數值調整。
所謂聯合控件是指兩種(或多種)調整同個數值的控件組合。
一般來說,連續型控件,如:滑塊,用于粗略的輸入,不斷探索范圍內的數值從而找出所需值的大致臨近值。
之后,輸入框作為精確控件用來確定具體的數值。精確控件也有助于那些已經知道所需具體數值的超級用戶。
聯合控件的設計不僅支持輸入值的精細調整,也能直接顯示出當前狀態下的參數值,告知用戶與其期望輸出效果相關聯的值是多少。
一個關鍵點:由于這兩個控件持續關聯,兩者展示同一值時調整其中一個,另一個控件值應隨之立即(通常指0.1s之內)發生變化。
為了使聯合控件有更好的使用體驗,用戶調整滑塊時,鍵盤的聚焦應移動至輸入框。
這樣一來,用戶設置粗略滑塊值后能輕松在文本框進行輸入,而無需點擊文本框。這個設計有助于讓尋的(即移動手從鼠標到鍵盤或鍵盤到鼠標的行為)更高效。
另外無論如何要確保的是:當鍵盤聚焦在微調輸入控件,鍵盤快捷鍵仍能被使用。
近期的(文章寫于2017.04)一個可用性研究中顯示,某個 Adobe Photoshop 的PC用戶在使用透明度滑塊與鍵盤去放大(Alt+滾輪)時遇到了問題:
一旦鍵盤聚焦在輸入框,該用戶使用快捷鍵時系統總會播放錯誤的提示音(輸入框僅允許數字作為有效輸入)。
合適的參數默認值十分重要:不僅能節省用戶時間和精力,而且能為新手提供使用指導。
典型的默認值便是選取一個中立的值(取決于具體參數):對于縮放滑塊來說,100%(值位于滑塊中間)是個理想的默認值;對于其他包含0和最大值的控件,理想的默認值可能是中點。
為默認值的輸入提供便捷的方式,例如:重置按鈕。
一旦中立數值在范圍中的某個位置或者所處位置不明顯時,重置按鈕顯得尤其好用。
如果默認值帶有某種視覺指示符號同樣易于使用,比如默認值在滑塊上所處位置顯示小箭頭刻度線。
Apple 的相冊應用包含多個調節參數滑塊以及能夠一鍵重置這些數值的重置按鈕。(然而,該重置功能被隱藏于上下文菜單中)
精確的數值輸入依賴于合適的控件選擇。
控件傳遞出的信息不僅包括這些控件應該如何被使用,也包含了它們所代表數值的范圍。
控件應該提供簡便的方式用于探索可能的數值范圍選項以及給定精確值。
為用戶提供獨立而又相關聯的粗略和精確輸入控件,給定合適默認值的同時為正在使用粗略數值控件的用戶提供輸入框的鍵盤聚焦。
原文作者:Page Laubheimer
原文地址:https://www.nngroup.com/articles/sliders-knobs
翻譯:一起吃雪糕
本文由 @一起吃雪糕 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
pp中常使用的時間(日期)選擇組件有滾輪式與日歷式2種。同樣都可以實現具體時間或時間段選擇的功能,實際應用中該如何取舍呢?今天我們就來看看這兩種方式各自的優勢與使用場景。
一、滾輪式時間選擇器
交互方式
1. 點擊btn呼出選擇器
①從屏幕底部呼出彈層,如滴滴
②從菜單欄下方呼出彈層,如網易有錢
③在當前屏幕展開,如TIM
2. 上劃滑動滾輪進行選擇
3. 點擊確定按鈕進行提交
優勢
1. 取材于用戶現實中熟悉的密碼鎖、記分牌樣式、用戶熟悉上下滑動的操作方式,學習門檻低
2. 體積小,節約空間,多種頁面位置,方便與多種情景進行配合3. 對用戶的操作干擾性較小
劣勢
1. 滾動選擇方式較枯燥,在滾輪選項很多時,用戶可能會在多次滾動選擇中產生不耐煩情緒
2. 除了數字外沒有其他信息進行核實確認
3. 視覺表現不夠生動
適用場景
1. 用戶對自己要選擇的具體時間節點非常明確,例如生日、紀念日、預約服務、待辦事項
2. 不同的用戶選擇的時間節點跨度很廣,例如生日的年份會從1900-2018
使用建議
1. 選項數量一般為2~3項,最多5項;
2. 為用戶設置合理的默認選項,減少操作次數,提升效率,例如:
3. 選擇合適的展開位置,把滾輪選擇器放到控件觸發區域附近,方便用戶操作
4. 用“今天”、“昨天”等相對概念,更快的激發人對時間的感知,例如上圖滴滴、TIM
5. 不顯示不可選時間,暗示用戶可選日期,降低用戶誤操作可能性
6. 若有選項為非必填項,可提供忽略該選項操作,如下圖生日管家,可選擇不填寫年份,點擊忽略按鈕后,年份收起。
二、日歷式時間選擇器
交互方式
1. 點擊btn打開選擇器,通常為新開頁面(如上圖飛豬)或全屏彈層(如去哪兒)
2. 點擊或者滑動選擇某一具體時間或時間段
3. 點擊確定按鈕進行提交
優勢
1. 取材于用戶現實中熟悉的日歷樣式,用戶學習成本低。
取材于用戶現實中熟悉的密碼鎖、記分牌樣式、用戶熟悉上下滑動的操作方式,學習門檻低
優勢
1. 取材于用戶現實中熟悉的密碼鎖、記分牌樣式、用戶熟悉上下滑動的操作方式,學習門檻低
劣勢
1. 占用面積大,新開頁面或全屏彈層對用戶操作的連續性干擾較大
2. 單頁展示的時間選項較少,不便于選擇時間跨度較大的時間段
適用場景
1. 用戶不能明確具體時間,只有大致范圍,例如這個月的某一天
2. 用戶需要對自己選擇的時間進行二次確認,例如通過星期確定時間有沒有記錯
3. 不同用戶選擇的時間主要集中在一個范圍內,如預定火車票主要集中在未來一個月內
使用建議
1. 設置合理的默認頁面,減少操作次數,提升效率。通常采用日歷式選擇器的場景都是選擇近期時間,所以默認頁面為當前月,如本章節頂部示例,都默認展示當前月。
2. 提供返回默認頁的按鈕,方便用戶進行選擇;如下圖生日管家、大姨媽,在查看日歷時,當日歷顯示頁為非當前頁時,出現返回當前日期按鈕
3. 當選擇時間范圍跨度較大時提供快速跳轉的方式,可以與滾輪式選擇器配合使用
4. 將不可選擇的時間置灰,暗示用戶可選日期,降低用戶誤操作可能性
總結
綜上所述,滾輪式時間選擇器和日歷式時間選擇器各有所長,設計師要根據實際場景對分析需求并靈活判斷該用哪種交互方式更合理。
當然,沒有最好只有更好,今天分析的兩種方式只是較為常見的選擇方式,可以用于大部分場景下。在這之外也有其他特別的方式,例如:
貨拉拉:彈層外區域顯示已選中內容自如:表格式選擇滴答清單:可自定義選擇日歷的排布方式詳細情況就不在這里嘮叨啦,如果你感興趣的話,百看不如一見,不妨親自去試一試~也許會有新收獲哦。
這個控件是近期定制的控件,還是比較實用的控件之一,用戶主要是提了三點需求,一點是切換焦點的時候控件放大突出顯示,一點是可直接輸入或者編輯值,還有一點是支持上下鍵及翻頁鍵和鼠標滾輪來動態修改值,類似于qspinbox控件。要能夠支持直接輸入首先想到的就是qlineedit控件,在原有的儀表盤控件上中間部分,放置一個qlineedit控件用來輸入值,采用正則表達式來限制只能輸入數字,為了使得qlinedit和自定義繪制的儀表盤完全融為一體,必須設置qlineedit的樣式為背景透明,至于輸入框的位置,有個小技巧就是直接將輸入框設置為控件的大小,這樣輸入的焦點永遠在控件的中間,完全混合,絲毫看不出是一個輸入框控件插在那里,至于上下鍵及翻頁鍵和鼠標滾輪,直接安裝事件過濾器即可識別到,進行對應的處理即可。
* 1:可設置范圍值,支持負數值
* 2:可設置開始旋轉角度/結束旋轉角度
* 3:可設置是否啟用動畫效果以及動畫效果每次移動的步長
* 4:可設置外圓背景/內圓背景/進度顏色/空余顏色/文字顏色
* 5:自適應窗體拉伸,文字自動縮放
* 6:支持tab及鼠標按下切換焦點
* 7:支持直接輸入值立即應用
* 8:獲取焦點控件自動變大
* 9:支持鍵盤上下鍵步長為1修改值
* 10:支持上下翻頁鍵步長為10修改值
* 11:支持鼠標滾輪步長為1修改值
void GaugeEdit::paintEvent(QPaintEvent *) { int width=this->width(); int height=this->height(); int side=qMin(width, height); //繪制準備工作,啟用反鋸齒,平移坐標軸中心,等比例縮放 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); painter.translate(width / 2, height / 2); painter.scale(side / 200.0, side / 200.0); //繪制外圓 drawOuterCircle(&painter); //繪制內圓 drawInnerCircle(&painter); //繪制當前進度 drawProgress(&painter); //繪制中心圓 drawCenterCircle(&painter); //繪制單位 drawUnit(&painter); } void GaugeEdit::drawOuterCircle(QPainter *painter) { int radius=91 + offset; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(outerCircleColor); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore(); } void GaugeEdit::drawInnerCircle(QPainter *painter) { int radius=80 + offset; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(innerCircleColor); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore(); } void GaugeEdit::drawProgress(QPainter *painter) { int radius=75 + offset; painter->save(); painter->setPen(Qt::NoPen); QRectF rect(-radius, -radius, radius * 2, radius * 2); //計算總范圍角度,當前值范圍角度,剩余值范圍角度 double angleAll=360.0 - startAngle - endAngle; double angleCurrent=angleAll * ((currentValue - minValue) / (maxValue - minValue)); double angleOther=angleAll - angleCurrent; //繪制當前值餅圓 painter->setBrush(usedColor); painter->drawPie(rect, (270 - startAngle - angleCurrent) * 16, angleCurrent * 16); //繪制剩余值餅圓 painter->setBrush(freeColor); painter->drawPie(rect, (270 - startAngle - angleCurrent - angleOther) * 16, angleOther * 16); painter->restore(); } void GaugeEdit::drawCenterCircle(QPainter *painter) { int radius=60 + offset; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(centerCircleColor); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore(); } void GaugeEdit::drawUnit(QPainter *painter) { int radius=100; painter->save(); painter->setPen(textColor); QFont font; font.setPixelSize(30); painter->setFont(font); int offsetY=110; QRectF unitRect(-radius, -radius + offsetY, radius * 2, radius * 2 - offsetY); painter->drawText(unitRect, Qt::AlignCenter, unit); painter->restore(); }
1. 超過150個精美控件,涵蓋了各種儀表盤、進度條、進度球、指南針、曲線圖、標尺、溫度計、導航條、導航欄,flatui、高亮按鈕、滑動選擇器、農歷等。遠超qwt集成的控件數量。
2. 每個類都可以獨立成一個單獨的控件,零耦合,每個控件一個頭文件和一個實現文件,不依賴其他文件,方便單個控件以源碼形式集成到項目中,較少代碼量。qwt的控件類環環相扣,高度耦合,想要使用其中一個控件,必須包含所有的代碼。
3. 全部純Qt編寫,QWidget+QPainter繪制,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等編譯器,支持任意操作系統比如windows+linux+mac+嵌入式linux等,不亂碼,可直接集成到Qt Creator中,和自帶的控件一樣使用,大部分效果只要設置幾個屬性即可,極為方便。
4. 每個控件都有一個對應的單獨的包含該控件源碼的DEMO,方便參考使用。同時還提供一個所有控件使用的集成的DEMO。
5. 每個控件的源代碼都有詳細中文注釋,都按照統一設計規范編寫,方便學習自定義控件的編寫。
6. 每個控件默認配色和demo對應的配色都非常精美。
7. 超過130個可見控件,6個不可見控件。
8. 部分控件提供多種樣式風格選擇,多種指示器樣式選擇。
9. 所有控件自適應窗體拉伸變化。
10. 集成自定義控件屬性設計器,支持拖曳設計,所見即所得,支持導入導出xml格式。
11. 自帶activex控件demo,所有控件可以直接運行在ie瀏覽器中。
12. 集成fontawesome圖形字體+阿里巴巴iconfont收藏的幾百個圖形字體,享受圖形字體帶來的樂趣。
13. 所有控件最后生成一個動態庫文件(dll或者so等),可以直接集成到qtcreator中拖曳設計使用。
14. 目前已經有qml版本,后期會考慮出pyqt版本,如果用戶需求量很大的話。
15. 自定義控件插件開放動態庫使用(永久免費),無任何后門和限制,請放心使用。
16. 目前已提供26個版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
17. 不定期增加控件和完善控件,不定期更新SDK,歡迎各位提出建議,謝謝!
18. Qt入門書籍推薦霍亞飛的《Qt Creator快速入門》《Qt5編程入門》,Qt進階書籍推薦官方的《C++ GUI Qt4編程》。
19. 強烈推薦程序員自我修養和規劃系列書《大話程序員》《程序員的成長課》《解憂程序員》,受益匪淺,受益終生!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。