安卓的设备的分辨率

摘要:
不同分辨率的手机上显示的同一张图片大小不同。图片显示的大小取决于什么?答案是dpi图片的像素数是固定的。在dpi更高的手机上,实际显示高度会更小。因此,在高dpi屏幕上需要更大的图片才能获得相同的显示效果,反之亦然。

DisplayMetrics metrice= new DisplayMetrics();

Display defaultDisplay = getWindowManager().getDefaultDisplay();
defaultDisplay.getMetrics(metrice);

int densityDpi = metrice.densityDpi;
float density = metrice.density;
int heightPixels = metrice.heightPixels;
int widthPixels = metrice.widthPixels;
float xdpi = metrice.xdpi;
float ydpi = metrice.ydpi;
float scaledDensity = metrice.scaledDensity;

dip:于设备无关的像素值,比如说我在中密度上显示的值为50dip,在低密度的设备上显示的值就为50*0.75=37.5px

px:代表物理像素,比如说在中密度上显示的值为50px,注意单位是px,在其他密度设备上显示的值也是50px

densityDpi :每英寸多少个点

density:densityDpi /160;

drawable-hdpi  高密度,通常是指240也就是上述代码中的densityDpi为240

drawable-ldpi 底密度,通常是指120
drawable-mdpi 中等密度,通常是指160

drawable-xhdpi 超高密度,通常是指320

在drawable-mdpi 里放了一张像素为48*48的图片,把该图片设置成button按钮的背景,在不同密度,不同分辨率的设备下获得的数据如下:

 densityDpi=120
 density=0.75
 heightPixels=320
 widthPixels=240
 xdpi=120.0
 ydpi=120.0
 scaledDensity=0.75
 intrinsicHeight=36
 intrinsicWidth=36

 densityDpi=160
 density=1.0
 heightPixels=480
 widthPixels=320
 xdpi=160.0
 ydpi=160.0
 scaledDensity=1.0
 intrinsicHeight=48
 intrinsicWidth=48

 densityDpi=160
 density=1.0
 heightPixels=768
 widthPixels=1024
 xdpi=160.0
 ydpi=160.0
 scaledDensity=1.0
 intrinsicHeight=48
 intrinsicWidth=48

 densityDpi=240
 density=1.5
 heightPixels=800
 widthPixels=480
 xdpi=240.0
 ydpi=240.0
 scaledDensity=1.5
 intrinsicHeight=72
 intrinsicWidth=72

 densityDpi=240
 density=1.5
 heightPixels=800
 widthPixels=480
 xdpi=160.42105
 ydpi=160.0
scaledDensity=1.5
 dimension=75.0
 intrinsicHeight=72
intrinsicWidth=72

 densityDpi=320
 density=2.0
 heightPixels=640
 widthPixels=960
 xdpi=320.0
 ydpi=320.0
 scaledDensity=2.0
 intrinsicHeight=96 //代表图片实际显示的物理像素
 intrinsicWidth=96
由此可知,图片的显示和密度之间存在着莫大的关系,在同等密度下不管设别分辨率多大,图片所显示的大小是一样的,在密度不相同的情况下,图片会进行缩放:例如,在中等密度下图片显示高度为48px,低密度下显示的高度为48*0.75=36,图片会进行缩小;在高密度下显示的高度为48*1.5=72,图片会放大;

附:安卓dp和px之间的换算关系

    private float px2dip(Context ctx, int pxValue) {

        return ((float) pxValue * 160)
                / ctx.getResources().getDisplayMetrics().densityDpi;

        // 或者
        // return pxValue / ctx.getResources().getDisplayMetrics().density;
    }
private int dip2px(Context ctx, float dpValue) {

return (int) (dpValue * ctx.getResources().getDisplayMetrics().density + 0.5f);
}

 2016.4.17更新:

关于android开发里面的layout文件夹的sw后缀等相关:(drawable-en-rUS-port-160dpi-finger-qwerty-dpad-480 x320/)

android layout文件支持区分不同地区,语言,分辨率,键盘模式等情况下的布局,只需要将不同的布局放置在对应的目录下面即可(不过名字是有先后顺序的,系统会根据配置到相应的目录下自动加载对应的布局)

关于dp,px,dpi的补充:

dpi其实是人为在Android/device/softwinner/astar-common/astar-y3.mk中设定的,没有Android源码的可以通过 adb shell getprop ro.sf.lcd_density 获得。
同一图片在不同分辨率的手机上显示出来的大小是不一样的,那么图片显示出来的大小高低是跟什么有关呢,答案是dpi
图片的像素数已经固定了,那么在dpi比较高的手机上面,实际显示的高度一定就小了,所以在高dpi屏幕需要更大的图片才能得到同样的显示效果,反之亦然。
ppi和图片px的关系如下

px1/px2=dpi1/dpi2

选定一个ppi值作为基础绘制图片,用ppi的比值计算出图片缩放比例就可以适配各种屏幕

px2=px1*(dpi2/dpi1)

安卓选定的这个基础值就是160dpi

px2=px1*(dpi2/160)

安卓创造了一个新的单位dp,中文名设备独立像素。并且规定在160ppi的屏幕上,1dp=1px。

安卓的设备的分辨率第1张

 

免责声明:文章转载自《安卓的设备的分辨率》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何基于 PHP-X 快速开发一个 PHP 扩展CentOS 7安装Samba 4.6 版本步骤及错误解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安卓应用在各大应用市场上架方法整理

想要把APP上架到应用市场都要先注册开发者账号才可以。这里的方法包括注册帐号和后期上架及一些需要注意的问题。注意:首次提交应用绝对不能随便删除,否则后面再提交会显示应用APP冲突,会要求走应用认领流程,那个时候就会相当麻烦啦。 1、腾讯应用宝 腾讯开放平台地址:http://open.qq.com 注册开发者帐号地址:https://ssl.zc.qq.c...

转:intent简介

转自:here 一 Android系统用于Activity的标准Intent   1 根据联系人ID显示联系人信息 [java] view plaincopy  Intent intent = new Intent();   intent.setAction(Intent.ACTION_VIEW);   //显示联系人信息   intent....

安卓手机!用swiper做轮播效果,两张图片之间会有一个像素的空白

只要为swiper的父元素设置margin padding,或者用flex布局,让其居中,两个图片之间都会一个像素的空隙! 解决办法是,想让banner处于什么样的位置!就绝对定位就好了! 为什么会造成这样的原因没有查明白! 如下: 如果想要为swiper轮播的图片添加圆角时,一般都会直接给swpier上直接加border-radius,但是会发现不起作用...

Android开发 ExpandableListView 可折叠列表详解

前言  在需要实现一个List的item需要包含列表的时候,我们就可以选择ExpandableListView. 其实这个View的原始设计还是ListView的那套.就是增加2层的ListView而已.所以在写它的适配器与ListView的适配器挺相似的,所以会有一个通病就是没有Item的View的复用机制请一定要注意这点,在实现使用的时候需要写Item...

android的几种“通知”方式简单实现(Notification&NotificationManager)

  关于通知Notification相信大家都不陌生了,平时上QQ的时候有消息来了或者有收到了短信,手机顶部就会显示有新消息什么的,就类似这种。今天就稍微记录下几种Notification的用法。3.0以前的通知和3.0以后的通知是有些区别的。话不多说,直接上代码。   1、新建一个android项目     我新建项目的 minSdkVersion="1...

Android_动态壁纸介绍

Android的动态壁纸主要用到三个类: android.app.WallpaperManager:这个类主要用于获取系统壁纸的信息。再写动态壁纸的时候用不到。 android.service.wallpaper.WallpaperService:这个类作为服务在运行,同时负责产生一个Engine。 同时,在此类中有一个必须继承的方法为:nCreateE...