精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一種粗暴快速的Android全屏幕適配方案

移動開發 Android
由于Android碎片化嚴重,屏幕適配一直是開發中較為頭疼的問題。面對市面上五花八門的屏幕大小與分辨率,Android基于dp與res目錄名稱來適配的方案已無法滿足一次編寫全屏幕適配的需求,為了達到最優的視覺效果,開發過程中總是需要花費較多資源進行適配。

一、現狀

由于Android碎片化嚴重,屏幕適配一直是開發中較為頭疼的問題。面對市面上五花八門的屏幕大小與分辨率,Android基于dp與res目錄名稱來適配的方案已無法滿足一次編寫全屏幕適配的需求,為了達到***的視覺效果,開發過程中總是需要花費較多資源進行適配。也有開發者給出了一些自己的解決方案。首先來分析一下一些常見的解決方案的現狀: 1. 官方適配方案 – dp。dp是Android開發中特有的一個單位。與px不同,dp是基于屏幕像素密度的一種單位。在密度低的屏幕上或許1dp=1px,但在密度高的屏幕上可能1dp=4px。編寫布局xml時,如果一個控件的長寬都使用dp來指定,那么能確保該控件在各種大小與分辨率的屏幕下的絕對大小都大致相當。也就是說無論在pad下還是大小屏手機下,我們實際看到的該控件的大小是差不多的:

 

- 資源目錄名。上圖可見雖然使用dp確保了控件在不同屏幕中的絕對大小一致。這樣的好處在于,在大小相近的屏幕中,無論分辨率多大都不會對布局造成影響;但是當屏幕大小相差較大時,僅保證控件的絕對大小看起來就有些問題了。在res目錄下可以給各資源目錄都加上例如’-1920×1080′等后綴來適配不同的屏幕,具體規則可見官網文檔。這樣可以針對不同的屏幕提供不同的布局,甚至針對pad與手機提供兩套完全不同的布局樣式。但是通常情況下,設計師并不會對不同屏幕提供不同的設計圖,他們的需求僅僅是不同屏幕下控件對屏幕的相對大小一致,所以dp并不能滿足這一點,而對各種屏幕適配一遍又顯得略為繁瑣,并且修改也較為麻煩。通常我們需要的適配是這樣的:

 

- 百分比布局支持庫。沒有使用過,但是deprecated in API level 26.0.0-beta1。 

- ConstraintLayout。百分比支持庫deprecated之后推薦使用的布局,看起來似乎略復雜。 2. 玩家適配方案。廣大玩家的適配目的很明確,目的就是要確保控件在不同屏幕的相對大小一致,看起來一毛一樣的。以一位大神玩家的兩種適配方案為例:

- 方案一。編寫腳本將長度轉換成各分辨率下的長度,缺點是難以覆蓋市面上的所有分辨率。

- 方案二。AutoLayout支持庫。該庫的想法非常好:對照設計圖,使用px編寫布局,不影響預覽;繪制階段將對應設計圖的px數值計算轉換為當前屏幕下適配的大小;為簡化接入,inflate時自動將各Layout轉換為對應的AutoLayout,從而不需要在所有的xml中更改。但是同時該庫也存在以下等問題:

- 擴展性較差。對于每一種ViewGroup都要對應編寫對應的AutoLayout進行擴展,對于各View的每個需要適配的屬性都要編寫代碼進行適配擴展; – 在onMeasure階段進行數值計算。這對于非LayoutParams中的屬性存在較多不合理之處。比如在onMeasure時對TextView的textSize進行換算并setTextSize,那么玩家在代碼中動態設置的textSize都會失效,因為在每次onMesasure時都會重新被AutoLayout重新設置覆蓋。 – issue較多并且作者已不再維護。

二、想法

個人覺得AutoLayout的設計思想非常優秀,但是將LayoutParams與屬性作為切入口在mesure過程中進行轉換計算的方案存在效率與擴展性等方面的問題。那么Android計算長度的收口在哪里,能不能在Android計算長度時進行換算呢?如果能在Android計算長度時進行換算,那么就不需要一系列多余的計算以及適配,一切問題就都迎刃而解了。 經過一番尋覓,發現系統進行長度計算的收口為TypedValue中的applyDimension函數,傳入單位與value將其計算為對應的px數值。

  1. public static float applyDimension(int unit, float value, 
  2.                                        DisplayMetrics metrics) 
  3.     { 
  4.         switch (unit) { 
  5.         case COMPLEX_UNIT_PX: 
  6.             return value; 
  7.         case COMPLEX_UNIT_DIP: 
  8.             return value * metrics.density; 
  9.         case COMPLEX_UNIT_SP: 
  10.             return value * metrics.scaledDensity; 
  11.         case COMPLEX_UNIT_PT: 
  12.             return value * metrics.xdpi * (1.0f/72); 
  13.         case COMPLEX_UNIT_IN: 
  14.             return value * metrics.xdpi; 
  15.         case COMPLEX_UNIT_MM: 
  16.             return value * metrics.xdpi * (1.0f/25.4f); 
  17.         } 
  18.         return 0; 
  19.     }  
  • 可以看見換算方法非常簡單,而DisplayMetrics的所有屬性都是public的,不用反射就能修改;
  • 而這個DisplayMetrics從哪來?從源碼中可以看出一般為mContext.getResources().getDisplayMetrics(),這個mContext即為所在Activity;
  • Activity中所拿到的DisplayMetrics與Application中拿到的DisplayMetrics雖然不是一個實例,但是所有數值都相同,在Application中進行更改也會影響到所有Activity中;
  • 橫豎屏切換等Configuration的變化會導致DisplayMetrics的重新計算還原,需要重新處理;
  • px,dp與sp都是平時常用的單位,而pt,in與mm幾乎沒有看見過,從這些不常見的單位下手正好可以不影響其他常用的單位;
  • pt的原意是長度單位磅,根據當前屏幕與設計圖尺寸將metrics.xdpi進行修改就可以實現將pt這個單位重定義成我們所需要的相對長度單位,使修改之后計算出的1pt實際對應的px/屏幕寬度px=1px/設計圖寬度px。

基于以上幾點,遍有了以下方案。

三、方案

適配的目標是:完全按照設計圖上標注的尺寸來編寫頁面,所編寫的頁面在所有大小與分辨率的屏幕上都表現一致,即控件在所有屏幕上相對于整個屏幕的相對大小都一致(看起來只是將設計圖縮放至屏幕大小)。

  • 核心。使用冷門的pt作為長度單位。
  • 繪制。編寫xml時完全對照設計稿上的尺寸來編寫,只不過單位換為pt。 如果需要在代碼中動態轉換成px的話,使用TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, value, metrics)。
  • 預覽。實時預覽時繪制頁面是很重要的一個環節。以1334×750的設計圖為例,為了實現于正常繪制時一樣的預覽功能,創建一個長為1334磅,寬為750磅的設備作為預覽,經換算約為21.5英寸((sqrt(1334^2+750^2))/72)。預覽時選擇這個設備即可。

 

 

  • 代碼處理。代碼處理有兩種方案:如果所有頁面的設計圖尺寸都一樣,則在Applicalition中的onCreate中與onConfigurationChanged中處理即可;如果每個頁面的設計圖尺寸不一樣,則需要在每個activity的onCreate中處理(Activity中不需要處理onConfigurationChanged,因為配置變化頁面會重新生成)。
    • 全局處理方案。在Application的onCreate中與onConfigurationChanged中更改DisplayMetrics(其中DESIGN_WIDTH是繪制頁面時參照的設計圖寬度): 
  1. public class MyApplication extends Application{ 
  2.  
  3. public final static float DESIGN_WIDTH = 750; //繪制頁面時參照的設計圖寬度 
  4.  
  5. @Override 
  6. public void onCreate() { 
  7.     super.onCreate(); 
  8.  
  9.     resetDensity(); 
  10.  
  11. @Override 
  12. public void onConfigurationChanged(Configuration newConfig) { 
  13.     super.onConfigurationChanged(newConfig); 
  14.     resetDensity(); 
  15.  
  16. public void resetDensity(){ 
  17.     Point size = new Point(); 
  18.     ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getSize(size); 
  19.  
  20.     getResources().getDisplayMetrics().xdpi = size.x/DESIGN_WIDTH*72f; 
  21.  

這樣繪制出來的頁面就跟設計圖幾乎完全一樣,無論大小屏上看起來就只是將設計圖縮放之后的結果。 適配前(左圖API19 400×800, 右圖API24 1440×2560):

 

適配后(左圖API19 400×800, 右圖API24 1440×2560):  

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2018-05-04 15:26:10

Android開發全屏幕

2009-07-16 16:09:51

Swing全屏幕模式

2009-12-24 14:38:52

WPF全屏幕窗口

2013-07-03 13:54:26

jQuery

2022-05-12 10:36:10

移動方案

2011-07-04 17:53:48

快速測試

2013-05-22 09:49:36

2022-07-13 11:49:18

接口遷移方案

2024-04-16 13:56:09

移動端安全區域iOS

2016-03-21 13:24:22

apk安卓開發

2023-07-18 07:23:11

方案payloadrequest

2009-11-10 14:52:13

VB.NET實現

2022-07-14 10:02:00

vivoUI適配開發人員

2022-07-07 10:33:27

Python姿勢代碼

2022-06-22 09:44:41

Python文件代碼

2020-12-23 10:10:23

Pythonweb代碼

2020-12-09 10:15:34

Pythonweb代碼

2017-02-14 17:29:42

Android毛玻璃虛化效果

2014-12-01 09:54:40

JavaScript

2018-01-31 09:23:57

惡意軟件代碼方法
點贊
收藏

51CTO技術棧公眾號

五月天激情国产综合婷婷婷| 冲田杏梨av在线| 国内爆初菊对白视频| 国产精品日韩| 中文字幕亚洲情99在线| 人妻少妇偷人精品久久久任期| 成入视频在线观看| 国产精品天干天干在观线| 147欧美人体大胆444| 日韩 欧美 精品| 国产精品99久久| 亚洲精品一区二三区不卡| 中文字幕 日韩 欧美| 欧美激情护士| 亚洲女人****多毛耸耸8| 狼狼综合久久久久综合网| 一级黄色片在线| 国产精品久久777777毛茸茸 | 波多野结衣中文字幕在线播放| 国产在线美女| 亚洲尤物在线视频观看| 亚洲电影一二三区| 天天插天天干天天操| 国产乱码精品一区二区三| 国产成人+综合亚洲+天堂| 久热精品在线观看| 国产电影一区二区在线观看| 亚洲精选中文字幕| 91精品又粗又猛又爽| 国产精区一区二区| 欧美写真视频网站| 人妻熟妇乱又伦精品视频| 亚洲性图自拍| 亚洲欧洲日韩综合一区二区| 免费看成人片| 亚洲欧美日韩免费| 成人av网站在线| 97操在线视频| 国产不卡av在线播放| 久久丁香综合五月国产三级网站| 国产精品成av人在线视午夜片| 日韩欧美不卡视频| 亚洲国产美女| 欧美巨乳在线观看| 日本中文字幕免费在线观看| 99久久婷婷国产综合精品电影√| 国产亚洲一区二区精品| 亚洲女优在线观看| 精品高清在线| 伊人av综合网| 国产精品夜夜夜爽阿娇| 久久国产中文字幕| xvideos成人免费中文版| 成人性视频免费看| 五月婷婷六月综合| 久久视频在线播放| 18岁成人毛片| 欧美色图首页| 午夜精品理论片| 日韩av大片在线观看| 亚洲永久在线| 欧美重口另类videos人妖| 国产综合精品视频| 老司机精品视频网站| 国产精品久久久久久久一区探花| 最近中文字幕av| 精品一区二区免费| 91欧美精品成人综合在线观看| 国产精品毛片久久久久久久av| 国产在线视频不卡二| 97久久天天综合色天天综合色hd| 亚洲成人av综合| 91麻豆蜜桃一区二区三区| 欧美激情专区| a√在线中文网新版址在线| 国产乱码精品一区二三赶尸艳谈| 一区二区久久久久| 久久成人福利视频| 国产美女精品写真福利视频| 一本一道久久a久久精品 | 动漫美女无遮挡免费| 青青草久久爱| 国产亚洲日本欧美韩国| 国产一区二区三区在线视频观看| 精品福利电影| 国产精品久久久久久久久| 国产伦理一区二区| 91网站在线观看视频| 一区不卡视频| а√天堂8资源在线| 色琪琪一区二区三区亚洲区| 天堂在线一区二区三区| 欧美变态网站| xxx成人少妇69| 日韩网红少妇无码视频香港| 青青草原综合久久大伊人精品优势| 亚洲aⅴ日韩av电影在线观看| 黄色av一区二区三区| 国产性色一区二区| av一区二区三区免费观看| 天天综合网站| 精品美女在线观看| 亚洲综合第一区| 精品动漫3d一区二区三区免费版| 国产精品老牛影院在线观看| 欧美在线 | 亚洲| 欧美国产一区视频在线观看| 日韩精品在线视频免费观看| 亚洲第一会所| 欧美精品一区二区在线播放| 国产精品久久国产精麻豆96堂| 亚洲欧洲一区| 亚洲一区二区三区xxx视频| 欧美69xxxxx| 亚洲线精品一区二区三区| 一区二区三区韩国| 欧美激情99| 欧美黑人极品猛少妇色xxxxx | 欧美一区二区黄色| 一色道久久88加勒比一| 一区精品久久| 亚洲直播在线一区| 五月天婷婷在线视频| 色狠狠一区二区三区香蕉| www.四虎精品| 亚洲久久久久| 成人在线小视频| 77导航福利在线| 日韩欧中文字幕| 97人妻精品一区二区三区免费| 色综合蜜月久久综合网| 国产精品91免费在线| 欧美激情xxxxx| 国产精品中文久久久久久| 欧美熟妇一区二区| 波多野结衣一区| 91极品视频在线| 国产成人免费av电影| 真实新婚偷拍xxxxx| 久久综合成人精品亚洲另类欧美 | 91色在线视频| av免费观看一区二区| 色婷婷久久综合| 亚洲永久精品ww.7491进入| 激情六月综合| 精品伦精品一区二区三区视频| 欧美videosex性欧美黑吊| 日韩午夜在线影院| 欧美黄色一区二区三区| 国产精品1区2区3区在线观看| 国产系列第一页| 精品国产乱码一区二区三区| 欧美剧在线观看| 成人无码一区二区三区| 亚洲国产精品一区二区久久恐怖片 | av日韩中文| 精品国产乱码久久久久久闺蜜| 成年人av电影| 成人小视频在线观看| 国产曰肥老太婆无遮挡| 久久午夜影院| 国产a∨精品一区二区三区不卡| 青青草视频在线观看| 色av成人天堂桃色av| 中文字幕网站在线观看| 免费一级欧美片在线观看| 亚洲激情啪啪| 久久九九精品视频| 97免费视频在线| 理论视频在线| 欧美喷水一区二区| 九九热国产在线| 91色在线porny| 鲁一鲁一鲁一鲁一av| 欧美fxxxxxx另类| 久久久久成人精品免费播放动漫| 亚洲第一影院| 久久精品亚洲国产| 黄色av中文字幕| 91成人看片片| www.av成人| 成人精品视频一区| 久久久久久久片| 一区二区免费不卡在线| 好看的日韩精品| 国产第一精品| 欧美激情a在线| 国产一级在线观看| 日韩你懂的电影在线观看| 日本午夜视频在线观看| 中文字幕永久在线不卡| 91精品又粗又猛又爽| 日本成人超碰在线观看| 成人午夜免费在线视频| 国产一区二区电影在线观看| 亚洲一区二区在线播放| av综合电影网站| 久久这里只有精品99| 三级理论午夜在线观看| 51精品视频一区二区三区| 国产精品久久久免费视频| 亚洲欧洲日本在线| 黄色正能量网站| 国产很黄免费观看久久| 日日碰狠狠躁久久躁婷婷| 欧美搞黄网站| 色涩成人影视在线播放| 国产精品1luya在线播放| 国产日产亚洲精品| 在线手机中文字幕| 久久99精品久久久久久青青91 | 国产亚洲精品7777| 丰满少妇xbxb毛片日本| 久久er精品视频| 午夜精品久久久内射近拍高清| 欧美日韩精品免费观看视频完整| 婷婷精品国产一区二区三区日韩| 美女视频亚洲色图| 超碰97网站| 日韩一级视频| 国产精品久久久久久久久久免费| 97超碰免费在线| 欧美人成在线视频| 日本www在线观看视频| 亚洲欧美中文字幕在线一区| 人妻一区二区三区免费| 欧美一级黄色大片| 国产理论片在线观看| 欧美视频一区在线观看| 久久99国产综合精品免费| 亚洲最色的网站| 精品国产欧美日韩不卡在线观看 | 亚洲国产精品午夜在线观看| 亚洲欧美另类图片小说| 美国一级片在线观看| 国产精品国产三级国产aⅴ无密码| 免费污网站在线观看| 99国产精品国产精品久久| 亚洲天堂av网站| 成人免费不卡视频| 国产av一区二区三区传媒| 国产成a人亚洲| 精品无码av一区二区三区| 国产精品一区不卡| 亚洲av无一区二区三区久久| 国产一区二区精品久久99| 超碰成人在线播放| 狠狠色丁香婷婷综合| 涩涩网站在线看| 精彩视频一区二区| 天天做天天干天天操| 国产成人在线免费观看| 亚洲啪av永久无码精品放毛片 | 亚洲人在线视频| 麻豆影视在线| 国产小视频91| av网页在线| 久久久成人精品视频| 草莓福利社区在线| 欧美韩日一区二区| 蜜臀久久精品| 国产精品福利在线观看网址| 国产精品蜜月aⅴ在线| 成人网中文字幕| 国产精品qvod| 欧美人与性禽动交精品| 久久99视频| 99精品视频网站| 亚洲视频福利| www.com毛片| 青青青爽久久午夜综合久久午夜| 国产成人在线综合| 成人性生交大合| 干b视频在线观看| 亚洲私人黄色宅男| 国产精品第9页| 91九色最新地址| a天堂视频在线| 国产视频久久网| 黄色的网站在线观看| 九九热精品视频| 在线手机中文字幕| 亚洲精品日韩激情在线电影| 国产精品久久久久av蜜臀| 水蜜桃亚洲一二三四在线| 自拍偷拍欧美| 99久久久无码国产精品6| 麻豆精品视频在线观看免费| 日本少妇一级片| 国产午夜精品美女毛片视频| 色婷婷在线视频观看| 精品久久久香蕉免费精品视频| 中文字幕+乱码+中文字幕明步| 日韩欧美成人激情| 国产黄色在线播放| 欧美日本高清一区| 精品欧美一区二区三区在线观看 | 五月天婷婷在线观看视频| av一区二区三区在线| 少妇高潮一区二区三区喷水| 欧美日韩在线免费| av网站在线免费看| 亚洲日本成人网| 草草视频在线观看| 亚洲曰本av电影| 色无极亚洲影院| 久久久久久久久久久福利| 国产精品99久久久久久久女警| 日韩免费成人av| 图片区小说区国产精品视频| 国产精品无码久久久久成人app| 亚洲国模精品一区| a毛片在线观看| 国产精品美女视频网站| 亚洲动漫在线观看| 日韩精品视频在线观看视频| 另类小说综合欧美亚洲| 中文字幕被公侵犯的漂亮人妻| 亚洲一区在线视频| 国产精品探花视频| 伊人青青综合网站| 欧美专区福利免费| 久久精品欧美| 在线成人国产| 国产成人精品一区二区三区在线观看| 欧美激情在线一区二区| 亚洲第一精品在线观看| 日韩欧美国产综合| 国产福利在线播放麻豆| 国产日韩欧美电影在线观看| 久9久9色综合| 久章草在线视频| 久久综合久久鬼色中文字| 一级片免费网址| 亚洲电影第1页| 美女视频在线免费| 国产原创精品| 国产日韩一区二区三区在线| 手机免费看av片| 亚洲国产精品一区二区www在线| av片免费播放| 欧美日韩国产成人在线| 欧美1区2区3| www.男人天堂网| 丁香天五香天堂综合| 国产在线免费视频| 亚洲福利在线视频| 国产在线88av| 欧洲av一区| 日韩电影免费在线| 成人激情五月天| 欧美日韩欧美一区二区| 香港伦理在线| 91精品在线观| 欧美视频导航| 午夜剧场免费看| 日韩欧美成人区| 国产一级网站视频在线| 成人精品在线视频| 在线精品国产| 国产美女视频免费观看下载软件| 午夜视频在线观看一区二区 | 动漫av网站免费观看| 国产丝袜欧美中文另类| 瑟瑟视频在线免费观看| 久热爱精品视频线路一| 秋霞影院一区| 日韩国产欧美亚洲| 国产色产综合色产在线视频 | 亚洲国产小视频在线观看| 在线看的毛片| 亚洲福利av在线| 国产成+人+日韩+欧美+亚洲| 天天干天天干天天干天天| 国产一区av在线| 亚洲精品一区国产| 日本免费黄视频| 中文字幕一区二区三区精华液| 国产福利第一视频| 欧美在线中文字幕| 97欧美在线视频| 黄色在线免费播放| 欧美亚洲国产bt| 黄色羞羞视频在线观看| 欧美成人dvd在线视频| 麻豆专区一区二区三区四区五区| 中文字幕影音先锋| 亚洲欧美日韩精品久久奇米色影视| 精品久久99| 日韩a级在线观看| 欧美激情综合在线| 深夜福利视频网站| 国产精品久久久久久久久久新婚 | 国产高清免费av| 欧美在线视频观看| 亚洲美女视频| 一级片视频免费看| 亚洲成人三级在线| 农村妇女一区二区| 国产欧美高清在线|