一,ro.sf.lcd_density属性指定了这个机型使用的dpi是多少,dpi全称是dots per inch,对角线每英寸的像素点的个数。
二、dp也叫dip,是device independent pixels。设备不依赖像素的一个单位。在不同的像素密度的设备上会自动适配,
1、比如:
在320x480分辨率,像素密度为160,1dp=1px
在480x800分辨率,像素密度为240,1dp=1.5px
计算公式:px = dp * (dpi/160)
2、其中的 160 是基准值不会变的, dpi就是我们android设备中的 /system/build.prop 文件,其中有一行是这样:ro.sf.lcd_density=160
三、这里我们写个小app做个实验测试一下。
1、布局文件中srcmainreslayoutactivity_main.xml定义一个button
android:layout_width="120dp"
android:layout_height="60dp"
2、srcmainjavacomgiadadensityMainActivity.java
package com.giada.density;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.button);
}
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button:
Toast.makeText(this, + mButton.getWidth() + "/" + mButton.getHeight() , Toast.LENGTH_SHORT).show();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
Log.d("giada_density", mButton.getWidth() + "/" + mButton.getHeight()+" dm.density="+dm.density+" dm.densityDpi="+dm.densityDpi);
break;
default:
break;
}
}
}
3、运行的结果如下
4、基准比例1.1625=186/160 ; 140=120*186/160 ;70=60*186/160 ;
参考文章
[Android] Android开发中dip,dpi,density,px等详解 - 简书



