精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品免费日产一区一区三区免费| 黄色欧美在线| 综合天堂久久久久久久| 亚洲一区在线观看网站| 国产va免费精品高清在线观看| 91av免费观看| 乱子伦一区二区三区| 24小时成人在线视频| 久久蜜臀精品av| 欧美极品欧美精品欧美视频| 污网站在线免费| 免费在线观看一级毛片| 在线视频亚洲欧美中文| 中文字幕日韩一区二区| 97在线精品国自产拍中文| 亚洲理论中文字幕| 3d成人动漫在线| 日本特黄久久久高潮| 亚洲精品日韩久久久| 国产精品专区在线| 亚洲国产精品一| 欧美一区激情| 日韩写真欧美这视频| 成人在线观看www| 国产精品呻吟久久| 日韩久久精品| 欧美色图片你懂的| 亚洲一区影院| 97在线公开视频| 午夜亚洲视频| 亚洲精品日韩欧美| 亚洲精品国产一区二区精华液 | 国产亚洲精品久久久久久牛牛| 麻豆传媒网站在线观看| 91在线视频国产| 国产精品7m凸凹视频分类| 在线观看成人免费视频| 日本一区二区在线| 一级久久久久久| 99国产精品视频免费观看一公开 | 欧美午夜片欧美片在线观看| 精品日本一区二区三区| 一级特黄aaa| 秋霞成人午夜伦在线观看| 91av在线影院| 成人无码av片在线观看| 欧美videos粗暴| 亚洲视频资源在线| 99中文字幕| 国产一卡二卡在线播放| 亚洲黄页在线观看| 欧美在线视频全部完| 欧美日韩二三区| 精品乱码一区二区三四区视频| 捆绑变态av一区二区三区| 日韩一级裸体免费视频| 无套白嫩进入乌克兰美女| 91精品国产黑色瑜伽裤| 久久综合久久综合亚洲| 精品在线观看一区二区| 凸凹人妻人人澡人人添| 日韩国产欧美一区二区三区| 综合国产在线视频| 亚洲成a人无码| 成人自拍av| 亚洲三级免费观看| 四虎永久免费网站| av在线播放观看| 久久综合色婷婷| 免费国产一区| 国产成人久久精品77777综合| 伊人久久大香线蕉综合热线 | 国产三级视频在线播放线观看| 蜜臀av国产精品久久久久 | 国产一区在线观看免费| 亚洲日本va午夜在线电影| 91精品国产色综合久久ai换脸 | 九色91在线视频| 中文字幕在线观看欧美| 亚洲黄色视屏| 久久精品视频在线| 日本japanese极品少妇| 成年永久一区二区三区免费视频| 一区二区不卡在线播放| 亚洲福利av| 午夜一区在线观看| 久久久99久久| 国产一区二区精品免费| 国产精品色综合| 成人教育av在线| 国产主播精品在线| 欧美啪啪小视频| 国产一区亚洲| 久久国产精品首页| 免费网站在线高清观看| 色天天综合网| 欧美黑人一级爽快片淫片高清| 国产精品综合激情| 美女久久久久| 日韩高清a**址| 69xxx免费视频| 精品在线手机视频| 久久精品影视伊人网| 精品国产乱码一区二区| 国产精品99免费看| 欧美成人免费在线观看| 亚洲综合一二三| 激情久久五月| 国产极品精品在线观看| www.欧美国产| 高清视频一区二区| 97人人模人人爽视频一区二区| 国产又粗又长视频| 99久久综合国产精品| 国产精华一区二区三区| 亚洲国产精品18久久久久久| 国产丝袜在线精品| 日韩在线电影一区| 婷婷激情在线| 亚洲丝袜另类动漫二区| 毛片一区二区三区四区| 外国成人直播| 精品免费一区二区三区| 天天干天天av| 伊人久久大香线蕉无限次| 欧美成年人视频网站| 国产在线一级片| 久久99蜜桃精品| 亚洲va欧美va国产综合久久| 精品久久在线观看| 欧美激情在线看| 在线观看欧美激情| av网站大全在线| 亚洲一区二区欧美激情| 日日噜噜噜噜久久久精品毛片| 91精品影视| 欧美高清www午色夜在线视频| 中文字幕亚洲影院| av一级亚洲| 国产视频自拍一区| 久久精品国产亚洲av高清色欲 | 91精品久久久久久久久久久久久久 | 亚洲高清免费在线观看| 巨大黑人极品videos精品| 亚洲精品美女久久久| 国产在线一区视频| 国产成人激情av| 一二三在线视频| 国产精品高清一区二区| 日日狠狠久久偷偷四色综合免费| 国产精品sm调教免费专区| 国产亚洲女人久久久久毛片| 男人舔女人下面高潮视频| 福利一区在线| 欧美r级在线观看| 婷婷久久综合网| 日韩午夜免费| 精品伦理一区二区三区| av在线私库| 亚洲黄页网在线观看| 五月天精品在线| 欧美三级网页| 99热99热| 波多野结衣在线观看| 91国在线观看| 亚洲欧美高清在线| 精品国产日韩欧美| 久久91精品国产91久久久| jizz国产在线观看| 丰满白嫩尤物一区二区| 天堂8在线天堂资源bt| 78精品国产综合久久香蕉| 国产一区二区三区直播精品电影 | 国内精品美女在线观看| 不卡一区二区三区视频| 免费高潮视频95在线观看网站| 色老综合老女人久久久| 在线看片中文字幕| 国产在线国偷精品产拍免费yy| 免费久久久一本精品久久区| 人人鲁人人莫人人爱精品| 最新国产精品拍自在线播放| 中文字幕av影院| 粉嫩av亚洲一区二区图片| 日韩精品xxxx| 成人情趣视频网站| 欧美一级大片在线观看| www.四虎在线观看| 精品日韩美女的视频高清| 亚洲一区二区中文字幕在线观看| 国产一区日韩欧美| 色吧亚洲视频| 高清不卡av| 日韩av网站大全| 中文字幕一级片| 亚洲成人动漫在线观看| 制服.丝袜.亚洲.中文.综合懂| 久久国产精品亚洲人一区二区三区 | 97久久精品人人做人人爽| 91嫩草国产丨精品入口麻豆| 欧美爱爱网站| 韩国三级日本三级少妇99| www在线播放| 欧美午夜寂寞影院| 国产综合精品久久久久成人av| 国模少妇一区二区三区| 一区二区三区四区久久| 久久青草视频| 午夜精品美女自拍福到在线| 日本欧美在线视频免费观看| 日韩av在线看| 精品国产av鲁一鲁一区| 色婷婷狠狠综合| 嘿嘿视频在线观看| 成人黄色在线看| 亚洲一区二区中文字幕在线观看| 日本中文字幕不卡| 又粗又黑又大的吊av| 欧美高清日韩| 在线观看欧美激情| 欧美精品色图| 免费一区二区三区在在线视频| 国产一区二区三区亚洲综合 | 91动漫在线看| 69精品国产久热在线观看| 国产精品爱啪在线线免费观看| 国产香蕉视频在线看| 亚洲国内精品在线| 精品久久久中文字幕人妻| 欧美片在线播放| 91视频综合网| 国产精品午夜电影| 97人人爽人人| 蜜芽一区二区三区| 日本精品久久久久中文字幕| 最新日韩在线| 免费看黄在线看| 精品香蕉视频| 欧美精品久久| 国产精品99| 国产精品视频永久免费播放| 可以免费看污视频的网站在线| 精品国产三级电影在线观看| 欧美精品二区三区| 亚洲成av人影院| 日本黄色小视频在线观看| 久久综合精品国产一区二区三区| 亚洲一区二区三区综合| 日韩制服丝袜av| 欧美一级片中文字幕| 欧美亚洲三区| 青青在线视频观看| 久久久噜噜噜久久狠狠50岁| 亚洲一区三区电影在线观看| 日韩片欧美片| 黄色网zhan| 欧美婷婷在线| 成人性生活视频免费看| 一本色道久久综合| 日本三级免费观看| 日韩电影一二三区| 日韩精品视频一二三| 久久99国产乱子伦精品免费| 在线一区二区不卡| 成人综合婷婷国产精品久久免费| 日本久久精品一区二区| 免费不卡在线视频| 亚洲国产综合av| 成人激情免费网站| 欧美精品黑人猛交高潮| 久久精品视频免费观看| 国产一级淫片久久久片a级| 成人欧美一区二区三区白人| 青青草手机在线观看| 中文字幕欧美三区| 日本高清一二三区| 久久精品一二三| 99精品中文字幕| 艳妇臀荡乳欲伦亚洲一区| 国产午夜性春猛交ⅹxxx| 久久免费视频6| 亚洲视频在线一区观看| 精品少妇一二三区| 色综合久久66| 国产精品视频在线观看免费| 精品国产乱码久久久久久闺蜜| 三级在线播放| 亚洲国产精品久久久| 精品国产亚洲AV| 精品亚洲一区二区三区在线观看| 91社区在线观看播放| 欧美黄色片免费观看| 欧美www.| 99久热re在线精品996热视频 | 国产精品亚洲综合一区在线观看| av丝袜天堂网| 久久亚洲二区| 久久精品免费一区二区| 亚洲福利精品| 在线观看免费成人av| 日韩高清中文字幕一区| 久久久久亚洲av无码麻豆| 久久久一区二区三区捆绑**| 日韩女优一区二区| 亚洲精品成人少妇| 日本a级c片免费看三区| 精品久久五月天| 天堂а√在线资源在线| 91av免费观看91av精品在线| 亚洲欧美专区| 日本视频一区二区不卡| 91久久综合| 久久国产免费视频| 国产精品激情偷乱一区二区∴| 日本伦理一区二区三区| 精品国产福利在线| 久久国产视频一区| 日韩免费观看高清完整版在线观看| 国产高清免费观看| 中文字幕欧美日韩| www.精品| 成人三级在线| 中文一区一区三区免费在线观看| 久久综合久久色| 久久婷婷一区二区三区| 日本中文字幕网| 色欧美片视频在线观看| 蜜臀久久99精品久久久| 国产丝袜精品第一页| 高清电影在线免费观看| 91免费版网站入口| 高潮按摩久久久久久av免费| 久久久水蜜桃| 亚洲激情在线| 午夜剧场免费看| 国产日韩欧美精品电影三级在线| 日韩高清精品免费观看| 日韩欧美一区电影| 超碰最新在线| 91pron在线| 韩日成人av| av av在线| 亚洲超碰97人人做人人爱| 亚洲毛片欧洲毛片国产一品色| 日韩第一页在线| yellow在线观看网址| 国产精品久久综合av爱欲tv| 九九久久精品| 国产成人手机视频| 国产日韩欧美精品电影三级在线| 日本黄色中文字幕| 国产亚洲一区精品| 99热播精品免费| 亚洲一区高清| 国产精品影视天天线| 麻豆国产尤物av尤物在线观看| 日韩精品自拍偷拍| 色女人在线视频| 国产成人综合久久| 精品国产精品| 亚洲一二三av| 一区二区三区成人| 日韩在线观看视频网站| 7777免费精品视频| 国产真实有声精品录音| 国产av熟女一区二区三区| 丰满放荡岳乱妇91ww| 国产三级av片| 一区二区福利视频| 精品视频91| 午夜精品一区二区三区四区| 蜜臀久久久久久久| 青青草手机在线视频| 日韩久久精品电影| 免费高清视频在线一区| 精品久久久久亚洲| 久久美女性网| 久久久精品少妇| 欧美制服丝袜第一页| 毛片在线视频| 国产精品久久色| 欧美~级网站不卡| 国产熟女高潮一区二区三区| 91国产视频在线观看| 成人看片免费| 美女精品国产| 国产一区在线看| 国产精品视频免费播放| 色偷偷av一区二区三区乱| 操欧美女人视频| 日本美女高潮视频| 一个色综合av| jyzzz在线观看视频| 国产精品国模大尺度私拍| 亚洲深深色噜噜狠狠爱网站| 亚洲香蕉中文网| 欧美精品一级二级| 中文在线а√天堂| 精品伦精品一区二区三区视频| 麻豆高清免费国产一区|