螢幕適配
為什麼要進行螢幕適配 ?先說說原理,在說怎麼適配
支援Android裝置
由於Android系統的開放性,任何使用者、開發者、OEM廠商、運營商都可以對Android進行定製,於是導致:
Android系統碎片化:小米定製的MIUI、魅族定製的flyme、華為定製的EMUI等等
當然都是基於Google原生系統定製的
Android螢幕解析度碎片化:320x480、480x800、720x1280、1080x1920
據友盟指數顯示,統計至2016年12月,支援Android的裝置共有27796種
螢幕尺寸
含義:手機對角線的物理尺寸
單位:英寸(inch),1英寸=2.54cm
螢幕畫素密度
含義:每英寸的畫素點數
單位:dpi(dots per ich)
Nexul5 445
10980*1080+1920*1920 開根號 /4.95
1 實際密度與系統密度概念,為什麼會有實際密度和系統密度的概念
Nexul5 445dpi
輕金屬 輕金屬的共同特點是比重小於5,(又有一說是密度小於4 .5克/立方匣米),如鋁的比重是2 .7,鎂的比重是1 .7倍,而鉀的比重只有0.87,鈉只有0.97
重金屬 重金屬指比重大於5的金屬,(一般指密度大於4.5克每立方厘米的金屬) 銅、鉛、鋅、鐵、鈷、鎳、錳、鎘、汞、鎢、鉬、金、銀等
低密度(mdpi) 中密度(hdpi) 高密度(xhdpi) 超高密度(xxhdpi) 超超高密度(xxxhdpi)
160dpi 1dp=1px
445dpi 1dp=2.78px 1dp=2px;
displaymetrics.density欄位指定比例因子必須使用轉換DP單位畫素,
根據當前螢幕的密度。在中等密度螢幕,displaymetrics.density等於1;在高密度的螢幕
,它等於1.5;在超高密度的螢幕,它等於2;在低密度的螢幕,它等於0.75。這個數字的因素,
你應該乘DP單位為當前螢幕獲得實際的畫素數。(然後新增0.5f繞圖到最接近的整數,當轉換成一個整數。)
但是,現在很多Android廠商不一定會選擇這些值作為系統密度,
而是選擇實際的dpi作為系統密度,這就導致了很多手機的dpi也不是在這些值內。
例如小米Note這樣的xxhdpi的裝置他的系統密度並不是480,而是它的實際密度440。
public static int dip2px(float dipValue) {
float scale = mContext.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
2 dp和px 如何互轉
3 為什麼會有 drawable-mdpi、drawable-hdpi、drawable-xhdpi drawable-xxhdpi 之類的檔案 這些檔案是起什麼作用的
下面我講適配,我們適配其實就是那麼幾種
1 .寫多套佈局layout
2.寫多套value
3.放多套圖片
4.用.9圖片 左上可以拉伸,右下不可以拉伸區域。
5 .自定義佈局
這是我今天講的重點自定義 佈局
我們一把都用倆個佈局倆個佈局大家都清楚一個線性佈局,一個相對佈局,那我們為啥不自定義這倆個佈局呢,我以前想過,但考慮效能等等沒有弄
但是我看到一篇不錯的文章,我覺的可以寫,現在我也在用,怕自己忘記了發一份放網上
public class PrecentRelative extends RelativeLayout { public PrecentRelative(Context context) { super(context); } public PrecentRelative(Context context, AttributeSet attrs) { super(context, attrs); } public PrecentRelative(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public PrecentRelative(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } /** * 測量主見 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int with= View.MeasureSpec.getSize(widthMeasureSpec); int height=View.MeasureSpec.getSize(heightMeasureSpec); int childCount=this.getChildCount(); for (int i = 0; i0){ layoutParams.width= (int) (with*withParams); } if (heightParams>0){ layoutParams.height= (int) (height*heightParams); } } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /** * 把佈局設定上去 * @param attrs * @return */ @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParam(getContext(),attrs); } public static class LayoutParam extends LayoutParams{ private float withlayout; private float heightlayout; public float getHeightlayout() { return heightlayout; } public void setHeightlayout(float heightlayout) { this.heightlayout = heightlayout; } public float getWithlayout() { return withlayout; } public void setWithlayout(float withlayout) { this.withlayout = withlayout; } /** * 只要修改這塊就行 * @param c * @param attrs */ public LayoutParam(Context c, AttributeSet attrs) { super(c, attrs); TypedArray typedArray=c.obtainStyledAttributes(attrs,R.styleable.PrecentRelative); withlayout=typedArray.getFloat(R.styleable.PrecentRelative_layout_withPrecent,this.getWithlayout()); heightlayout=typedArray.getFloat(R.styleable.PrecentRelative_layout_heightPrecent,this.getHeightlayout()); } public LayoutParam(ViewGroup.LayoutParams source) { super(source); } public LayoutParam(LayoutParams source) { super(source); } public LayoutParam(MarginLayoutParams source) { super(source); } public LayoutParam(int w, int h) { super(w, h); } } }
舊這麼一個類,這個相對佈局的,其他佈局也可以仿照來寫
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2331/viewspace-2813018/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter螢幕適配Flutter
- AutoLayout螢幕適配
- android 螢幕適配Android
- flutter 螢幕尺寸適配 字型大小適配Flutter
- Android 主流螢幕以及適配Android
- Android螢幕適配(理論適配100%機型)Android
- 【postcss-px-to-viewport】螢幕適配CSSView
- Flutter螢幕適配 - 等比縮放Flutter
- @media 移動端螢幕適配
- Android 螢幕適配終結者Android
- android螢幕適配三:通過畫素密度適配Android
- 移動 web 端螢幕適配 – remWebREM
- Android螢幕適配總結和思考Android
- Android技能樹 — 螢幕適配小結Android
- H5 分層螢幕適配H5
- 極其簡單的Flutter 螢幕適配Flutter
- Android螢幕適配前先了解這些Android
- android 今日頭條的螢幕適配理解Android
- android 螢幕適配二:手寫百分比佈局適配Android
- android 螢幕適配一:通過自定義View的方式實現適配AndroidView
- Android 螢幕適配:最全面的解決方案Android
- 淺談-web螢幕適配的解決方案Web
- Flutter螢幕適配,簡單粗暴的全域性適配方式Flutter
- 學習筆記:自適應佈局,多螢幕適配筆記
- Andoid螢幕適配終極手段(小編用過最得勁的dp適配)
- 鴻蒙Banner圖一多適配不同螢幕鴻蒙
- 實踐 | 為 Trackr app 適配大螢幕裝置APP
- Android最全螢幕適配的幾個重要概念(三)Android
- Xcode11 Luanchscreen.storyboard 複雜元素螢幕適配XCode
- cocos creator螢幕適配的一些知識點
- [譯] Flutter —— 根據不同螢幕尺寸高效的適配 UIFlutterUI
- 移動APP測試-Android螢幕適配問題(一)APPAndroid
- 移動APP測試:Android螢幕適配問題二APPAndroid
- flutter螢幕適配 ,一種一勞永逸的全域性適配方式Flutter
- vue專案PC端如何適配不同解析度螢幕Vue
- Android螢幕適配很難嘛?其實也就那麼回事Android
- 詳解 Android 12L|更好地適配大螢幕裝置Android
- Android APP全方位效能調優之螢幕適配終結者AndroidAPP