Android DisplayMetrics 获取和屏幕相关的信息

Android源码中是这样来描述DisplayMetrics的。

/**
 * A structure describing general information about a display, such as its
 * size, density, and font scaling.
 * <p>To access the DisplayMetrics members, initialize an object like this:</p>
 * <pre> DisplayMetrics metrics = new DisplayMetrics();
 * getWindowManager().getDefaultDisplay().getMetrics(metrics);</pre>
 */

按照DisplayMetrics注释中的那样,我们直接写个例子来测试下,就什么都明白了。我用的是小米3:

        DisplayMetrics metrics = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

        /**
         * The logical density of the display.  This is a scaling factor for the
         * Density Independent Pixel unit, where one DIP is one pixel on an
         * approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen),
         * providing the baseline of the system‘s display. Thus on a 160dpi screen
         * this density value will be 1; on a 120 dpi screen it would be .75; etc.
         *
         * <p>This value does not exactly follow the real screen size (as given by
         * {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of
         * the overall UI in steps based on gross changes in the display dpi.  For
         * example, a 240x320 screen will have a density of 1 even if its width is
         * 1.8", 1.3", etc. However, if the screen resolution is increased to
         * 320x480 but the screen size remained 1.5"x2" then the density would be
         * increased (probably to 1.5).
         *
         * density 是逻辑上的屏幕密度,约定在160dpi的设备上,1px=1dip。
         * density = densityDpi / 160
         *
         * @see #DENSITY_DEFAULT
         */
        float density = metrics.density;
        /**
         * The screen density expressed as dots-per-inch.  May be either
         * {@link #DENSITY_LOW}, {@link #DENSITY_MEDIUM}, or {@link #DENSITY_HIGH}.
         * densityDpi 表示每英寸的点数(并不是像素数)
         */
        int densityDpi = metrics.densityDpi;
        /**
         * The absolute height of the display in pixels.
         * 屏幕的绝对高度,以像素为单位。
         */
        int heightPixels = metrics.heightPixels;
        /**
         * The absolute width of the display in pixels.
         * 同样,这个是屏幕的绝对宽度,以像素为单位。
         */
        int widthPixels = metrics.widthPixels;

        /**
         * The exact physical pixels per inch of the screen in the X dimension.
         * 横向每一英寸确切的物理像素,我们可以尝试通过这个值和widthPixels 来计算屏幕的宽度英寸。
         */
        float xdpi = metrics.xdpi;
        /**
         * The exact physical pixels per inch of the screen in the Y dimension.
         * 横向每一英寸确切的物理像素,我们可以尝试通过这个值和heightPixels 来计算屏幕的高度英寸。
         */
        float ydpi = metrics.ydpi;
        /**
         * A scaling factor for fonts displayed on the display.  This is the same
         * as {@link #density}, except that it may be adjusted in smaller
         * increments at runtime based on a user preference for the font size.
         *  scaledDensity 这个值从上面的注释看,是和字体相关的factor,通常情况下这个值和density是相等的,但是假如用户手动的调整了
         *  系统字体的大小,那么这个值就有可能改变(以小米3为例,标准字体,这个值=3,最大字体这个值=3.25)。
         *  因此现在很多情况下,我们把字体单位写成dp,尽管Google建议的字体让写成sp。
         */
        float scaledDensity = metrics.scaledDensity;
        LogUtil.logd(TAG, "metrics.density = " + density);
        LogUtil.logd(TAG, "metrics.densityDpi = " + densityDpi);
        LogUtil.logd(TAG, "metrics.heightPixels = " +heightPixels);
        LogUtil.logd(TAG, "metrics.widthPixels = " +widthPixels);
        LogUtil.logd(TAG, "metrics.xdpi = " +xdpi);
        LogUtil.logd(TAG, "metrics.ydpi = " +ydpi);
        LogUtil.logd(TAG, "metrics.scaledDensity = " +scaledDensity);

        //来计算手机是几英寸的
        float pixelsToDipWidth  = widthPixels / xdpi;
        float pixelsToDipHeight = heightPixels / ydpi;
        LogUtil.logd(TAG, "pixelsToDipWidth = " + pixelsToDipWidth);
        LogUtil.logd(TAG, "pixelsToDipHeight = " + pixelsToDipHeight);
        double mobileInch = Math.sqrt(pixelsToDipHeight * pixelsToDipHeight + pixelsToDipWidth * pixelsToDipWidth);
        //我用的小米3,得到的值是4.917646062686045
        LogUtil.logd(TAG, "mobileInch = " + mobileInch);

通过这个例子,我们明白了dip及px代表着什么,我们就可以来写出dip与px相互转换的方法。(dip = px / density)

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

上面 加的这个0.5f的原因,Google官方文档中其实有介绍:

Then add 0.5f to round the figure up to the nearest whole number, when converting to an integer.

说白了就是为了四舍五入。。。

比如我上面的例子:

mobileInch = 4.917646062686045 ,我+0.5f(=5.417646062686045),然后再取整之后,就得到5。
时间: 2024-12-25 16:33:02

Android DisplayMetrics 获取和屏幕相关的信息的相关文章

【Android】获取手机的相关硬件信息

今天在QQ群里聊天,一个哥们在某宝买到了一个运行内存16G的手机,当时我就吓尿了,所以有了写个程序把这个手机的实际内存读出来的想法,于是就有了今天这篇博客. 所有的信息项如下图所示.(由于我的测试机没有插手机卡,所以有的信息会显示为空) 以下就是代码: package com.liu.chad.practicesqlite; import android.app.ActivityManager; import android.content.Context; import android.os.

android DisplayMetrics 获取屏幕分辨率

Android 提供DisplayMetircs 类可以很方便的获取分辨率.下面介绍 DisplayMetics 类: Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体. 为了获取DisplayMetrics 成员,首先初始化一个对象如下: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetri

Android实现获取应用程序相关信息列表的方法

本文所述为Androdi获取手机应用列表的方法,比如获取到Android应用的软件属性.大小和应用程序路径.应用名称等,获取所有已安装的Android应用列表,包括那些卸载了的,但没有清除数据的应用程序,同时在获取到应用信息的时候,判断是不是系统的应用程序,这是一个应用管理器所必需具备的功能. 具体实现代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Android中获取应用程序(包)的信息----PackageManager

本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:   第一部分: 获取应用程序的packagename.label.icon等 :             第二部分:获取应用程序的占用大小,包括:缓存大小(cachsize).数据大小(datasize). 每部分都为您准备了简单丰富的实例,您一定不会错过. Android系统为我们提供了很多服务管理的类,包括ActivityManager.Po

Android中获取应用程序(包)的信息-----PackageManager的使用(一)

本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:  第一部分: 获取应用程序的packagename.label.icon等 :             第二部分:获取应用程序的占用大小,包括:缓存大小(cachsize).数据大小(datasize). 每部分都为您准备了简单丰富的实例,您一定不会错过. Android系统为我们提供了很多服务管理的类,包括ActivityManager.Pow

Android中获取应用程序(包)的信息

本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:  第一部分: 获取应用程序的packagename.label.icon等 :             第二部分:获取应用程序的占用大小,包括:缓存大小(cachsize).数据大小(datasize). 每部分都为您准备了简单丰富的实例,您一定不会错过. Android系统为我们提供了很多服务管理的类,包括ActivityManager.Pow

Android获取应用自身相关签名信息

Signature.java import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.util.Log; import java.io.ByteArrayInputStream; import java.security.MessageDigest; import java.security.cer

Qt For Android 如何获取手机屏幕大小

获取方法 首先看一段程序代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); } a为应用程序,w为对话框:我们获取屏幕大小,需要从变量a这里获取: QScreen *iScreen = a.primaryScreen(); QSize rScreenSize = iScreen->size(); 虽然把屏幕大小获得了,但是我们改变UI大小的程

获取用户的相关请求信息, 以及包括请求头

#在index文件中 1. print(type(request)) #看出所属库 2. from django.core.handlers.wsgi import WSGIRequest #查看WSGIRequest 发现主要的输入参数是environ 3. print(request.environ) #发现其是字典 4. 循环 request.environ 5.我们要找的请求头是HTTP_USER_AGENT print(request.environ['HTTP_USER_AGENT'