Android工具类之屏幕处理

本文探讨了Android应用中如何进行屏幕适配,包括不同分辨率和尺寸屏幕的处理策略,详细讲解了如何使用dimen资源文件、比例计算以及dp与sp单位的运用,旨在帮助开发者创建跨设备兼容的用户界面。
摘要由CSDN通过智能技术生成
public class ScreenUtil {

    /**将px值转换为dip或dp值,保证尺寸大小不变*/
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }


    /**将dip或dp值转换为px值,保证尺寸大小不变*/
    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }


    /**将px值转换为sp值,保证文字大小不变*/
    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }


    /**将sp值转换为px值,保证文字大小不变*/
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }


    /**屏幕宽度(像素)*/
    public static int getWindowWidth(Activity context) {
        DisplayMetrics metric = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(metric);
        return metric.widthPixels;
    }


    /**屏幕高度(像素)*/
    public static int getWindowHeight(Activity context) {
        DisplayMetrics metric = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(metric);
        return metric.heightPixels;
    }

    /**
     * 获得状态栏的高度
     *
     * @param context
     * @return 状态栏高度
     */
    public static int getStatusHeight(Context context) {

        int statusHeight = -1;
        try {
            Class<?> clazz = Class.forName("com.android.internal.R$dimen");
            Object object = clazz.newInstance();
            int height = Integer.parseInt(clazz.getField("status_bar_height")
                    .get(object).toString());
            statusHeight = context.getResources().getDimensionPixelSize(height);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusHeight;
    }

    /**
     * 屏幕分辨率
     *
     * @param mContext
     * @return 屏幕分辨率信息
     */
    public static ScreenInfo getScreenInfo(Context mContext) {
        ScreenInfo result = new ScreenInfo();
        int widthPixels;
        int heightPixels;

        WindowManager w = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

        Display d = w.getDefaultDisplay();
        DisplayMetrics metrics = new DisplayMetrics();
        d.getMetrics(metrics);
        // since SDK_INT = 1;
        widthPixels = metrics.widthPixels;
        heightPixels = metrics.heightPixels;
        // includes window decorations (statusbar bar/menu bar)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            try {
                widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
                heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
            } catch (Exception ignored) {
                ignored.printStackTrace();
            }
        }
        // includes window decorations (statusbar bar/menu bar)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            try {
                Point realSize = new Point();
                Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
                widthPixels = realSize.x;
                heightPixels = realSize.y;
            } catch (Exception ignored) {
                ignored.printStackTrace();
            }
        }

        result.widthPixels = widthPixels;
        result.heightPixels = heightPixels;
        result.screenRealMetrics = widthPixels + "x" + heightPixels;
        result.density = metrics.density;
        result.density_default = DisplayMetrics.DENSITY_DEFAULT;
        result.densityDpi = metrics.densityDpi;
        result.densityDpiStr = metrics.densityDpi + " dpi";
        result.scaledDensity = metrics.scaledDensity;
        result.xdpi = metrics.xdpi;
        result.ydpi = metrics.ydpi;
        result.size = (Math.sqrt(Math.pow(widthPixels, 2) + Math.pow(heightPixels, 2)) / metrics.densityDpi);
        result.sizeStr = String.format("%.2f", result.size);

        return result;
    }

    public static List<String> getGpuFreqVolt() {
        List<String> result = new ArrayList<>();

        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/proc/gpufreq/gpufreq_opp_dump"));
            while ((line = br.readLine()) != null) {
                result.add(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }

    /**
     *  屏幕信息对象
     */
    public static class ScreenInfo {

        /**英寸*/
        public double size;

        public String sizeStr;

        /**高*/
        public int heightPixels;

        /**宽*/
        public int widthPixels;

        public String screenRealMetrics;

        /**显示器的逻辑密度*/
        public float density;

        /**屏幕密度为点每英寸*/
        public int densityDpi;

        public String densityDpiStr;

        /**显示在显示器的字体的定标因子*/
        public float scaledDensity;

        /**每在 X 维屏幕英寸的确切物理像素*/
        public float xdpi;

        /**每在 Y 维屏幕英寸的确切物理像素*/
        public float ydpi;

        /**在屏幕中显示的参考密度*/
        public int density_default;

        @Override
        public String toString() {
            return "ScreenInfo{" +
                    "size=" + size +
                    ", sizeStr='" + sizeStr + '\'' +
                    ", heightPixels=" + heightPixels +
                    ", screenRealMetrics='" + screenRealMetrics + '\'' +
                    ", widthPixels=" + widthPixels +
                    ", density=" + density +
                    ", densityDpi=" + densityDpi +
                    ", densityDpiStr='" + densityDpiStr + '\'' +
                    ", scaledDensity=" + scaledDensity +
                    ", xdpi=" + xdpi +
                    ", ydpi=" + ydpi +
                    ", density_default=" + density_default +
                    '}';
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值