AndroidUtilCode AdaptScreenUtils画面の使用ノートと簡単な分析
17158 ワード
トップアダプティブ原理Androidスクリーンアダプティブターミネーター乱暴で高速なAndroidフルスクリーンアダプティブスキーム
スクリーンの適合原理は簡単に言います寸法単位紹介 解釈原理 のUI図のサイズと画素は固定する. 設計図の幅が360 dpである、異なるデバイスの画面画素が異なる、360 dpにdensityを乗じて算出する画素値が各デバイスの画面画素幅に等しいようにするには、現在のActivityのdensityを変更して目的を達成することができる. という非常に簡単に使用できます.ソースコード を見てください
に注意
スクリーンの適合原理は簡単に言います
dpi
:スクリーン密度、スクリーン上のインチ当たりの画素点数.スクリーン対角線上の画素点の総数をスクリーン対角線の長いで除算して得る.dip
:最も一般的なdp
単位で、画面にはインチごとに160点があり、各点が1画素を表すと、1 dpは1画素に等しい.問題が発生しました.もしスクリーンに1インチ当たり320画素があれば、スクリーン幅は1080画素です.このとき、スクリーン幅はどのくらいdpですか.1.スクリーン毎インチ320の画素は、160個のドットでカバーすると、各ドットは2個の画素、つまり2個の画素は1 dpを表し、スクリーンは1080個の画素がある場合、540個のドットでカバーする必要があり、スクリーンサイズは540 dpである.density
:1インチの画素点ごとに160を除いて、つまり1インチごとに160の点があって、各点は何画素をカバーすることができますか.AdaptScreenUtils
がどのように適切に作られているか見てみましょうActivity
のgetResources()
メソッドを書き換えると、@Override
public Resources getResources() {
//
return AdaptScreenUtils.adaptHeight(super.getResources(), "UI ");
}
public final class AdaptScreenUtils {
public static Resources adaptHeight(final Resources resources, final int designHeight) {
// designHeight UI
return adaptHeight(resources, designHeight, false);
}
public static Resources adaptHeight(final Resources resources, final int designHeight, final boolean includeNavBar) {
//
float screenHeight = (resources.getDisplayMetrics().heightPixels + (includeNavBar ? getNavBarHeight(resources) : 0)) * 72f;
// , applyDisplayMetrics()
float newXdpi = screenHeight / designHeight;
applyDisplayMetrics(resources, newXdpi);
return resources;
}
private static void applyDisplayMetrics(final Resources resources, final float newXdpi) {
// DisplayMetrics xdpi
resources.getDisplayMetrics().xdpi = newXdpi;
Utils.getApp().getResources().getDisplayMetrics().xdpi = newXdpi;
applyOtherDisplayMetrics(resources, newXdpi);
}
// resources xdpi newXdpi .
private static void applyOtherDisplayMetrics(final Resources resources, final float newXdpi) {
if (sMetricsFields == null) {
sMetricsFields = new ArrayList<>();
Class resCls = resources.getClass();
Field[] declaredFields = resCls.getDeclaredFields();
while (declaredFields != null && declaredFields.length > 0) {
for (Field field : declaredFields) {
if (field.getType().isAssignableFrom(DisplayMetrics.class)) {
field.setAccessible(true);
DisplayMetrics tmpDm = getMetricsFromField(resources, field);
if (tmpDm != null) {
sMetricsFields.add(field);
tmpDm.xdpi = newXdpi;
}
}
}
// resources xdpi newXdpi
resCls = resCls.getSuperclass();
if (resCls != null) {
declaredFields = resCls.getDeclaredFields();
} else {
break;
}
}
} else {
applyMetricsFields(resources, newXdpi);
}
}
}
xDpi
はどこで使いますか.public class TypedValue {
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:
// pt ,xdpi , value , value . 0.0.
// pt dp , .
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;
}
}
に注意
TextView
の文字サイズについては、sp
を単位として用いることが推奨、これにより文字サイズが自動的に適合する.そして、TextView
サイズの大きさを絶対に書かないでください.そうしないと、TextView
サイズよりも文字が大きくて表示不全になりやすいです.wrap_content
の使用を推奨する.