Density 屏幕簡單設(shè)配(頭條)

public class Density {
    private static float appDensity;
    private static float appScaledDensity;
    private static DisplayMetrics appDisplayMetrics;

    public static void setDensity(@NonNull final Application application) {
        //獲取application的DisplayMetrics
        appDisplayMetrics = application.getResources().getDisplayMetrics();

        if (appDensity == 0) {
            //初始化的時候賦值
            appDensity = appDisplayMetrics.density;
            appScaledDensity = appDisplayMetrics.scaledDensity;

            //添加字體變化的監(jiān)聽
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    //字體改變后,將appScaledDensity重新賦值
                    if (newConfig != null && newConfig.fontScale > 0) {
                        appScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                @Override
                public void onLowMemory() {
                }
            });
        }
    }

    //此方法在BaseActivity中做初始化(如果不封裝BaseActivity的話,直接用下面那個方法就好了)
    public static void setDefault(Activity activity) {
        setAppOrientation(activity, AppUtils.WIDTH);
    }

    //此方法用于在某一個Activity里面更改適配的方向
    public static void setOrientation(Activity activity, String orientation) {
        setAppOrientation(activity, orientation);
    }

    /**
     * targetDensity
     * targetScaledDensity
     * targetDensityDpi
     * 這三個參數(shù)是統(tǒng)一修改過后的值
     * <p>
     * orientation:方向值,傳入width或height
     */
    private static void setAppOrientation(@Nullable Activity activity, String orientation) {

        float targetDensity;

        //獲取狀態(tài)欄高度
        int barHeight = AppUtils.getStatusBarHeight(activity);
        if (orientation.equals("height")) {
            targetDensity = (appDisplayMetrics.heightPixels - barHeight) / 667f;
        } else {
            targetDensity = appDisplayMetrics.widthPixels / 360f;
        }

        float targetScaledDensity = targetDensity * (appScaledDensity / appDensity);
        int targetDensityDpi = (int) (160 * targetDensity);

        /**
         *
         * 最后在這里將修改過后的值賦給系統(tǒng)參數(shù)
         *
         * 只修改Activity的density值
         */

        DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
        activityDisplayMetrics.density = targetDensity;
        activityDisplayMetrics.scaledDensity = targetScaledDensity;
        activityDisplayMetrics.densityDpi = targetDensityDpi;
    }

    public static class AppUtils {

        public final static String WIDTH = "width";

        public final static String HEIGHT = "height";

        /**
         * px轉(zhuǎn)dp
         *
         * @param context The context
         * @param px      the pixel value
         * @return value in dp
         */
        public static int pxToDp(Context context, float px) {
            DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
            return (int) ((px / displayMetrics.density) + 0.5f);
        }

        /**
         * dp轉(zhuǎn)px
         *
         * @param context
         * @param dp
         * @return
         */
        public static int dpToPx(Context context, float dp) {
            DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
            return (int) ((dp * displayMetrics.density) + 0.5f);
        }

        /**
         * 獲取狀態(tài)欄高度
         *
         * @param context
         * @return
         */
        public static int getStatusBarHeight(Context context) {
            int result = 0;
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
                    "android");
            if (resourceId > 0) {
                result = context.getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }

        /**
         * 獲得屏幕高度
         *
         * @param context
         * @return
         */
        public static int getPxWidth(Context context) {
            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            return outMetrics.widthPixels;
        }

        /**
         * 獲得屏幕寬度
         *
         * @param context
         * @return
         */
        public static int getPxHeight(Context context) {
            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            return outMetrics.heightPixels;
        }

        /**
         * 獲得屏幕高度
         *
         * @param context
         * @return
         */
        public static int getDpWidth(Context context) {
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics dm = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(dm);
            int width = dm.widthPixels;         // 屏幕寬度(像素)
            float density = dm.density;         // 屏幕密度(0.75 / 1.0 / 1.5)
            // 屏幕寬度算法:屏幕寬度(像素)/屏幕密度
            int dpWidth = (int) (width / density);  // 屏幕寬度(dp)
            return dpWidth;
        }

        /**
         * 獲得屏幕寬度
         *
         * @param context
         * @return
         */
        public static int getDpHeight(Context context) {
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics dm = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(dm);
            int height = dm.heightPixels;       // 屏幕高度(像素)
            float density = dm.density;         // 屏幕密度(0.75 / 1.0 / 1.5)
            // 屏幕寬度算法:屏幕寬度(像素)/屏幕密度
            int dpHeight = (int) (height / density);// 屏幕高度(dp)
            return dpHeight;
        }
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容