获取屏幕重要信息
package com.koal.devicerule;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Point;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
tv.setText(getPadInfo());
TextView tv2 = findViewById(R.id.tv_2);
tv2.setText("在使用模拟器测试布局时设置对应的物理尺寸和dpi(DisplayMetrics.densityDpi)");
}
private String getPadInfo() {
// densityDpi : 就是我们常说的dpi。开发用的值240/360/480,图片是按照他来取的,代表每英寸的点数
//
// density : 其实是 DPI / (160像素/英寸) 后得到的值。
//https://blog.csdn.net/u013553529/article/details/126775659
StringBuffer sb = new StringBuffer();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
Point point = new Point();
this.getWindowManager().getDefaultDisplay().getRealSize(point);
double w = point.x * 1.0 / dm.xdpi; // xdpi表示宽度方向上每英寸多少像素
double h = point.y * 1.0 / dm.ydpi; // unit is inch
double size = Math.sqrt(w * w + h * h);
//oppo a5 6.217233666788189
//荣耀50 6.728603125263468
sb.append("屏幕物理尺寸:" + size + "英寸\n");
sb.append("屏幕宽高:" + dm.widthPixels + "*" + dm.heightPixels + "\n");
//x,y方向的ppi计算,可以计算出dm.xdpi,dm.ydip
// sb.append("x:::"+dm.widthPixels/w+"y:::"+dm.heightPixels/h+"\n");
double x = Math.pow(dm.widthPixels, 2) + Math.pow(dm.heightPixels, 2);
sb.append("对角线每英寸像素数:" + Math.sqrt(x) / size + "\n");
sb.append("密度dpi(densityDpi):" + dm.densityDpi + "dpi\n");
int y = dm.densityDpi;
if (y >= 120 && y < 160) {
sb.append("屏幕密度:ldpi\n");
} else if (y >= 160 && y < 240) {
sb.append("屏幕密度:mdpi\n");
} else if (y >= 240 && y < 320) {
sb.append("屏幕密度:hdpi\n");
} else if (y >= 320 && y < 480) {
sb.append("屏幕密度:xhdpi\n");
} else if (y >= 480 && y < 640) {
sb.append("屏幕密度:xxhdpi\n");
} else if (y >= 640) {
sb.append("屏幕密度:xxxhdpi\n");
}
sb.append("像素密度:" + dm.density + "\n");
sb.append("x方向每英寸像素数" + dm.xdpi + "dpi\n");
sb.append("y方向每英寸像素数" + dm.ydpi + "dpi\n");
sb.append("dm.scaledDensity(用于字体缩放)" + dm.scaledDensity + "\n");
sb.append("最小宽度(sw):" + getResources().getConfiguration().smallestScreenWidthDp + "dp\n\n");
sb.append("说明:密度DPI为开发用基准(160为中等DPI)用于dp和px转换,此值固定不会变动,取值范围为(120/160/240/320/480/640等)当前设备值为:" + dm.densityDpi + "\n\n");
sb.append("PPI是固定计算的,和分辨率,屏幕尺寸相关。DPI是ROM厂商设定的,不是确定公式计算的。同样的分辨率和屏幕尺寸,只能得到PPI一致。但是这不是实际显示的结果,设置dp值是按照DPI来计算的,这个时候需要看设备实际的DPI值,DPI不同结果不同。厂商可能为了显示效果而设置了不同的density(DPI).\n" +
"\n"
);
return sb.toString();
}
}
模拟器上如何验证
没有真实设备的情况下,如何验证适配的正确性,那么就要一款模拟器。我在网上找了一款叫mumu的模拟器,可以设置屏幕的分辨率和dpi,(按说应该还需要设置屏幕的物理尺寸,也就是多少英寸,但是发现没有这个参数)
- 分辨率这个大家都知道,就是宽高的像素数。
- 这里的dpi填什么呢?我感觉应该填dm.density这个值。对吗?