Android开发 - DisplayMetrics 类控制布局图形的缩放显示解析

DisplayMetrics 是什么

  • DisplayMetrics类Android中用于获取设备的显示属性(像素等)

DisplayMetrics 的主要属性

  • metrics.density屏幕密度,用于决定屏幕上每英寸的像素数

    DisplayMetrics metrics = new DisplayMetrics();
    density = metrics.density;
    
    • 常见值0.75(低密度)1.0(中密度)1.5(高密度)2.0(超高密度)
  • metrics.densityDpi屏幕的DPI值,告诉你屏幕的像素密度级别(比如中密度、高清)

    DisplayMetrics metrics = new DisplayMetrics();
    densityDpi = metrics.densityDpi;
    
    • 常见值120(ldpi)160(mdpi)240(hdpi)320(xhdpi)480(xxhdpi)640(xxxhdpi)
  • metrics.widthPixels:屏幕的实际宽度像素

    DisplayMetrics metrics = new DisplayMetrics();
    widthPixels = metrics.widthPixels;
    
  • metrics.heightPixels:屏幕的实际高度像素

    DisplayMetrics metrics = new DisplayMetrics();
    heightPixels = metrics.heightPixels;
    
  • metrics.scaledDensity:字体缩放密度,用于调整字体大小

    DisplayMetrics metrics = new DisplayMetrics();
    scaledDensity = metrics.scaledDensity;
    

代码运用解析

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取 DisplayMetrics 实例
        DisplayMetrics displayMetrics = new DisplayMetrics();

        // 提取各项参数
        // 这些字段分别代表屏幕密度、DPI、宽度、高度和缩放密度
        float density = displayMetrics.density;
        int densityDpi = displayMetrics.densityDpi;
        int widthPixels = displayMetrics.widthPixels;
        int heightPixels = displayMetrics.heightPixels;
        float scaledDensity = displayMetrics.scaledDensity;

        // 打印屏幕信息
        Log.d("DisplayMetrics", "Density: " + density);
        Log.d("DisplayMetrics", "Density DPI: " + densityDpi);
        Log.d("DisplayMetrics", "Width Pixels: " + widthPixels);
        Log.d("DisplayMetrics", "Height Pixels: " + heightPixels);
        Log.d("DisplayMetrics", "Scaled Density: " + scaledDensity);

        // 你可以根据这些信息调整布局或图形的显示
    }
}

常见场景

  • 适配不同屏幕:根据densitydensityDpi调整布局和图片资源,以确保在各种屏幕密度下都能良好显示

  • 计算屏幕尺寸:使用widthPixelsheightPixels来确定屏幕的实际像素大小,从而做进一步的计算或调整

  • 字体大小调整:通过scaledDensity来调整文本的显示,以适应用户设置的字体大小

部分场景代码示例解析

适应不同屏幕密度的图片资源

  • 如果有不同分辨率图片资源(如drawable-mdpi、drawable-hdpi),你可以根据屏幕的密度来选择合适的资源。示例:展示如何获取屏幕密度并应用不同的图片资源

    import android.app.Activity;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ImageView imageView = findViewById(R.id.imageView);
    
            // 获取屏幕的显示信息
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            // 根据屏幕密度选择合适的图片资源
            int densityDpi = metrics.densityDpi;
            Drawable drawable;
    
            if (densityDpi >= DisplayMetrics.DENSITY_XHIGH) {
                drawable = getResources().getDrawable(R.drawable.image_xhdpi);
            } else if (densityDpi >= DisplayMetrics.DENSITY_HIGH) {
                drawable = getResources().getDrawable(R.drawable.image_hdpi);
            } else {
                drawable = getResources().getDrawable(R.drawable.image_mdpi);
            }
    
            // 使用屏幕密度来选择合适的图片资源,以确保图像在不同设备上的清晰度
            imageView.setImageDrawable(drawable);
        }
    }
    

动态调整字体大小

  • 可以根据屏幕的scaledDensity动态调整字体大小,以便在不同设备上保持一致的可读性

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView textView = findViewById(R.id.textView);
    
            // 获取屏幕的显示信息
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            // 计算适合的字体大小
            float scaledDensity = metrics.scaledDensity;
            float fontSize = 16 * scaledDensity;  // 16sp 转换为 px
    
            // 应用计算得到的字体大小
            // 根据屏幕的缩放密度调整字体大小,确保文字在不同设备上可读
            textView.setTextSize(fontSize);
        }
    }
    

获取屏幕宽高并设置布局

  • 你可以使用屏幕的宽度高度来调整布局,以适应不同尺寸的屏幕

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.LinearLayout;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            LinearLayout layout = findViewById(R.id.layout);
    
            // 获取屏幕的显示信息
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            // 获取屏幕的宽度和高度
            int widthPixels = metrics.widthPixels;
            int heightPixels = metrics.heightPixels;
    
            // 根据屏幕宽度调整布局的宽度
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    (int) (widthPixels * 0.8),  // 设置宽度为屏幕宽度的80%
                    LinearLayout.LayoutParams.WRAP_CONTENT
            );
            
            // 根据屏幕的实际尺寸来调整布局的大小或位置,优化用户体验
            layout.setLayoutParams(params);
        }
    }
    
posted @ 2024-08-19 21:35  阿俊学JAVA  阅读(101)  评论(0编辑  收藏  举报