文档章节

Android屏幕计量单位详解

xiangmao
 xiangmao
发布于 2012/03/28 14:53
字数 1009
阅读 2818
收藏 6

    学习Android这么久,马上毕业要参加工作了,一直对pxdipspdp这几个单位概念似懂非懂的,这次因为工作上的需要,网上搜了点资料并整理了下,写篇日志以便以后阅读。

1.px 
pixels)(像素)
是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多。通常不推荐使用这个。
2.dip
dp(与密度无关的像素)
一个基于density的抽象单位,这个和设备硬件有关,通常在开发中设置一些view的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。在运行时, Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
3.sp
(与刻度无关的像素)
dip/dp相似,会根据用户的字体大小偏好来缩放,主要用于设置字体的大小

可能很多朋友对dippx 的区别,不是很清楚,包括我自己之前都没弄清楚,下面简单讨论一下:
首先明确一点:

HVGAdensity=160QVGAdensity=120

WVGAdensity=240WQVGAdensity=120

density值表示每英寸有多少个显示点,与分辨率是两个概念。

dippx的转换公式: px = dip * (density / 160)

Android官方定义dip等价于160dpi屏幕下的一个物理像素点, 即1dip=1px举例来说, 240 dpi 的屏幕上, 1dip 等于 1.5px

 

不同density下屏幕分辨率信息,以480dip*800dip WVGA(density=240)为例:
    1.
density=120时屏幕实际分辨率为240px*400px (两个点对应一个分辨率)状态栏和标题栏高为19px或者25dip
横屏时屏幕宽度为400px或者800dip,工作区域高度211px或者455dip
竖屏时屏幕宽度为240px或者480dip,工作区域高度381px或者775dip
    2.
density=160时屏幕实际分辨率为320px*533px 3个点对应两个分辨率)状态栏和标题栏高为25px或者25dip
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者455dip
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip
    3.
density=240时屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高为38px或者25dip
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者455dip
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip

   
Android的应用包apk中,系统会根据各个设备的具体情况引用相应的资源文件(注:不加任何标签的资源是各种分辨率情况下共用的):

当屏幕density=240时,使用hdpi标签的资源;
当屏幕density=160时,使用mdpi标签的资源;
当屏幕density=120时,使用ldpi标签的资源。

下面是在manifest中设置app在不同分辨率时,是否支持多密度的方法。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
     android:smallScreens="true"
     android:normalScreens="true"
     android:largeScreens="true"
     android:xlargeScreens="true"
     android:anyDensity="true" />

...
</manifest>

 

附:
系统对屏幕大小和密度分类对照图 :

 

1. Android SDK中包含的模拟器皮肤的屏幕尺寸和密度,以及其他典型的分辨率.

Low density (120), ldpi Medium density (160), mdpi High density (240), hdpi Extra high density (320), xhdpi
Small screen QVGA (240x320) 480x640
Normal screen WQVGA400 (240x400) 
WQVGA432 (240x432)
HVGA (320x480) WVGA800 (480x800) 
WVGA854 (480x854) 
600x1024
640x960
Large screen WVGA800** (480x800) 
WVGA854** (480x854)
WVGA800* (480x800) 
WVGA854* (480x854) 
600x1024
Extra Large screen 1024x600 WXGA (1280x800)
1024x768
1280x768
1536x1152
1920x1152 
1920x1200
2048x1536
2560x1536 
2560x1600

* 要模拟此配置, 使用WVGA800 WVGA854创建一个AVD, 指定自定义密度160.
**
要模拟此配置, 使用WVGA800 WVGA854创建一个AVD, 指定自定义密度120.

辅助工具类:

import android.content.Context;  

public class DensityUtil {    

    public static int dip2px(Context context, float dipValue) {  

        final float scale = context.getResources().getDisplayMetrics().density;  

        return (int) (dipValue * scale + 0.5f);  

    }  

    public static int px2dip(Context context, float pxValue) {  

        final float scale = context.getResources().getDisplayMetrics().density;  

        return (int) (pxValue / scale + 0.5f);  

    }  

© 著作权归作者所有

共有 人打赏支持
xiangmao
粉丝 3
博文 3
码字总数 2916
作品 0
成都
程序员
私信 提问
Android 获取屏幕尺寸与密度

android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533 结果很不靠谱,于是自己写了几行代码,亲测一下 测试...

长平狐
2013/01/06
70
0
详解Android中的四大组件之一:Activity详解

activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将处于栈顶的状态。 paused:暂停,处于失去焦点的时候,处于,可能是被如弹框一样遮盖,被通...

达叔小生
2018/08/07
0
0
AndroidManifest.xml文件详解(compatible-screen)

语法(SYNTAX): ... 包含于(CONTAINED IN): 说明(DESCRIPTION)): 这个元素用于指定那些屏幕配置跟应用程序是兼容的。在应用的清单中只允许有一个元素的实例,但是它能够包含多个元素...

长平狐
2012/10/16
154
0
AndroidManifest.xml文件详解(supports-screens)

语法(SYNTAX): 被包含于(CONTAINED IN): 说明(DESCRIPTION): 这个元素用于指定应用程序所支持的屏幕尺寸,并针对比应用程序所支持的屏幕还要大屏幕,启用屏幕兼容模式。在应用程序中...

长平狐
2012/10/16
596
0
Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho
2018/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot mockmvc单元测试

1)模拟mvc测试,和基础测试是一样的, 都需要在pom文件中引入junit的支持。   略 2)编写测试类 Application1TestMVC   在类头上除啦加入之前的@RunWith(SpringRunner.class)、@RunWit...

水木星辰
20分钟前
3
0
Spring中用了哪些设计模式?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内...

HOT_POT
25分钟前
2
0
那些70后的程序员都消失了吗?

在娱乐圈,哦不,是在程序员这个吃青春饭的行业,有一个人人闻之色变的话题,曰:「年老色衰」。只要是个程序员,心里都会惴惴不安的想:「我老了以后卖不动色相,哦不,写不动代码了,我还能...

老道士
27分钟前
2
0
Spark和MapReduce的区别

首先大数据涉及两个方面:分布式存储系统(GFS)和分布式计算框架(MapReduce)。 1.MapReduce包含5 个步骤:Map、Sort、Combine、Shuffle 以及Reduce。这5 个步骤中最重要的就是Map 和Reduc...

仟昭
58分钟前
3
0
eclipse配置集成gradle

Gradle是一个好用的构建工具 使用它的原因是 1、配置相关依赖代码量少,不会像maven一样xml过多 2、打包编译测试发布都有,而且使用起来方便 3、利用自定义的任务可以完成自己想要的功能 (一...

五年级小学生
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部