www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > > 充電吧
[導讀]我所在公司的產品以硬件為主,軟件跟著特定的硬件平臺走,所以,雖然從事著Android開發(fā),卻從來沒有處理過多屏幕適配的問題。意識到這個可能成為自己的一個短板,所以在缺乏實踐的情況下,先準備點理論知識,

我所在公司的產品以硬件為主,軟件跟著特定的硬件平臺走,所以,雖然從事著Android開發(fā),卻從來沒有處理過多屏幕適配的問題。意識到這個可能成為自己的一個短板,所以在缺乏實踐的情況下,先準備點理論知識,聊以慰藉。
? ? ?1 常用單位 ? ? ? px:pixel //像素 ? ? ? in: inch //英寸 ? ? ? mm : 毫米 ? ? ? pt : 1/72英寸 ? ? ? dpi : dots peer inch //一英寸長的直線上的像素點的數量,即像素的密度 ? ? ? dp(dip) : Density-independent pixel //密度無關像素,定義為160dpi的屏幕下,1個像素點的長度 ? ? ? sp :?Scale-independent Pixels //專用于設定文字大小,和dp類似,但是它除了受到dpi影響,還受到用戶的字體偏好設定影響 ? ? ? 屏幕的物理尺寸:屏幕對角線的長度,以inch為單位 ? ? ? 分辨率: 屏幕上長寬方向上像素點的數量, 例A80為全高清屏,即1080*1920的分辨率// 也稱為相對分辨率(使用這種說法的人認為,dpi才是真正的分辨率)
? ? ? android.util.TypedValue類提供了一個函數,支持把所有的單位換算到px,實現代碼如下:

????/**
?????*?Converts?an?unpacked?complex?data?value?holding?a?dimension?to?its?final?floating?
?????*?point?value.?The?two?parametersunitandvalue*?are?as?in?{@link?#TYPE_DIMENSION}.
?????*??
?????*?@param?unit?The?unit?to?convert?from.
?????*?@param?value?The?value?to?apply?the?unit?to.
?????*?@param?metrics?Current?display?metrics?to?use?in?the?conversion?--?
?????*????????????????supplies?display?density?and?scaling?information.
?????*?
?????*?@return?The?complex?floating?point?value?multiplied?by?the?appropriate?
?????*?metrics?depending?on?its?unit.?
?????*/
????public?static?float?applyDimension(int?unit,?float?value,
???????????????????????????????????????DisplayMetrics?metrics)
????{
????????switch?(unit)?{
????????case?COMPLEX_UNIT_PX:
????????????return?value;
????????case?COMPLEX_UNIT_DIP:
????????????return?value?*?metrics.density;
????????case?COMPLEX_UNIT_SP:
????????????return?value?*?metrics.scaledDensity;
????????case?COMPLEX_UNIT_PT:
????????????return?value?*?metrics.xdpi?*?(1.0f/72);
????????case?COMPLEX_UNIT_IN:
????????????return?value?*?metrics.xdpi;
????????case?COMPLEX_UNIT_MM:
????????????return?value?*?metrics.xdpi?*?(1.0f/25.4f);
????????}
????????return?0;
????}




? ? ? 2 市占率比較高的手機 ? ? ? 這些數據可以在http://screensiz.es/獲得:
手機型號 物理尺寸(inch) 分辨率(px) dpi px密度 Galaxy SIII 4.8 720*1080 360 XHDPI Sony Xperia Z 5 1080*1920 441 XXHDPI Galaxy SIII 4.3 480*800 219 HDPI Galaxy Nexus 4.6 720*1280 316 XHDPI Google Nexus 4 4.7 768*1280 320 XHDPI Galaxy SIV 5 1080*1920 441 XXHDPI Galaxy S Plus 4 480*800 233 HDPI Galaxy Note II 5.5 720*1280 267 XHDPI Galaxy S 4 480*800 233 MDPI Galaxy Note 5.3 800*1280 285 XHDPI
從數據來看,目前大部分的手機的屏幕尺寸在4~5英寸之間(拋開note之類的跨界產品),DPI在HPI到XXHDPI(基本只有幾款旗艦機才會配置)之間。
? ? 3 dp單位的使用 ? ? dp單位的顯示效果與dpi無關,那它實際的使用效果如何呢?
? ? ?我創(chuàng)建了一個Nexus S的模擬器,參數為:Android2.3.3,屏幕4寸,解析度480*800,HDPI。 然后準備了如下layout:


執(zhí)行,獲得如下結果:


計算得到LinearLayout的實際大小為:150*150。
所以,dp適配到具體設備的像素的時候,是通過如下公式換算:
px?=?dp?*?scale;
scale由設備的由設備的設備的pixel密度決定:
LDPI的dpi在120左右,scale?=?0.75?//一般市面上是看不到LDPI的設備了。
MDPI的dpi在160左右,scale?=?1.0
HDPI的dpi在240左右,scale?=?1.5
XHDPI的dpi在320左右,scale?=?2.0
XXHDPI的dpi在440左右,scale?=?3.0
所以,實際使用中,1dp約等于1/160inch,所以,可以讓我們的app在大多數的屏幕上保持相近的呈現效果。

但是,使用dp來適配所有設備是不現實的:
1.?呈現效果仍舊會有差異,僅僅是相近而已。
2.?當設備的物理尺寸存在差異的時候,dp就顯得無能為力了。為4.3寸屏幕準備的UI,運行在5.0寸的屏幕上,很可能在右側和下側存在大量的空白。而5.0寸的UI運行到4.3寸的設備上,很可能顯示不下。

????4.?根據屬性的資源適配機制

????如果想獲得最好的適配效果,那么根據不同平臺的參數進行針對性的適配,毫無疑問可以獲得最佳的效果。系統(tǒng)會根據設備的具體參數,根據資源文件的屬性篩選最合適的資源。
????apk中提供的資源包括animator、anim、color、drawable、layout、menu、raw、values、xml這9種。這些資源保存在res文件下的對應文件夾中。
????每個文件夾的名字都可以用多種屬性來修飾,以便系統(tǒng)在執(zhí)行的過程中根據設備的實際情況使用不同的資源。
    
????不同的屬性以“-”連接,以優(yōu)先級從高到低的方式排列(否則編譯錯誤),形式如下:
????資源名-屬性1-屬性2-屬性3...
????以下是幾種個人覺得比較有用的幾個屬性:
????Language?and?region?:?用于指定語言和區(qū)域,多國語言最常用的屬性,例如:en,en-rUS。
????Screan?size?:?用來指定屏幕大小,包含如下值(由小到達):small(最小尺寸426*320dp,基本在3.2寸以上),normal(最小尺寸470*320dp,基本在3.3寸以上),large(最小尺寸640*480dp,基本在5.0寸以上),xlarge(最小尺寸960*720,基本在7.5寸以上)。
????Screan?orientation?:?屏幕方向,值為port或者land。
????UI?mode?:?值為car、desk、television、appliance。
????Night?mode?:?值為ienight、?notnight(可能對文本閱讀類型的app比較有用)
????Screan?pixel?density?:?最常用的屬性了,值包括:ldpi,mdpi,hdpi,xhdpi,xxhdpi,nodpi,tvdpi。其中,nodpi用于開發(fā)者不希望系統(tǒng)對圖片進行縮放的情況,tvdpi的界于hdpi和mdpi之間,dpi一般在213左右,多用于基于Android系統(tǒng)的智能電視,大部分app其實很少用到。
????Platform?version?:?值為:v
???app運行時,系統(tǒng)會根據屬性選擇適配的資源進行展示。如果有符合的資源則使用,反之,當符合的資源不存在時,系統(tǒng)會去尋找最相近的可用資源來代替。但是,查找的屬性不同,查找的順序會有所有差異。

???對dpi屬性來說,查找的順序為,高dpi的資源優(yōu)先。例如,沒能找到hdpi的圖片資源,則系統(tǒng)的搜索順序是drawable-xhdpi->drawable-xxhdpi->drawable-mdip->drawable->drawable->drawable-ldpi。這里drawable被認為比drawable-ldpi更接近hdpi。
???另外,對于圖片資源在找到相近的資源后,系統(tǒng)還需要對圖片進行縮放才會進行使用(否則,可能出現顯示不下,或者圖片過小的問題)。上文的例子中,如果在drawable-xhdpi中找到了資源,那么找到的圖片會先縮小到0.75倍以后再使用;如果是在drawable-mdpi中找到了資源,那么圖片需要放大到1.5倍以后再使用(放大肯定會造成圖片模糊,可能這就是高dpi資源優(yōu)先的原因所在)。
???有時候,我們的圖片資源不一定是從drawable文件夾中讀取的,還有可能是從sd卡上讀取的,或者從網絡上下載的。這個時候,我們需要注意,默認情況下,通過BitmapFactory.decodeFile()函數生成的圖片被認為是MDPI的,如果想讓圖片也獲得與drawable文件夾相似的縮放能力,則需要通過BitmapFactory.Option.inDensity屬性設置(例如如果圖片是為hdpi準備的,則設置為240)。

????對于screan?size,查找的順序則是小尺寸優(yōu)先,大尺寸放棄。例如,在Galaxy?note?2上執(zhí)行apk時,如果未能找到layout-large資源,則查找順序為:layout-normal->layout->layout-small,不會查找layout-xlarge。
???6.?個人對于多設備UI適配的理解
???以下是個人的一點總結:
???I.???使用簡潔的風格來設計UI,讓界面變得簡單并且一體化,使UI有更加的自適應能力。
???II.??盡量使用match_parent,wrap_content等屬性來實現實現UI的自適應,減少dp的使用,盡量不要使用px。
???III.?如果使用dp,那么不要在layout文件中顯示的設定數值,而是通過dimens文件來引用,不同設備上就可以使用同一份layout,而通過不同的dimens來適配。
???IV.??可以的情況下,盡量使用.9的png文件,通過無損的縮放來適應UI。
???V.???有些在XML上很難設定的UI細節(jié),可能可以通過java代碼動態(tài)調整的方案來解決。
???VI.??如果有需要的話,可以通過w720dp,h360dp,1024x768等屬性來對市面上銷量比較好的手機做針對性的UI適配。
???VII.?沒有真機的情況下,可以通過SDK內的模擬器和網上的在線模擬器檢查UI效果。
???VIII.對于某些app,可以使用Html5來開發(fā)UI(即以app內嵌WebView控件來展示Html5),可能可以獲得更加的UI適應效果。

???最后記錄幾個與UI相關的JAVA?API:
???DisplayMetrics?dm?=?Context.getResource().getDisplayMetrics()//dm中可以獲得scaledDensity,densityDpi,heightPixels,widthPixels等信息。

???Configuration?config?=?getResources().getConfiguration()?//config中可以獲取設備的配置信息,我們可以根據具體的信息展現不同的UI。這里有一點值得注意的是,config.screenWidthDp和理論計算可能會有偏差:例如,9100的參數為800x480,hdpi,800/1.5=533,但是實際運行時,config.screenWidthDp=508。如果為9100做UI適配,那么“w508dp”才是有效的,”w533dp“則無法匹配給9100。相似的,偏差也可能出現在config.screenHeightDp上。


參考資料:
Google官方資料
Android屏幕適配-資源文件夾命名與匹配規(guī)則
Android開發(fā)筆記-屏幕適配
Android多屏幕適配
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉