`DisplayMetrics`动态获取屏幕的分辨率和像素密度

在Android应用程序中,你可以使用DisplayMetrics类来动态获取屏幕的分辨率和像素密度。以下是如何获取这些信息的示例代码:

java 复制代码
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;

public class ScreenUtility {
    private int screenWidth;
    private int screenHeight;
    private float screenDensity;

    public ScreenUtility(Context context) {
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics metrics = new DisplayMetrics();
        if (windowManager != null) {
            windowManager.getDefaultDisplay().getMetrics(metrics);
            screenWidth = metrics.widthPixels;
            screenHeight = metrics.heightPixels;
            screenDensity = metrics.density;
        }
    }

    public int getScreenWidth() {
        return screenWidth;
    }

    public int getScreenHeight() {
        return screenHeight;
    }

    public float getScreenDensity() {
        return screenDensity;
    }
}

在上述类中,我们首先获得了WindowManager服务,然后创建一个DisplayMetrics对象以存储屏幕参数。我们调用windowManager.getDefaultDisplay().getMetrics(metrics);来填充DisplayMetrics对象,然后我们可以从DisplayMetrics对象中获取屏幕宽度(widthPixels)、屏幕高度(heightPixels)和屏幕密度(density)。

屏幕密度density是一个浮点数,表示每英寸的像素点数(dpi)除以160(基准密度)。例如,density值为2.0意味着屏幕的密度是320dpi(即2.0 * 160dpi)。

请注意,上述代码是一个简单的示例,你可以根据自己的应用程序需求对其进行扩展或修改。例如,你可能还想检索更多的显示指标,如缩放密度(scaledDensity),这对于计算文字大小等非常有用。

为了在活动(Activity)或片段(Fragment)中使用这个类,你可以这样做:

java 复制代码
ScreenUtility screenUtility = new ScreenUtility(this);
int width = screenUtility.getScreenWidth();
int height = screenUtility.getScreenHeight();
float density = screenUtility.getScreenDensity();

// 打印或使用获取到的屏幕参数
Log.d("Screen Info", "Width: " + width + "px, Height: " + height + "px, Density: " + density + "dpi");

在this中传递上下文(Context),并通过相应的getter方法来获取屏幕参数。如果是在片段中,你可以使用getActivity()来获取与片段关联的活动的上下文。

相关推荐
好的佩奇5 小时前
Dart 之集合元素
android·flutter·dart
Easyhood6 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
FlightYe7 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
疯华整猫9 小时前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化
mmsx16 小时前
耳切法切带洞多边形:论文能跑通,真实数据为什么崩
android·kotlin
洞见前行16 小时前
你的 Activity 关了,为什么还活着?Android 内存泄漏从发现、定位到线上治理
android·性能优化·leakcanary
Kapaseker18 小时前
Kotlin 又要加语法糖了:这次轮到 if-else
android·kotlin
恋猫de小郭20 小时前
Flutter 3.50 & Dart 3.14 发布,快来看看有什么更新吧
android·前端·flutter