AndroidUtilCode AdaptScreenUtils画面の使用ノートと簡単な分析

17158 ワード

トップアダプティブ原理Androidスクリーンアダプティブターミネーター乱暴で高速なAndroidフルスクリーンアダプティブスキーム
スクリーンの適合原理は簡単に言います
  • 寸法単位紹介
  • 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の点があって、各点は何画素をカバーすることができますか.
  • 解釈原理
  • のUI図のサイズと画素は固定する.
  • 設計図の幅が360 dpである、異なるデバイスの画面画素が異なる、360 dpにdensityを乗じて算出する画素値が各デバイスの画面画素幅に等しいようにするには、現在のActivityのdensityを変更して目的を達成することができる.
  • AdaptScreenUtilsがどのように適切に作られているか見てみましょう
  • ActivitygetResources()メソッドを書き換えると、
  • という非常に簡単に使用できます.
    @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の使用を推奨する.