Android中的lcd_density && 在应用源码中设置横竖屏和取消横竖屏 && layout文件10dip的意义

        比如,对于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

参考原文:Android不同分辨率屏幕下自适应资源文件_PonderForever的博客-优快云博客

参考原文:Android 4.0 虚拟按键、手机模式、平板模式_xubin341719的博客-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值