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);
// 你可以根据这些信息调整布局或图形的显示
}
}
常见场景
-
适配不同屏幕:根据density和densityDpi来调整布局和图片资源,以确保在各种屏幕密度下都能良好显示
-
计算屏幕尺寸:使用widthPixels和heightPixels来确定屏幕的实际像素大小,从而做进一步的计算或调整
-
字体大小调整:通过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); } }