為什麼魅族 MX3 要把 density (像素和 DP 的比) 定為 2.5,而不是和其它 1080p 屏幕一樣是 3.0?
通過測量發現 MX3 截圖的 ActionBar 的高度是120px, 經過換算,density(px:DPI) 是 2.5, 魅族這樣做的目的是什麼呢?僅僅是為了顯示更多的內容?
好吧,這個坑還是我自己來埋吧,開始。
第一步:驗證density=2.5(要是有機子就直接代碼驗證了,沒有真機)
作Android的UI的都知道,Android在代碼層面的單位是dp,系統的一些組件參數如下:
Status Bar=25dp Softkey=48dp
我們來看下MX3的是多少:
這是系統的參數,所以魅族不會改的,通過計算可以知道MX3的desity是2.5,也許大家覺得可能是魅族自己定義的,@NovaDNG 認為是這樣,那麼我們看下第三方的軟體:
上圖是知乎的界面,ActionBar(就是那條藍色的)的高度是120px,我在自己的NEXUS 4上量了是96px,也就是說知乎是按照Android的標準設計的:高度是 48dp,那麼輕易的計算:
120/48=2.5,再次證明MX3的density是2.5
也許大家奇怪了,普通的手機的dp也就是Mdpi / Hdpi / xHdpi / xxHdpi 啊,density分別是1.0、1.5、2.0、3.0啊,為什麼會有小數呢?其實這並非沒有先例,Nexus 7第一代的density就是1.33。
這裡又出來個問題了,硬體 density 到底是誰定義的呢,我大膽猜測是設備廠商,不過Rom也是可以做到的,求資深人士解答。
第二步:這麼做有什麼好處呢?
大家想必知道MX3宣傳的「黃金1080P」,也就是MX3的解析度同普通的1080P的解析度不一樣,不是1080*1920,而是1080*1800,比普通的1080足足少了120個像素,那麼J.Wong 所謂的更大的閱讀空間不是衝突了嗎?各位客官不及,聽我一一道來:
還是看圖說話:
效果立竿見影,MX3能夠顯示更多的內容,因為簡單的修改狀態欄和Smartbar的高度能剩出的區域真的是少之又少,而通過修改 density 的話獲得的不僅僅是系統控制項的大小減少,連其他的按鈕,Bar,特別是字體都能減小(上圖的字體dp=20dp,MX3 字體大小為50px,但是其他的3.0的機子就是60px).MX3的更多內容展示確實做到了。(為什麼@李楠 發布會不說這個呢,太專業了,一般人聽不明白?)這樣會不會有問題呢?答案很明確的是會!
- 手指的觸控區域小了(考慮到屏幕尺寸較大,其實這一點都問題不大)
- 有的軟體開發設計不規範,比如Actionbar的圖標大小設計超過120px,(Android 規範是32dp,即96px)就會出現壓縮或者跑出區域。
就是這樣,不知道這個坑填起來沒有。
最後一句:MX3的density是不是這樣,我也不知道,以上全是個人三年Android UI設計經驗的推測,如果不對,請魅族拍磚!手上沒有MX3的機型,不過寫一個demo簡單跑一下就知道 density 的值了
關鍵代碼如下
Context.getResources().getDisplayMetrics().density
至於這玩意兒是誰控制的 ... 恩,是Rom控制的
具體的控制地點是 system/build.prop 文件,ro.sf.lcd_density=xxx 這一行
同時這一行的數值也決定了App會從哪個資源目錄讀取資源,例: ro.sf.lcd_density=320 對應的是 -xhdpi 後綴的資源目錄
假設 ro.sf.lcd_density 的值為 x,那麼 density比值 y = Math.round(x / 160)
有興趣的話可以用有Root許可權的文本編輯器編輯這一行的數值,然後重啟手機看看效果~
@NovaDNG 想做好Product,完全不了解技術,是不行的,以上~之前的答案理解有問題... 推到重來一遍...
MX III 的屏幕像素數是略奇葩的 1800x1080px.
為了確定 MX III 採用的 DPI 到底是不是 XXHDPI, 我稍微做了點計算. 簡單來說就是, 假設魅族的 Action Bar 高度是標準的 48dp (實際上經過各種比對, 應該是標準的 48dp 無誤).
那麼代入 px/dp = Target DPI/160DPI 公式中計算, 得出 MX III 使用的 DPI 是介於 XHDPI(320) 和 XXHDPI(480) 之間的 400DPI.
這是個什麼概念呢? 這就相當於, 原本在 1080p 屏幕上需要 144px 高度的 Action Bar, 在 MX III 上只要花 120px 就能顯示了. 這樣, 少掉的 120px 就不會顯得那麼疼了, 畢竟如果像 Xperia Z1 這樣的有虛擬鍵的機器上, 虛擬鍵可是佔了 144px 的.
於是魅族就成功的做到了在"像素更少的屏幕上 (比起標準 1080p 屏幕, 且有虛擬鍵) 顯示更多的內容 (前提: 如果兩邊都有 Split Action Bar, 且應用的 Split Action Bar 兼容 Smart Bar, 而且內容的大小相對於標準 1080p 屏幕要更小一些)"了. 撒花.
對了, 我發現無論怎麼量, MX III 的 Action Bar 高度都是 121px... 雖然說基本等同於 40dp 但是這種數據實在是...
以上. 沒有絲毫嚴謹性的分析, 求摺疊.P.S. 這種問題不是應該邀請@李楠來回答比較合適么...
魅族調 density,主要還是因為作為一個 5.1 的大屏,只有 1800*1080 的解析度,ppi 四百多一點,低於一般的 1080P 屏幕。如果仍然是 3.0 的 DPI,那麼得到的結果就是同樣的元素,在 MX3 上看起來更大。調小了 density,就可以獲得小一些的元素,從而獲得更多的內容。
再比如說 Galaxy Note 3,那麼大的屏幕,仍然是 1080P,如果保持 3.0 的 density,那麼相比 4.7 寸的 One,屏幕大了那麼多,卻不會獲得一點點更多的內容,而是所有內容都等比放大了。當然,我不知道三星會不會考慮這個問題。
Android 之所以把 density,而不是像素作為應用開發的標尺,正是為了解決不同 ppi 屏幕帶來的適配問題。同一個解析度,可能會用在手機上,也可能會用在平板上,系統給出不同的 density,就能讓平板顯示更多的內容。
最後,回到什麼是 density。Density,其實和 ppi 息息相關。魅族的 PPI 較一般的 1080p 屏幕低,所以調低了系統給程序的 density 的值。試想,如果所有的設備的系統給定的 density 都和屏幕自身的 PPI 成同一種比例,那麼同一個程序的同一個按鈕,在不同尺寸、不同解析度、不同 PPI 的屏幕上,看起來應該是一模一樣大的。 這不是很好嗎?
當然,我們的手指和眼睛容許一定變化的範圍,就像 iPad mini 上按鈕小一圈仍然可以按一樣。
=================題外話==================
當年 Win8 開發的時候也考慮過這個問題。詳見這篇文章:
Scaling to different screens
這張圖很有趣:
Win8 為了兼容不同 ppi 的顯示器,給出了 100% 140% 180% 三種比例(蘋果則是 100% 和 200%)。在中間那根橫線上,是最佳的觸摸尺寸。根據大家的回答,安卓應該是給出了 1.0 2.0 3.0 三種標準係數。而魅族如果採用 3.0 這個係數,得到的觸摸面積應該是黃色區域的上面或者接近黃色區域,如果採用 2.0 這個係數,又會跑到黃色區域的下面。所以魅族採用了 2.5 這個係數,企圖達到一個觸摸目標大小和顯示內容多少的平衡。但目前來看,貌似還是在中間那根線偏下的部分?
其實魅族能調Density,別的1080x1920同樣可以調,如果大家都是2.5,1920顯然能顯示更多,在兩台手機ppi一樣,Density值也一樣的情況下,魅族的1800還存在優勢嗎?顯然沒了。
我的結論是,魅族的黃金1080P,不為別的,就是用來欺負那些5.1英寸以下的FHD屏幕的,以小米3為例,5.0英寸全高清,計算得出ppi為441左右,而MX3的的5.1英寸短屏,實際ppi為412左右,意味著當Density值相同的情況下,同一個文字,米3比MX3要小,而由於要保持閱讀的舒適性,字體實際尺寸不能過小,這些5.0FHD的手機就不可能和MX3採用2.5的density值了。
相反,MX3的淫蕩之處就在於,這個5.1英寸的屏幕,實際ppi相當於5.35英寸的全高清屏,如果米3和MX3採用同一個Density值,米3比MX3顯示的文字要小多了,假設MX3採用density=2.5的時候,文字大小剛好的話,那顯然米3就會小得不舒適了。
當然你可以問,既然寬度都一樣了,為什麼魅族不直接採用5.35寸的16:9的屏幕呢?事實上從成本來說,用16:9屏幕對魅族是沒多大影響的,偏要截掉一節,一定要將自己搞那麼奇葩,個人認為原因不外乎這些:
1.設計上的平衡,太長破壞美感,不好看,也許就這麼回事。
2.提高單手操作的舒適性,太長夠不到通知欄。
3.沒必要用長屏幕,因為縱向閱讀時,人只會關注中間,多出的部分不重要。
4.我實在編不下去了......尼瑪,魅族TM就是為了第一點而已,別猜測了!
【配圖稍微押後】
ppi計算參考:
手機屏幕解析度PPI計算器
已用MX3獲取到,實際的desity為2.75
http://developer.android.com/design/patterns/actionbar.html
Android design里只有上面的main action bar,如果應用
有需要更多操作,可以在下面添加split action bar,如果有複製粘貼等操作,main action bar上會覆蓋Contextual Action Bar,寬度通常是48dp,不知道題主的2.5dp從何而來。
另外樓上所說action bar模仿自iOS是從何而來,iOS最典型的是下面一排tab,和action bar差別太大了吧
這個問題可以邀請@NovaDNG來回答@NovaDNG 題主說的 density 是指像素和 DP 的比。
1080P 手機 XXHDPI 這個值就是 3。 我覺得MX III 也是 3 不是 2.5,這個數字廠家不會亂調。把 action bar 降低到 40 倒是比較合理的解釋。
推測題主認為 action bar 一定是 48 dp,結果量出來 120 px,所以覺得魅族把這個值改成了 2.5。
-----------------------------------------------------------------
感謝@徐江平 自問自答,完美坑填。
首先魅族3的1080x1800確實是很奇葩的,標準的1080P是1080x1920,比例是16:9的寬屏,這樣,魅族3在播放1080P視頻的時候應該不太好看,另外第三方相機軟體應該也會有點問題。
然後density為2.5這個事情,我覺得涉及到兩個問題,一個是density為2.5和為3,肉眼能否看到差別,如果看不出,也就無所謂了。再一個是為2.5應該算到xxhdpi還是xhdpi,我沒有驗證過,但是肯定會給應用開發者帶來一些困惑和麻煩。
最後,要使閱讀體驗更好,把狀態欄和按鍵欄縮短,完全可以通過改變其高度的方式,而不是用一個影響到全局的density值,所以不確定這個density為2.5是否是為了這個原因。MX3 density不是說是440嗎,然後dp-px換算關係是2.75,作為開發我就關心一件事情,遇到非4的倍數dp轉換成px都存在取整誤差!!!!!!!而這會導致不少app的兼容性問題
MX3的dpi是400,屏幕是5.1,解析度是1080x1800,按照Android的官方推薦標準,換算出合適的係數就是2.5,有什麼可討論的呢?
推薦閱讀: