Android常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )尺寸单位转换和屏幕适配相关

news/2024/11/8 5:37:33/

1 Android手机目前常见的分辨率

1.1 手机常见分辨率:

4:3
VGA     640*480 (Video Graphics Array)
QVGA  320*240 (Quarter VGA)
HVGA  480*320 (Half-size VGA)
SVGA  800*600 (Super VGA)

5:3
WVGA  800*480 (Wide VGA)

16:9
FWVGA 854*480 (Full Wide VGA)
HD        1920*1080 High Definition
QHD     960*540
720p    1280*720  标清
1080p  1920*1080 高清

手机:
iphone 4/4s    960*640 (3:2)
iphone5         1136*640
小米1             854*480(FWVGA)
小米2             1280*720

 

1.2 分辨率对应DPI
"HVGA    mdpi"

"WVGA   hdpi "
"FWVGA hdpi "
"QHD      hdpi "
"720P     xhdpi"
"1080P   xxhdpi "


一:Android 屏幕适配

众所周知,Android机型尺寸各种各样,于是屏幕适配就成了Android开发中很重要的一环。Android屏幕适配可能一些开发者都会遇到这样的问题,今天就来分享下屏幕适配,其实Android屏幕适配也可以很简单。

基本概念

Android屏幕适配必须要理解的一些概念:

  • px

是英文单词pixel的缩写,意为像素,屏幕上的点。我们通常所说的分辨率如480X800就是指的像素。

在设计领域中,像素是用来计算数码影像的最小单位。计算机中显示的图像并非连续的线条组成,而是由许多肉眼看不见的小点组成。如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小点所组成,这些小点就是构成影像的最小单位“像素”。由于是最小的独立显示单位,px均为整数,不会出现0.5px的情况。如:

看这个色彩鲜艳的LED灯(原图大小)

你能想象这才是他的本来面目吗?(放大之后)

  • in

表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如我们经常说的手机屏幕大小有,5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是4英寸,表示手机的屏幕(可视区域)对角线长度是4 X 2.54 = 10.16厘米。

  • dpi

dpi是Dots Per Inch的缩写, 每英寸点数,即每英寸包含像素个数。比如320X480分辨率的手机,宽2英寸,高3英寸, 每英寸包含的像素点的数量为320/2=160dpi(横向)或480/3=160dpi(纵向),160就是这部手机的dpi,横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。

  • density

屏幕密度,density和dpi的关系为 density = dpi/160

  • dp

也即dip,设备独立像素,device independent pixels的缩写,Android特有的单位,在屏幕密度dpi = 160屏幕上,1dp = 1px。

  • sp

和dp很类似,一般用来设置字体大小,和dp的区别是它可以根据用户的字体大小偏好来缩放。

Android Drawable

我们新建一个Android项目后应该可以看到很多drawable文件夹,分别对应不同的dpi

  • drawable-ldpi (dpi=120, density=0.75)

  • drawable-mdpi (dpi=160, density=1)

  • drawable-hdpi (dpi=240, density=1.5)

  • drawable-xhdpi (dpi=320, density=2)

  • drawable-xxhdpi (dpi=480, density=3)

市面上的一些Android教程大多都是教的是为每种dpi都出一套图片资源,这个固然是一种解决办法,但同时也是一种非常笨的方法,为美工或者设计增加了不少的工作量不说,同时也会让你的apk包变的很大。那么有没有什么好的方法既能保证屏幕适配,又可以最小占用设计资源,同时最好又只使用一套dpi的图片资源呢?下面就来讲解下项目中总结出来的这个方法。

首先必须清楚一个自动渲染的概念,Android SDK会自动屏幕尺寸选择对应的资源文件进行渲染,如SDK检测到你手机dpi是160的话会优先到drawable-mdpi文件夹下找对应的图片资源,注意只是优先,假设你手机dpi是160,但是你只在xhpdi文件夹下有对应的图片资源文件,程序一样可以正常运行。所以理论上来说只需要提供一种规格的图片资源就ok了,如果只提供ldpi规格的图片,对于大分辨率的手机如果把图片放大就会不清晰,所以需要提供一套你需要支持的最大dpi的图片,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。

xhdpi成为首选

上面说了只需要提供一套大的dpi的图片就ok了,现在市面手机分辨率最大可达到1080X1920的分辨率,如Nexus5,dpi属于xxhdpi,但是毕竟还没普及,目前市面上最普遍的高端机的分辨率还多集中在720X1080范围,也就是多集中在xhdpi,所以目前来看xhpdi规则的图片成为了首选。当然随着技术规格的提高以后发展,以后可能市场上xxdpi的手机会越来越普遍,但这是后话。

设计资源紧张怎么办?

在现在的App开发中,基本都会有iOS和Android版本,有些公司为了保持App不同版本的体验交互一致,还有些公司的设计资源可能比较紧张,这些情况下iOS和Android版本基本是一个设计师主导,而大多数情况下设计师可能更会以iPhone手机为基础进行设计,包括后期的切图之类的。这个时候身为Android开发人员你是否还要求设计师单独为Android端切一套图片资源呢?这会让你们的设计师崩溃的,下面就来告诉一个项目中总结的更棒的方法。

相信设计师们一般都会用最新的iPhone5(5s和5的尺寸以及分辨率都一样)来做原型设计,而iPhone5的屏幕分辨率为640X1164, 屏幕尺寸为4英寸,根据勾股定理(a^2 + b^2 = c^2)640^2+1164^2=1764496, 然后再对其开根号可求出屏幕对角线的分辨率为:1328,除以4可得出iphone5的dpi:1328/4≈332 可以看出iPhone5的屏幕的dpi约等于320, 刚好属于xhdpi,所以你可以很自豪的像你们的设计师说不用专门为Android端切图,直接把iPhone的那一套切好的图片资源放入drawable-xhdpi文件夹里就ok了。

wrap_content VS dp

wrap_content和dp都是在Android开发中应该经常用到的,然后它们冥冥中是有关系的。

假设你看了这篇文章后都是统一有xhdpi的资源,那么你用wrap_content完全没有问题,Android会自动为其他规格的dpi屏幕适配,比如你在xhdpi放了一张120X120px大小的图片,那么在在hdpi屏幕上显示的就只有120/1.5=80px大小,但是如果你不小心同样把这张图片也放入了mdpi了,这个时候用wrap_content显示就会有问题,具体看下面的例子:

例如假设你只在drawable_xhdpi文件夹下放了test图片,xhdpi的设备会去xhdpi文件夹下找到test图片并直接显示,而mdpi的设备优先会去mdpi文件夹里查找test图片,但是没找到,最后在xhdpi文件夹下找到,然后会自动根据density计算并缩放显示出来,实际显示出来的大小是120/2=60px, 所以整体的显示比例才会看起来比较正常

  • mdpi

  • xhdpi

但是如果你在mdpi文件夹里也放入了同样的图片,那么mdpi的设备会直接去mdpi文件夹里寻找到test图片,并直接显示,而这时候显示不会缩放,实际显示大小就是120X120,在mdpi的屏幕上看起来就会比较大,如图:

通过上面整个过程,大家应该理解了Android加载资源的整个过程, wrap_content同样可以用dp来代替,就拿上面这个例子,在xhdpi文件夹内放入了一张120X120像素的test图片,宽高直接除density就得出dp的数值,即这种情况下以下代码是等同的.

<ImageViewandroid:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/test" /> 
<ImageViewandroid:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/test" /> 

总结

相信通过以上的讲解,对Android UI中的一些基本概念有个很好的理解,实际开发工作中也有一些高效的方法可以参考,应该可以应对大部分的屏幕适配工作。但是项目中仍然有一些比较特殊的适配需求满足不了,以后会针对一些特殊的需求进行示例讲解。

 

二:

Android 尺寸单位转换和屏幕适配相关

 

各种尺寸单位的意义

  dp: Density-independent Pixels
一个抽象的单元,基于屏幕的物理密度。
dp和dip的意义相同,所以不用区别对待)。
这些单元是相对于 160dpi(dots per inch)的屏幕说的, 在160dpi的屏幕上,1dp粗略地等于1px。
当运行在更高密度的屏幕上的时候,要绘制1dp的像素数量会放大一个比例,这个比例就是和屏幕密度(dpi)相关。
类似的,在一个低密度的屏幕上,像素数目会缩小一个比例。
dp到px的这个比例将会随着屏幕的密度变化,而不是直接的比例关系。
用dp单位,而不是px,是一种简单的屏幕密度适配解决方式。
换句话说,它提供了一种方式,可以在多种设备上维持真实尺寸一致性。
sp:Scale-independent Pixels
这个有点像dp单位,但是它也根据用户的字体设置(font preference)缩放尺寸。
建议 用这种尺寸单位来标注字体尺寸,这样它们将会因为屏幕密度和用户设定而调整。
pt
Points 1/72 inch(英寸),根据屏幕的物理尺寸。
pxPixels
相应于真实的像素。
这种单位不被建议,因为真实的表达会根据设备的不同相差很远。
每个设备上每英寸的像素数不同(密度不同),并且屏幕上总的像素数也不同(整体大小不同)。
mm:Millimeters

资源类型

 

图片文件通常会分多个文件夹保存,这多个文件夹的后缀名其实表示的是不同的屏幕密度。
以m为基准,屏幕密度( dots per inch)基准和需要图像资源的大小比例如下
l: low density (120dpi) 0.75
m: medium density (160dpi) 1.0 baseline
h: high density (240dpi) 1.5
x: extra-high density (320dpi) 2.0
xx: extra-extra-high density (480dpi)

尺寸单位转换 工具类

  可以写工具类对尺寸单位进行转换,比如:

复制代码
复制代码
package com.mengdd.dimen;import android.content.Context;public class DimenUtils {public static int sp2px(Context context, float spValue) {float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}public static int px2sp(Context context, float pxValue) {float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (pxValue / fontScale + 0.5f);}public static int dip2px(Context context, int 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);}
}
复制代码
复制代码


  Android中的DisplayMetrics这个类描述了关于显示的各种信息,可以利用它查看设备的状态,上述关于屏幕密度的标准的常量也是从这个类中看到的。

   DisplayMetrics的toString()方法如下:

复制代码
    @Overridepublic String toString() {return "DisplayMetrics{density=" + density + ", width=" + widthPixels +", height=" + heightPixels + ", scaledDensity=" + scaledDensity +", xdpi=" + xdpi + ", ydpi=" + ydpi + "}";}
复制代码

 

  其中各个变量解释如下:

复制代码
复制代码
    /*** The absolute width of the display in pixels.*/public int widthPixels;/*** The absolute height of the display in pixels.*/public int heightPixels;/*** The logical density of the display.  This is a scaling factor for the* Density Independent Pixel unit, where one DIP is one pixel on an* approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), * providing the baseline of the system's display. Thus on a 160dpi screen * this density value will be 1; on a 120 dpi screen it would be .75; etc.*  * <p>This value does not exactly follow the real screen size (as given by * {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of* the overall UI in steps based on gross changes in the display dpi.  For * example, a 240x320 screen will have a density of 1 even if its width is * 1.8", 1.3", etc. However, if the screen resolution is increased to * 320x480 but the screen size remained 1.5"x2" then the density would be * increased (probably to 1.5).** @see #DENSITY_DEFAULT*/public float density;/*** The screen density expressed as dots-per-inch.  May be either* {@link #DENSITY_LOW}, {@link #DENSITY_MEDIUM}, or {@link #DENSITY_HIGH}.*/public int densityDpi;/*** A scaling factor for fonts displayed on the display.  This is the same* as {@link #density}, except that it may be adjusted in smaller* increments at runtime based on a user preference for the font size.*/public float scaledDensity;/*** The exact physical pixels per inch of the screen in the X dimension.*/public float xdpi;/*** The exact physical pixels per inch of the screen in the Y dimension.*/public float ydpi;
复制代码
复制代码

 

实际设备参数 

  小米2SDisplayMetrics中的toString()方法输出如下:

DisplayMetrics{density=2.0, width=720, height=1280, scaledDensity=2.0, xdpi=345.0566, ydpi=342.23157}



3 参考资料

http://blog.csdn.net/guozh/article/details/8954994

 http://my.eoe.cn/cainiao1/archive/2348.html(皇马船长)

http://www.cnblogs.com/ycxyyzw/p/3889939.html



http://www.ppmy.cn/news/185371.html

相关文章

Vue 中echarts的数据参数使用、X轴Y轴

Echarts 柱状图配置详解 - 龙恩0707 - 博客园 ECharts图表设置x轴和y轴显示数值_King汀的博客-CSDN博客_echarts设置y轴数值 echarts柱状图 渐变色_kylvia的专栏-CSDN博客_echarts 柱子渐变色 eCharts——柱状图中的柱体颜色渐变 Echarts设置背景的网格线为虚线_祈澈菇凉-CS…

X-Cache 和 X-Cache-Lookup

在Http协议的Response Header中&#xff0c;可根据以下两项来判断是否被缓存命中。 X-Cache:HIT from www.cdn.com X-Via:代理服务器地址信息 x-cache-lookup:指专门查看代理服务器中是否有某个网页缓存:有就返回HIT,没有返回MISS。 x-cache:项指浏览器从何处、是在哪个代理缓存…

新发的日常小实验——VS 2019~2010小助手(Visual Assist X / VA_X)安装与使用(实测可用)

文章目录 一、前言二、Visual Assist X下载与安装三、Visual Assist X的使用四、愉快地使用Visual Assist X五、补充&#xff1a;vs各个版本的编译器号对应的vs版本号六、补充&#xff1a;Visual Assist X实用快捷键 一、前言 Visual Assist X是一款非常好用的Microsoft Visua…

FFMPEG视频编码 NVIDIA 和 INTEL 硬件加速 x265 8bit 和 10bit

现在的显卡和两年前已经不一样。 从 NVIDIA 显卡的能力表来看&#xff0c;新卡 1070 支持 x265 10bit 编码。 正好最近有需求&#xff0c;来研究一下。 CPU也不一样了&#xff0c;现在是 i7-8750H&#xff0c; 顺便研究 intel 显卡硬件编码 x265。 FFMPEG 也不一样了&#xff0…

SpringBoot整合Redis使用x-auth-tonken实现Session共享

文章目录 SpringBoot整合Redis使用x-auth-tonken实现Session共享1、配置pom.xml文件2、配置application.properties文件3、配置启动类4、验证4.1、编写一个Controller类4.2、使用postman发送请求4.2.1、设置会话信息4.2.2、获取会话信息 4.3、通过Redis Desktop Manager查看数据…

echart添加文本_echart在X轴下方添加字

使用Echart做统计图表,这个方便快捷还高大上 按照文档,很快就做出了一个柱图表 在X轴下方,要显示出对应日期是星期几(上图最下方,用红框的部分),这个问题查了很长时间的API,终于找到了一个疑似能解决这个问题的配置项. 这个配置项markLine, 位置在: https://www.echartsjs.com/…

Springboot2.x整合Ehcache3.x(代码方式)

首发传送门&#xff1a;Springboot2.x整合Ehcache3.x Ehcache简介 EhCache 是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff0c;是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。…

cocos2d-x 编译不同版本VS的项目 检测到_MSC_VER的不匹配项:值1800不匹配值1900(xxxx.obj)

_MSC_VER 是VS编译器的版本 MS VC 14.0 _MSC_VER 1900 vs2015 平台是v140 MS VC 12.0 _MSC_VER 1800 vs2013的编译器 平台是v120 MS VC 11.0 _MSC_VER 1700 vs2012的编译器 平台是v110 MS VC 10.0 _MSC_VER 1600 Visual C 2010 MS VC 9.0 _MSC_VER 1500 Visual C 200…