比如,对于HVGA屏,ro.sf.lcd_density=160;对于WVGA屏,ro.sf.lcd_density=240。来到相关的源码部分,Density获取的部分在DisplayMetrics.java(frameworks\base\core\java\android\util)这个类里面,系统定义了3个等级的density,分别是low-120,medium-160,high-240。
/**
* Standard quantized DPI for low-density screens.
*/
public static final int DENSITY_LOW = 120;
/**
* Standard quantized DPI for medium-density screens.
*/
public static final int DENSITY_MEDIUM = 160;
/**
* Standard quantized DPI for high-density screens.
*/
public static final int DENSITY_HIGH = 240;
同样在这个类最下面,找到系统获取Density的方法:
private static int getDeviceDensity() {
// qemu.sf.lcd_density can be used to override ro.sf.lcd_density
// when running in the emulator, allowing for dynamic configurations.
// The reason for this is that ro.sf.lcd_density is write-once and is
// set by the init process when it parses build.prop before anything else.
return SystemProperties.getInt("qemu.sf.lcd_density",
SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
}
从这个方法中可以看到,系统会去读系统属性。先去读ro.sf.lcd_density,若存在,那么设置这个属性记录的density的值。否则,则取默认值也就是160。用adb shell getprop ro.sf.lcd_density直接在CMD中读设备密度值。
所以简单的测试density对画面影响的方法就是改build.prop中的ro.sf.lcd_density,重启发现屏幕的分辨率发生了变化;如果要在安卓CODE中添加,则在DisplayHardware.cpp 中查找ro.sf.lcd_density,直接将property值写死。或者修改\alps\mediatek\config\projectname\system.prop中ro.sf.lcd_density的值,该文件中还可以设置ro.sf.hwrotation属性。
因为该值有人为改变的可能性,可以用以下办法获取系统真实的DPI。样例基础是:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
scale.setText("scale is"+dm.densityDpi);
===========在应用源码中设置横竖屏和取消横竖屏=================
设置安卓应用中的横屏或竖屏,使不能自动旋转,在相应AndroidManifest.xml中对Activity属性进行设置。如: <activity android:name="ScreenLoading" android:screenOrientation="portrait">限制竖屏, 或者在配置中加入android:screenOrientation=”landscape”限制横屏。
一般的应用可以满足横竖屏两种布局的需要,因为手机屏幕方向变化的时候系统会自动调用相应的布局文件,但如果一种布局文件无法满足两种屏幕显示的时候,可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件就行了。
===========layout文件10dip的意义===============================
比如我们在应用的layout文件中有类似android:layout_margin="10dip"的语句,这个dip是什么意思呢?
在android上开发的程序将会在不同分辨率的手机上运行。为了让程序外观不至于相差太大,所以引入了dip的概念。换算公式为 pixs = dips * (density/160). density 就是屏的分辨率密度,比如定义一个矩形10 x 10dip. 在分辨率为160dpi 的屏上,那就正好是10 x 10像素。而在240 dpi 的屏,则是15 x 15 像素。 这里可以做个分析:同一个屏,把density从160改成240,结果就是要占15像素,那么UI就放大了,变成拥挤的效果。
参考原文:Android中的lcd_density设置_muojie的博客-优快云博客_android lcd_density