這裡就以榮耀v9為例 物理解析度為1440*2560,5.7英吋
dpi: 這個是系統指定的為640
scaledensity: scaledensity=dpi/160由於dpi是系統指定所以scaledensity=640/160=4
ppi: 每英吋所包含的畫素點個數
邏輯解析度 = (物理解析度) / 縮放因子=360*640
渲染的解析度又為 邏輯解析度*縮放因子=1440*25601:資源適配:.9圖和svg進行縮放在我們android裡面1dp = 1px*scaledensity = 1px*dpi/160
所以榮耀v9手機: 1dp = 1px*640/160=4px; 假如我們在布局裡面輸出360dp的話那麼渲染到螢幕上就是4*360個畫素點=1440螢幕的寬度.
在很多公司的切圖都是以ios的750作為切圖標準,而且只切一套圖,這個時候就可以根據修改上面的dpi的 density來達到適配
density = 1440/750=1.92
dpi =density*160=307.2
這樣邏輯解析度就為(1440*2560)/1.92=750*1333
那麼當輸入390dp的時候會顯示多少畫素呢?
1dp = 1px*scaledensity這個公式不變
1dp = 1.92px; 390dp = 748.8px這只是邏輯寬度 實際渲染的寬度就等於748.8*1.92=1437.696 相當於乙個螢幕寬度
2:布局適配
3:畫素適配
4:限定符適配:比如解析度限定符 xhdpi xxhdpi ***hdpi 尺寸限定符:layout_small, layout_large...
5:最小螢幕限定符:values-sw360dp,values-sw384dp,... 螢幕方向限定符:layout_land, layout_port
6:百分比適配
7:改變displaymetrics引數適配
百分比適配:
percentlayout extends relativelayout 並自定義幾個百分比屬性,比如width,height,margin等
重寫其onmeasure方法,獲取到所有子類,並獲取子類的百分比屬性,根據控制項的寬高和百分比係數轉換成真正的寬高最後達到最終適配.
畫素適配screenlayout extends relativelayout
畫素適配就是直接輸入px的適配也叫跟據螢幕比來適配,
原理:我們要跟據ui妹妹給的切圖的尺寸來當做乙個標準,比如很多都用ios的750 ,然後我們通過**獲取到android手機螢幕寬高,這二個數字對比得到乙個比例,然後在onmeasure裡面對子view的寬高等引數進行重新計算
改變displaymetrics引數適配
displaymetrics裡面有幾個重要引數
density:螢幕密度->以每一寸有160個畫素點為基礎 density=1;,如果每一寸有320個畫素點的話,那麼density=2
scaledensity:字型縮放比例,預設情況下density = scaledensity;
densitydpi:螢幕上每一英吋畫素點有多不個,就是160或者320... android最終都是以px來顯示的
因為android裡面的大小都是通過px來顯示的,可以從
displaymetrics metrics)
return 0;
}所以我們改變裡面幾個引數就可以達到完美適配
獲取displaymetrics方法,resources裡面的getdisplaymetrics()
然後獲取
我們這可以跟據我們自己設定的乙個設定稿的寬高,比如
public static final float width = 384;
這樣我們就可以自己計算出自己想要的density; targetdensity =displaymetrics.widthpixels / width
自己想要的scaledensity字型縮放比例
計算出自己的dpi: targetdensitydpi = (int) (targetdensity * 160);
最後就是將計算出來的進行替換
//替換系統的值
displaymetrics dm = activity.getresources().getdisplaymetrics();
dm.density = targetdensity;
dm.densitydpi = targetdensitydpi;
dm.scaleddensity = targetscaledensity;
因為系統字型可放大放小,可以還要監聽字型改變
//新增字型變換監聽
@override
public void onconfigurationchanged(configuration newconfig)
}@override
public void onlowmemory()
});
最終**如下:
package com.ancely.desy;
import android.content.context;
import android.content.res.typedarray;
import android.util.attributeset;
import android.view.view;
import android.view.viewgroup;
import android.widget.relativelayout;
/* * @專案名: px
* @包名: com.ancely.desy
* @檔名: percentlayout
* @描述: 百分比布局的實現
*/public class percentlayout extends relativelayout
public percentlayout(context context, attributeset attrs)
public percentlayout(context context, attributeset attrs, int defstyleattr)
public static class layoutparams extends relativelayout.layoutparams
}@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
if (heightpresent > 0)
if (leftmarginpresent > 0)
if (widthpresent > 0)
if (widthpresent > 0)
if (widthpresent > 0) }}
super.onmeasure(widthmeasurespec, heightmeasurespec);
}@override
protected boolean checklayoutparams(viewgroup.layoutparams p)
@override
public layoutparams generatelayoutparams(attributeset attrs)
}
android螢幕適配
1 配置android應用程式適配在不同的手機上,需要在androidmanifest.xml檔案的manifest標籤中新增子元素 1 2 3 4 5 6 7 8 9 10 manifestxmlns android supports screens android smallscreens tr...
Android螢幕適配
在sdk中的幫助文件中。develpe training best practices supporting multiple screens 這裡有多屏適配的介紹。現做簡單記錄。screen size small 至少 426dp x 320dp normal 至少 470dp x 320dp l...
android螢幕適配
ui在不同的螢幕畫素或大小中顯示效果可能會不同 1 建議使用盡量使用線性布局和相對布局,基本上不會產生螢幕大小不適應的問題 2 設定控制項寬高的時候使用單位dip dp 是根據當前裝置大小比例計算出來的 3 文字設定盡量使用sp單位 4 盡量不使用px設定大小 畫素px和dip相互轉換工具,實現兩種...