Android的单位以及屏幕分辨率详解

一、常用的单位:相对单位主要有:px、sp、dp
绝对单位主要有:pt、in、mm

二、单位应用总结:一般用相对单位,而不是绝对单位
1、字体的大小一般使用SP,用此单位的字体能够根据用户设置字体的大小而自动缩放

2、空间等相对距离一般使用dp(dip),随着密度变化,对应的像素数量也变化,但并没有直接的相对比例的变化。

3、px与实际像素有关,及与密度有关!dp和sp和实际像素没有关系,对于一定分辨率但不同密度的屏幕,px单位的应用可能会导致长度的相对比例的变化。

三、密度与分辨率:
密度值表示每英寸有多少个显示点,与分辨率是两个概念。

其屏幕密度标准是:HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120

具体的应用运算关系:假设分辨率是 x*y, 密度为 d, 屏幕实际大小为 a*b那么关系为 x*y = d * a * b (约等于)

不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)

四、对比总结:
1、在相同密度(即同一实体屏幕)不同分辨率的情况下,与实体密度无关的相对单位sp和dp显示正常

2、在相同分辨率不同密度的情况下,因为一般情况下,都用的标准密度,所以分析的意义不是很大

其他资料:
px:是屏幕的像素点
in:英寸
mm:毫米
pt:磅,1/72 英寸
dp:一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px
dip:等同于dp
sp:同dp相似,但还会根据用户的字体大小偏好来缩放。
建议使用sp作为文本的单位,其它用dip
针对dip和px 的关系,做以下概述:
HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少个显示点,与分辨率是两个概念。
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例

density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)
状态栏和标题栏高各19px或者25dip
横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip
竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip

density=160时 屏幕实际分辨率为320px*533px (3个点对应两个分辨率)
状态栏和标题栏高个25px或者25dip
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip

density=240时 屏幕实际分辨率为480px*800px (一个点对于一个分辨率)
状态栏和标题栏高个38px或者25dip
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip

apk的资源包中,当屏幕density=240时使用hdpi 标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
不加任何标签的资源是各种分辨率情况下共用的。
布局时尽量使用单位dip,少使用px

下面是几种不同单位的相互转换.


代码如下:

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.getResource().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
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.getResource().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}

下面说下如何获取分辨率:

在一个Activity的onCreate方法中,写入如下代码:


代码如下:

DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels;  // 屏幕宽度(像素)
int height = metric.heightPixels;  // 屏幕高度(像素)
float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

这还是挺简单的, 可是你有没有在800*480的机器上试过, 是不是得到的宽度是533 ? 因为android刚开始时默认的density是1.0 , 此时你可以再manifest.xml中加入

1.uses-sdk节点, <uses-sdk android:minSdkVersion="4" /> , 表示不sdk1.6以下的机器不能安装你的apk了.

2.supports-screens 节点.


代码如下:

<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />

(0)

相关推荐

  • Android 屏幕分辨率的整理

    Android 屏幕分辨率的整理 看资料的时候经常看到各种VGA,全都混了,无奈,找了些资料总结了下,分享给大家: 这些术语都是指屏幕的分辨率. VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA:Half-size VGA,即:VGA的一半,分辨率为480×320,像三星盖世Ace S5830就是使用这分辨率: QVGA:Quarter VGA,即:VGA的四分之一,分辨率为320×240,一般用于小屏手机 像三星盖世Mini S5570

  • android开发中获取手机分辨率大小的方法

    所以,记录下核心代码: 复制代码 代码如下: DisplayMetrics metrics=new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics); 获取到本机的分辨率: 复制代码 代码如下: int widthPixels=metrics.widthPixels;int heightPixels=metrics.heightPixels; 当然,可以直接用TextView显示出来,还可以直接

  • Android的分辨率和屏幕适配详解

    一.为什么Android要进行分辨率与屏幕适配 最大的原因是碎片化,因为Android的开源措施和各个厂商的自己细微修改,结果就变成了这个样 需要适配的屏幕尺寸就有这么多: 这怎么可能嘛T_T. 所以我们就只照顾大部分人,根据友盟的统计数据如下: 所以只需要适配: 800x480.854x480.960x540.1184x720.1280x720.1920x1080这六种分辨率. 二.基本知识 屏幕尺寸 英寸,1英寸=2.54厘米.比如常见的屏幕尺寸有2.4.2.8.3.5.3.7.4.2.5.

  • Android加载大分辨率图片到手机内存中的实例方法

    还原堆内存溢出的错误首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView,然后按照常规的方式,使用BitmapFactory加载一张照片并使用一个ImageView展示. 代码如下: 复制代码 代码如下: btn_loadimage.setOnClickListener(new View.OnClickListener() { @Override   

  • android 分辨率适配的方法

    以前在公司做项目的时候,遇到了分辨率的适配问题,说起来当时挺纠结的,因为没有外网,所以这个问题,都是黑暗中摸索的,尝试了许多方法,最后和徒弟们一起搞出了这个方法,具体行不行,先和大家分享下,这个方法不能说万能的,但是最起码它解决了分辨率跟密集度的关系,但是也引来一个问题,就是布局会因为图片资源小而失真,所以这也需要美工的同志多多配合的,废话不说,贴代码: 第一步,先创建一个view信息的javabean类: 复制代码 代码如下: package com.zte.layout.adapter; i

  • android根据分辨率自动调整字体大小的实例代码

    手机设备太多,分辨率也不一样,看到网上大部分的适应字体的方法是定义values320×480或value-hdpi方式去处理.采用第一种的就惨了,很多设备的分辨率是不一样的,难道要每种都定义吗?采用第二种的在平板电脑里没有效果. 最后还是代码的方式方便快捷... [java] 复制代码 代码如下: //遍历设置字体  public static void changeViewSize(ViewGroup viewGroup,int screenWidth,int screenHeight) {/

  • Android基础之使用Fragment适应不同屏幕和分辨率(分享)

    最近事情很忙,一个新项目赶着出来,但是很多功能都要重新做,一直在编写代码.Debug.今天因为一个新程序要使用Fragment来做,虽然以前也使用过Fragment,不过没有仔细研究,今天顺道写篇文章记录一下Fragment的使用.这文章主要参考了Android官网的介绍. Fragment是Android3.0后增加的新控件,有点类似于Activity组件,也是用来承载各种View元素.Google增加这个玩意的目的是为了平板电脑里面可以复用部分显示的View,只要写好一个View,可以同时在

  • Android的单位以及屏幕分辨率详解

    一.常用的单位:相对单位主要有:px.sp.dp绝对单位主要有:pt.in.mm 二.单位应用总结:一般用相对单位,而不是绝对单位1.字体的大小一般使用SP,用此单位的字体能够根据用户设置字体的大小而自动缩放 2.空间等相对距离一般使用dp(dip),随着密度变化,对应的像素数量也变化,但并没有直接的相对比例的变化. 3.px与实际像素有关,及与密度有关!dp和sp和实际像素没有关系,对于一定分辨率但不同密度的屏幕,px单位的应用可能会导致长度的相对比例的变化. 三.密度与分辨率:密度值表示每英

  • Flutter应用框架搭建之屏幕适配详解

    目录 原理 flutter_screenutil 添加依赖 初始化 使用 效果 其他 Api 因移动设备的多样性,特别是 Android 的碎片化严重,存在各种各样的分辨率,而 Flutter 跨平台开发又需同时支持 Android 和 iOS ,为尽可能的还原设计图效果提升用户体验,屏幕适配就势在必行了. Flutter 暂时没有官方的屏幕适配方案,在 Flutter 项目开发中目前大部分的适配方案都是通过比例来进行适配,是一个通用的适配方法,该适配方法也在前端.Android.iOS.小程序

  • Android Studio开发环境搭建教程详解

    对于移动端这块,笔者之前一直都是进行iOS开发的,也从来没用过Java.但是因为进入了Google Android全国大学生移动互联网创新挑战赛(进入官网)的总决赛(笔者"西部计算机教育提升计划"的项目被直接推荐进入决赛),这个比赛要求一定要提交apk程序,所以我不得不赶紧学习一下Android开发了. 下面就对自己学习的过程做一个记录. 一.安装Android Studio 笔者用的计算机配置如下: Mac下安装Android Studio应该更简单一些,只需要下载一个Android

  • Android View的事件体系教程详解

    目录 一.什么是View?什么是ViewGroup? 二.View的位置 三.View的触摸事件 1.MotionEvent 2.TouchSlop 3.VelocityTracker 5.Scroller 四.View的滑动 1)使用Scroll 2)通过动画 3)使用延时策略 五.View的事件分发机制 六.View的滑动冲突问题 View的滑动冲突常见可以简单分为三种: 滑动冲突的处理规则 滑动冲突的解决方法 一.什么是View?什么是ViewGroup? View是Android中所有控

  • Android Compose衰减动画Animatable使用详解

    目录 前言 animateDecay splineBasedDecay rememberSplineBasedDecay exponentialDecay 实战 最后 前言 之前介绍了 Animatable 动画以及其 animateTo和 snapTo两个开启动画 api 的使用,实际上 Animatable 除了这两个 api 以外还有一个 animateDecay即本篇要介绍的衰减动画. 什么是衰减动画呢?就是动画速度由快到慢最后停止,最常见的应用场景就是惯性动画,比如滑动列表时手指松开后

  • Android 广播大全 Intent Action 事件详解

    具体内容如下所示: Intent.ACTION_AIRPLANE_MODE_CHANGED; //关闭或打开飞行模式时的广播 Intent.ACTION_BATTERY_CHANGED; //充电状态,或者电池的电量发生变化 //电池的充电状态.电荷级别改变,不能通过组建声明接收这个广播,只有通过Context.registerReceiver()注册 Intent.ACTION_BATTERY_LOW; //表示电池电量低 Intent.ACTION_BATTERY_OKAY; //表示电池电

  • Android MTU 值修改的实例详解

    Android MTU 值修改的实例详解 通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡.串口等). 1.首先使用 adb 命令进入系统,然后 ifconfig 查看可用网络 C:\>adb shell $ su su # ifconfig ifconfig lo Link encap:Local Loopback inet addr:12

  • Android Doze模式启用和恢复详解

    从Android 6.0(API level 23)开始,Android提出了两个延长电池使用时间的省电特性给用户.用户管理可以在没有充电的情况下管理app的行为.当用户一段时间没有使用手机的时候,Doze模式通过延缓app后台的CPU和网络活动减少电量的消耗.App Stanbdy延缓用户最近没有使用app的后台网络活动. 作为移动开发人员,我们开发的App需要有推送功能,不希望在锁屏或者不充电的时候被Doze模式干掉.那么如何检测手机进入Doze模式之后App的状态呢? 一.模拟未充电状态

  • 基于Android MarginLeft与MarginStart的区别(详解)

    我们在写layout布局的时候,我们会发现有这样几个比较相似的属性: MarginStart   MarginLeft MarginEnd    MarginRight 这些属性的区别是什么?  根据api注释,我们得知MarginStart指的是控件距离开头View部分的间距大小,MarginLeft则指的是控件距离左边View部分的间距大小,MarginEnd和MarginRight同理. 一般情况下,View开始部分就是左边,但是有的语言目前为止还是按照从右往左的顺序来书写的,例如阿拉伯语

  • Android Canvas方法总结最全面详解API(小结)

    本篇文章主要介绍了Android Canvas方法总结最全面详解API,分享给大家,具体如下: 常用方法 drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层. clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图区域,这个 画图区域就是canvas对象的当前画图区域了.比如:clipRect(new Rect()), 那么该矩形区域就是canvas的当前画图区域 getXxx方法族:获得与Canvas相关一些值,比如宽高

随机推荐