进行Android开发的时候没有测试机适配怎么办,如何进行屏幕适配

进行Android开发的时候没有测试机适配怎么办,如何进行屏幕适配,第1张

Android项目的res目录下一般加上我们自己创建的,会有6个目录,分别是:drawble drawble-ldpi drawble-mdpi drawble-hdpi drawble-xhdpi drawble-xxhdpi, 这里就不包括更为特殊的drawble目录了,(比如drawlbe-land-hdpi, 表示水平方向的高分辨率的,这些都目录不管多么长,它们都是按一丁点规律匹配的, 我们的目的是, 从个别中发现规律,从而应用到整体)。

当一个apk运行起来时,Android系统会根据其所运行的手机的屏幕密度去相对应的文件夹里找指定名称的。 注意, 先去哪个目录里找,完全是根据这个手机的屏幕密度决定的。

其中注意两点:

1, 中等分辨率,即mdpi的屏幕密度是160,他是标准的参考密度。所以计算比例的时候它的比例值是1 其他屏幕密度的参考比例都是以这个为依据。

2, 默认的drawble目录(一般是自己建的),和mdpi是一样的。将放到这个目录和放到drawble-mdpi目录是一样的效果。不过一般习惯性的放一些自定义selector或者点9的在这里。

现在我们来看, HTC one V手机的屏幕密度是252ppi, 那距离哪一个最靠近呢, 就是hdpi了。 所以当apk运行在这个手机上时,首先会去这个目录找。

下面是用常见的一些类型的手机总结的一个表格:

注意一点: 上面说的对应关系,都是首选目录, 那如果首选目录里面找不到呢?

Android选择策略

上面说到, 如果屏幕所对应的文件夹没有要找的,怎么办。这是很常见的,我们开发项目时一般不会去为每一个级别的屏幕去切一套。那样做只会让apk很大。所以一般性的我们只切一两个典型密度屏幕的。但是apk是有可能会运行在从ldpi到xxhdpi的各种级别的手机上。这个时候就需要根据一定的策略去寻找了。

Android系统寻找的步骤是这样的:

1, 去屏幕密度对应的目录去找。如果找到就拿来用。

2, 如果没找到,就去比这个密度高一级的目录里面去找,如果找到就拿来用。

3, 如果没找到就继续往上找。以此类推。

4, 如果到了xxhdpi目录还没有找到的话,就会去比自身屏幕密度低一级的目录去找,如果低一级的目录>=hdpi,找到了就拿来用。

5, 如果没找到, 就去mdpi目录去找, 如果找到了,就拿来用。

6, 如果没找到,就去默认的drawble目录里去找, 如果找到了就拿来用。

7 ,如果没找到,再去最低的ldpi目录里去找。如果找到了,就拿来用。

8, 如果没找到, 那就是没找到了, 无法显示。(不过一般不会出现这种现象,因为如果每个目录都没有这个的话,你是编译不过的)

这里有两点需要注意:

① 首先会去比自己密度高的目录里去找,这是因为因为系统相信,你在密度更高的目录里会放置分辨率更大的,这样的话这个会被缩小,但同时显示效果不会有损失,但是如果优先去低一级别的目录去找的话, 找到的就会被放大,这样的话这个就会被拉扯模糊了。

eg 同一张,你在mdpi和xxhdpi目录各放了一份, 这个应用你现在运行在hdpi的手机上, 那应用会选择哪张呢。答案是xxhdpi目录里的。即便hdpi离mdpi更近一点!

②,如果在mdpi里找不到是不会直接去ldpi里找的, 而是先去默认的drawble目录里找,这是drawble目录和drawble-mdpi是一个级别的。

下面用一张流程图来总结:

(注: 以上流程图是我通过做实验总结出来的,如有谬误还望指出。)

Android系统对的缩放规则

上文中提到如果在手机对应的目录没有找到,就会按照一定的策略去其他目录找,那找到了以后就原图显示么? 非也。

对于放在不同目录下的, 系统会按照一定比例对原始的进行放大或者缩小, 具体的放大缩小比例可参考下表, 所在目录和对应的屏幕密度是相同时缩放比例为1,也就是原图显示,而横向的比例表示分别放在该密度手机上运行时被缩放的比例。

对原始的缩放倍数。

上表几点值得注意的地方:

①, drawable目录和drawable-mdpi目录和dp到px的转换关系是一样的。

②,当你放一个120px180px的到drawable-hdpi目录,如果此应用运行在一个xhdpi的手机上,则这个会被拉扯到160px240px。

③, 最后一行dp->px, 说明了在代码或者布局文件中声明一个dp值, 这个值在不同屏幕密度的手机中会被乘以不同的倍数。 比如你在布局文件中写了一个宽和高分别为120dp和180dp的LinearLayout, 那么当这个应用运行在xhdpi的手机上时(比如上面那个常见手机表中的中兴U985手机),它的实际像素就会被转换为240px360px。 如果运行在ldpi的手机上,就变成了90px135px。 但是在这两个手机中显示的区域大小从肉眼看,是一模一样大的。(这点作为后面内容的一个引子,“看起来”一样大,这就是Android的一个神奇的地方)

我们来做个试验

试验材料:

① 一张120px180px的

② 四部手机, 具体参数参考上面的一张表格。三星 Galaxy win pro 3218 (hdpi)、 HTC one V (hdpi)、 中兴U985 (xhdpi)、Google Nexus 7 (xhdpi)。

③ 我在布局文件里声明了3个View, 第一个位于左上角,是一个线性布局,宽和高指定为120dp180dp(注意是dp哦), 第二个位于右上角,是一个ImageView,内容就是上面这张120px180px的, 第三个位于左下角也是一个线性布局,固定宽高,是120px180px。

我将这个放到一个Android工程里的drawable-hdpi目录

从上面的那种缩放关系表中我们可以知道,从hdpi目录中取, 运行在hdpi手机上宽高保持原始值,,运行在xhdpi手机上,宽高会乘以4/3, 也就是说会被拉扯变大, 但是的实际显示效果,即“视觉大小”怎么样呢。

下面是运行后的效果:

如图: 黑色区域是120dp180dp的View, 蓝色区域是120px180px的, 灰色区域是120px120px的View。

1, 可以看到使用dp的View(黑色区域)在不同分辨率,不同屏幕尺寸,不同屏幕密度的手机下,视觉大小看起来是一模一样的。

但是他们的实际像素值是不一样的: 120dp180dp -> (hdpi) -> 180px270px, 而120dp180dp ->(xhdpi)-> 240px360px。 由于屏幕密度的不同,缩放以后的像素可以显示出一样的视觉大小。

2, 蓝色的视觉大小也是一样的, 由于放到了hdpi目录下, 所以前两个手使用的是的原始像素120px180px, 而后两个手机对进行了放大, 参考上面的屏幕密度缩放关系表, 放大了4/3倍。 我通过对屏幕的截图,测量下来的结果的确是放大了这么多, 分别为160px240px。 由于屏幕密度的不同,它们显示出来的视觉大小是相同的。

3, 但是使用固定像素值的View就没那么幸运了, 它在hdpi的手机上看起来要比在xhdpi的手机上大一些。 要是在屏幕密度相差更大的手机上看的话, 这个区域的大小会相差很大。 这就是为什么Android推荐使用dp作为View的尺寸,而不是真实像素的原因了。

4, 经过反复试验,(实验结果就不贴图了,很多),得出一个结论,使用哪个目录下的(前提是只放在某一个目录中),在所有,不管是分辨率还是屏幕尺寸还是屏幕密度,3个参数都在改变的情况下,显示的视觉大小都和运行在这个目录对应屏幕密度手机上时的大小是一样的。

UI给工程师切多大图是合适的。

说说我之前走的冤枉路吧。

在之前, 设计师的交互和视觉设计都是基于480800的界面, 切图的时候会以480800为基础切一版, 然后在给所切的宽和高乘上个4/3,然后在出一版。

比如同一个120180的, 就会出两个版本, 一个是120180的一个是160240的。分别放到hdpi目录和xhdpi目录。

吃到的苦头是,UI很累, apk很大。T^T

这番探究下来, 发现直接基于7201280的视觉稿切一版就可以了。 将只放到xhdpi目录中,这样系统会在不同密度屏幕的手机中对进行合理的缩放, 而之前这个缩放工作竟然是人工完成的!

另: 如果想在xxhdpi的手机上显示的很好, 也可以基于1080P的屏幕设计, 这样的话就兼容所有低密度屏幕的手机, 而且也不会出现被拉扯的现象。

在移动端 UI 设计中,经常会用到的单位有 4 种:px、pt、dp 和 sp,很多人分辨不清这几种单位及其换算关系,以及 iOS 和 Android 的切图要求,我在这里做下简单的介绍,希望大家读完后能有所收获(如有错误,欢迎纠正)。

px 即 pixel,像素点,电子屏幕上组成图像的最基本单位,在描述屏幕分辨率时也会使用该单位。1px 表示一个像素,例如 iPhone 8 的尺寸为 750px × 1334px,表示在该手机屏幕上,水平方向每行有 750 个像素点,垂直方向每列有 1334 个像素点。

pt 即 point,有两个含义:一是印刷行业常用单位,是一个标准长度单位,绝对大小,1pt = 1/72 英寸 = 035mm;二是 iOS 开发用的基本单位,当设计师以 1 倍尺寸进行设计 (375pt × 667pt) 并给出标注稿时,开发人员无需除以 2 便可直接使用。

dp 是安卓开发用的基准单位,在 dpi (屏幕像素密度,即每英寸包含的像素点) 为 160 的屏幕为上,1dp = 1px。为了简单起见,Android 把屏幕密度分为了 5 种:mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi,下文会详细介绍其换算关系。

在安卓系统里,sp 与 dp 类似,不同的是 sp 可以根据用户的字体大小首选项进行缩放,而 dp 则不会。 尽量使用 dp 作为空间大小单位,sp 作为文字相关大小单位,例如:新闻类和短信类等大篇幅文本,推荐使用 sp 为单位。

在 iOS 开发中,不同机型的 iPhone 设备需要用到不同倍率的切图,下表格为各 iPhone 机型显示屏参数对比:

这里再简单了解下两个概念,ppi 和 dpi。

ppi (iOS):即 pixel per inch,屏幕像素密度,表示每英寸所包含的像素点,该值越高,屏幕越细腻。

dpi (iOS) :开发像素密度,表示每英寸所包含的开发像素点。

在 iOS 开发中,规定以 ppi = 163,dpi = 163 作为开发基准,

当 ppi = 163,dpi = 163 时,则 1pt = 1px;

当 ppi = 326,dpi = 163 时,则 1pt = 2px;

当 ppi = 401,dpi = 154 时,则 1pt = 26px ≈ 3px。

(为什么 iPhone 8+/7+/6+ 的开发基准是154?可能要问问苹果了)

依此类推,得出换算公式一:

若有小数,四舍五入即可。

在 iOS 开发中,目前只需要 @2x 和 @3x 两种切图,所以导出 2 倍和 3 倍的 png 即可。导出前注意检查切图是否存在半像素、毛边等情况,保证对齐像素,这样才能有效避免上线后页面上的 icon 出现虚边的问题,提高细节质量。

另外补充一点:从整体开发尺寸看,iPhone 8 是 375 × 667 pt (@2x),而 iPhone X 是 375 × 812 pt (@3x),同样的宽度,一个用 @2x 图,一个用 @3x 图,iPhone X 表现出了更高的清晰度,如图 2-1 所示。

在 Android 开发中,因为机型参差不齐,需要用屏幕密度来区分设计。

注意,这里的 dpi (Android) 和上文的 dpi (iOS) 是不同的概念,dpi (iOS) 是开发像素密度,而 dpi (Android) 即 dot per inch,表示屏幕像素密度 ,类似 iOS 开发里的 ppi。

Android 中,规定以 dpi = 160 为开发基准,

当 dpi = 160,基准dpi = 160,1dp = 1px;

当 dpi = 240,基准dpi = 160,1dp = 15px;

当 dpi = 320,基准dpi = 160,1dp = 2px。

依此类推,得出换算公式二:

在设计图标时,对于 5 种主流的屏幕像素密度 (mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi) 应按照 2:3:4:6:8 的比例进行缩放,如图 3-1 所示。

例如,一个启动图标的尺寸为 48 × 48 dp,这表示在 mdpi 的屏幕上其实际尺寸应为 48 × 48 px;在 hdpi 的屏幕上其实际大小是 mdpi 的 15 倍 (72 × 72 px);在 xhdpi 的屏幕上其实际大小是 mdpi 的 2 倍 (96 × 96 px),依此类推。

在某些况行下,还需要提供一种特殊的切图: 点九图 (上图所示)。点九图是 Android 开发中用到的一种特殊格式的,文件名以 “9png” 结尾。

这种能告诉程序,图像哪一部分可以被拉升,哪一部分不能被拉升需要保持原有比列。运用点九图可以保证在不模糊变形的前提下做到自适应,比如对话框背景就会用到点九图。

--

以上是全部内容,感谢你的阅读!

End

那个是开发时候用的,相当于是安卓强行规定,跟我们平时所谓的ppi(像素密度)不一样

这里所说的dpi,一般都被用于字体等大小的修改

Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi

现在屏幕越做越大,当然480 dpi、560 dpi的也都出来了

可以看看这个>

屏幕尺寸(Screen Size): 屏幕对角线的长度。iPhone5屏幕尺寸为4英寸、iPhone6屏幕尺寸为47英寸,指的是显示屏对角线的长度。 1 inch = 254cm = 254mm

分辨率:屏幕上的像素总数。常用的表现形式如:1280x720, 1920x1080等。

px,pixel,像素,电子屏幕上组成一幅图画或image的基本单元。

pt, point,点,印刷行业常用单位,等于1/72英寸。

ppi,pixel per inch,每英寸像素数,值越高,屏幕越细腻。

dpi, dot per inch,每英寸多少点,该值越高,则越细腻。

dp,dip, Density-independent pixel,安卓开发用的长度单位。以160ppi为标准,和iPhone的scale差不多的意思。安卓用dp适配,系统会自动将dp转换为px。当屏幕像素点密度为160ppi时,1dp=1px。

当的分辨率是72ppi(dpi)时,1pt = 1px;

当的分辨率是722ppi(dpi)时,1pt = 2px;

dpi最初用于衡量打印物上每英寸的点数密度,DPI值越大越精细。当DPI的概念用在计算机屏幕上时,就应称之为ppi。同理: PPI就是计算机屏幕上每英寸可以显示的像素点的数量。在电子屏幕显示中ppi和dpi是一样的。

假设屏幕分辨率为W H(px),物理尺寸为a b(inch),

则我们常说的屏幕尺寸c(如50英寸)其实是对角线的长度,因此

则像素密度(PPI),指的是屏幕单位长度的像素数

由此我们推理出:

因此我们可以得出PPI( DPI)计算公式:

dp,独立像素,虚拟单位,又称设备无关像素。1dp的长度相当于一个160dpi的屏幕上一个物理像素的长度。而160dpi的屏幕则是被android定义为基准的屏幕(mdpi)。在app运行的时候,android会将dp转为实际像素进行布局。转换的公式为:

px = dp (dpi / 160)。

dp为安卓开发时的基本长度单位,根据不同的屏幕分辨率,与px有不同的对应关系。根据其像素密度,我们将安卓端屏幕分为以下几种规格:

1dp即为当屏幕密度值为160ppi时,1pt=1px。则,在上表中,当密度为mdpi时,1dp = 1px。 以mdpi为标准,上表中屏幕的密度值比分别为:

即,在xhdpi的密度下,1dp=2px;在hdpi情况下,1dp=15px。其他类推。

在Google上搜索”DPI vs PPI”可以看到非常多的关于这两个概念的讨论,而且讨论内容不仅仅是界面设计、软件开发的内容,也包含印刷、图像处理和其他内容。那么DPI到底是什么,和PPI又有什么区别呢?这篇文章,就让我来带你一探究竟。

DPI :Dots Per Inch。每英寸点数。

上面这个定义非常简洁,但是重点没说清楚:“点”/Dot是什么?这就是理解DPI的关键。

DPI最初用于图像的印刷。图像如果要打印到纸上,实际上是通过一系列的墨点来绘制的,在“打印”这个场景中,墨点,就是DPI中D的概念。DPI的含义是点密度,用来描述打印的精细程度。

举个例子:目前常见的打印机, DPI是300。也就是说打印机能够在每英寸长度的纸上面,打印300个独立的墨点。 这就是说,如果我们打印一个边长为1英寸的黑色正方形,那么打印机会在这个正方形的范围内,绘制300 × 300 = 90000个墨点。

这便是DPI在印刷领域的定义。事实上DPI这个词最早就由印刷行业创建[1]。单色印刷通过控制墨点的密度,来区分不同的灰度,墨点的密度,就称作DPI。

最初的打印机是点阵式打印机(Dot Matrix Printer)[2],原理是使用撞针撞击墨带,墨带和纸接触将墨印到纸上。一根撞针将颜色印到纸上,就形成一个“点”。因为撞针的物理特性。不能做得很小,这类打印机的DPI很低,在70左右。

随后喷墨打印机(Inkjet Printer)[3]的出现,让DPI提高了非常多,甚至可以支持打印灰度、颜色。最常见的喷墨式打印机,常用DPI为300。有些打印机可以达到1200。过高的DPI对纸张也有了更高的要求。通常我们都在使用300DPI作为打印参数。

PPI是数字显示时代的参数,PPI是Pixel Per Inch的缩写,也就是每英寸像素。这个指标用于表示屏幕的物理精细度。

最早的支持GUI的电脑屏幕,比如施乐的Alto,苹果的Macintosh,屏幕的像素密度都是72PPI[4],这个值,就来自于当时的点阵式打印机的精度。因为PPI相同,所以屏幕上显示的一个像素,就对应打印出的纸上面的一个点,相同尺寸(5点)的文字,可以在显示器上得到所见即所得的效果。(当时,纸质文件是主要的信息交换方式)

在这个年代,DPI和PPI的含义是一样的,因为显示器上,图像的组成最小单位,就是屏幕上的一个物理像素。如果一张的尺寸为72×72,那么在屏幕上显示为1英寸,打印出来也是1英寸。

如今,在显示领域DPI区别于PPI,要”归功“于微软当时的一个决策。因为眼睛和屏幕的距离,通常大于看纸张的距离(大约长30%)。所以虽然DPI和PPI一致能保证在屏幕上所见即所得,但直接观感上,屏幕上的内容相对于纸上会更小。

微软为了解决这个问题,在 *** 作系统层面做了一个HACK:假定屏幕的PPI是96(因为当时大多数显示器都是72PPI,96 = 72 × 4/3)。所以运行在微软 *** 作系统上的软件都认为这块显示器的PPI是96,以至于同样是10点(point)大小的文字,在实际上是72PPI的显示器上,最终实际看起来就会(相比于软件认为是72PPI,10像素)大1/3(13像素,实际用来显示文字的像素数变多了)。[5]

短期来看微软解决了”保护视力“的问题,但正是因为微软的这一决策,让DPI和PPI的概念开始如此难以理解。

同时,也说明了DPI和PPI的一个最重要的区别:

DPI的差异会影响使用密度无关单位(比如:点,point)设置尺寸的图像的显示。DPI > PPI,导致占用更多像素,整个屏幕显示更少内容,反之亦然。

显示技术发展到现在,尤其2010年iPhone 4发布之后,PPI成为显示产品的一个重要竞争参数。高PPI可以带来更多的显示空间,也可以用来提升图像的显示效果。

从最初的72PPI/96PPI开始,后面几十年的发展,桌面显示器的PPI都提高到了110左右,相比于之前,增大的PPI带来的主要收益是显示空间的增大。举个例子:同样是17寸的显示器,1280 × 960分辨率相比于1024 × 768增加了像素数,同样也增大了PPI。因为都是17寸,虽然显示器的显示面积没有变大,但是像素数的增加使得屏幕可以显示更多内容,但是因为物理尺寸不变,界面元素就变小了。

在低PPI时代, *** 作系统默认会选择更大显示空间。长时间以来消费者已经习惯了低PPI的显示效果,厂商也不愿意创新,年复一年贩卖着低PPI的屏幕。

直到iPhone 4带着视网膜屏幕出现,才真正意义的让消费者感受到了高PPI带来的显示效果的提升。iOS的做法,是直接将PPI翻倍,使用4个像素来渲染原本仅用一个像素渲染的内容。对于文字来说,得益于矢量字体,文字的显示效果变得异常清晰,对于位图来说,高PPI的屏幕,也使得高质量的位图能够被显示。

事实证明,高PPI屏幕带来的显示效果提升是巨大的。高PPI移动设备的兴起,尤其是2013年MacBook Pro with Retina Display的发布,倒逼着桌面电脑厂商和显示器厂商生产更高PPI的屏幕。苹果使用移动、桌面两个平台的优秀体验,刷新了消费者对于显示的认知。不过,高PPI并不是一上来就完美。iOS和macOS视网膜屏幕推出之后很长时间,有很多应用仍然没有适配视网膜屏幕,也就是没有发挥高PPI的优势。

iOS和macOS对于没有适配的应用,在系统层面做了自动适配处理,就是对应用 使用低PPI进行离屏渲染 ,然后将渲染结果 拉伸到高PPI 。这样的结果是:

以下是适配视网膜屏幕之前、之后的Chrome的显示差异[6]:

和苹果的境遇不同,兼容机厂商无法控制 *** 作系统,微软无法控制硬件。所以Windows对高PPI屏幕的支持要逊色一筹。以至于直到Windows 81发布,才可以实现在高PPI设备上充分利用高PPI的优势,显示更精细的图像,同时还能保证旧应用功能可用(并不是所有应用)。[7]

现在,不管是macOS还是Windows 10,都能充分利用高PPI显示更精细的图像,并且默认,macOS和Windows都将内容放大,使用更多像素渲染更少内容,也即选择了“更精细的图像”。其实,视网膜屏幕的效果,是在足够高的PPI下,实现了不减少显示空间的前提下,将显示精度提高了一倍。

目前的 *** 作系统:Windows、macOS、iOS、Android等,都提供了或者部分支持修改DPI的选项,让用户选择更多显示空间,或者更精细的图像。因为物理参数已经固定了,所以更多显示空间就意味着元素相对更小,更精细的图像就意味着元素相对更大。当然,得益于物理参数的提升,相比于非Retina显示设备,均可以达到更高精度,更大空间。

高PPI下,DPI还是那个DPI吗?为了介绍高PPI时代的显示策略,先介绍一个在高PPI下,从DPI衍生出的一个更容易理解的参数: scaling factor,缩放因子

为了方便说明,我们要对显示过程进行抽象。抽象出两个过程:渲染、输出;和三层抽象屏幕:逻辑层、渲染层、物理层。开发软件时,是在逻辑层上使用 逻辑像素 设置元素的长度。 *** 作系统首先将逻辑层上的图像 渲染 到渲染层,得到 渲染分辨率 的图像;再将渲染层的图像, 输出 到物理层,也就是物理显示设备上。

高PPI下, DPI实际指的是渲染层的渲染像素密度 。如果渲染像素密度和物理像素密度恰好相等,那么 DPI == PPI 。不过,即便数值相等,含义还是不同的。下面通过在macOS,iOS,Android设备上的例子,来帮助理解这些概念,以及这些概念在 *** 作系统实际显示过程中的相互作用。

设备:MacBook Pro 2017

物理分辨率:2880 × 1800

屏幕尺寸:156英寸

macOS支持用户设置逻辑分辨率:

macOS系统在渲染时, 缩放因子固定为2 。以下示例中,为了获得渲染层的图像,可以简单通过全屏截图获得。

这个设置是MacBook Pro 2016以前的默认设置。

此时,DPI == PPI。

这个设置是MacBook Pro 2016及以后的默认设置。

为了得到更大的显示面积,设置了更大的逻辑分辨率,因为缩放因子不变,渲染层渲染了超过物理分辨率的图像,DPI大于PPI(屏幕尺寸不变,分辨率增大)。虽然和Window早起的处理一样,增大了DPI,但因为这里并不是像Windows一样将渲染像素点对点显示到物理屏幕上,所以实际的效果是界面元素变小,使得显示空间变大。

因为物理分辨率(2880 × 1800)仍然大于逻辑分辨率(1680 × 1050),所以并没有丢失逻辑层的信息。

仅部分iOS设备支持修改逻辑分辨率,分别是47英寸、55英寸iPhone,iPhone Xr和iPhone Xs Max。并且仅支持将逻辑分辨率修改为逻辑分辨率更低的一档。比如55英寸的iPhone,可以将逻辑分辨率修改为47英寸iPhone的逻辑分辨率。和macOS一样,为了获得渲染层的图像,可以简单通过全屏截图获得。

设备参数:缩放因子 = 3,物理分辨率 = 1080 × 1920,PPI = 401。

类似macOS的示例2,虽然最终显示有缩小,但实际上没有丢失逻辑层的信息。DPI为461。

设备参数:缩放因子 = 3,物理分辨率 = 1080 × 1920,PPI = 401。

类似macOS的示例2,虽然最终显示有缩小,但实际上没有丢失逻辑层的信息。DPI为417,相比上面的示例1,逻辑分辨率减少,显示内容变少,渲染分辨率变小,界面元素变大。可以看到macOS和iOS都是通过修改逻辑分辨率达到修改DPI,修改显示策略的目的。

设备参数:缩放因子 = 3,物理分辨率 = 1242 × 2688,PPI = 458。

iPhone XS Max因为物理像素密度增大到458,屏幕像素数量增加,所以能实现在缩放因子为3时,渲染分辨率和物理分辨率点对点显示。实际上iPhone XS Max的 逻辑分辨率宽度 ,和55英寸iPhone的 逻辑分辨率宽度 一致,这也是 iPhone XS Max和55英寸iPhone 在横向上能显示相同数量内容的原因。

Android的情况就比较特殊了。Google和Windows的境遇比较相似,作为软件提供商,他们的 *** 作系统会运行在不同的设备上,要应对不同PPI的屏幕。好在Android在设计之初就已经为不同PPI的屏幕适配设计了API,所以不会有早期Windows那样糟糕的兼容问题,但也带来了更高的复杂度。

Android和macOS、iOS固定缩放因子 + 指定逻辑分辨率不同。Android直接提供修改DPI的方法,厂商可以在构建 *** 作系统固件时,指定DPI。DPI、缩放因子、逻辑分辨率的关系如下:

Android同样提供缩放因子这个参数,同样,我们依然使用上面介绍的三层抽象模型进行分析。DPI参数,使用 resourcesdisplayMetricsdensityDpi 获取。

设备参数:物理分辨率 = 1080 × 1920,PPI = 403,DPI = 440。

计算参数:缩放因子 = 440 / 160 = 275。

可以看到,默认参数下,小米9的渲染分辨率和物理分辨率一致。那么修改了DPI会怎样呢?Android从70版本[8]开始在开发者选项中提供了名为” 最小宽度 “的修改项(最小宽度是逻辑分辨率的一部分,短边分辨率)。这个修改项的数值,就是逻辑分辨率中的短边值。小米9的默认值是392,我们将其改到480看下效果。

设备参数:物理分辨率 = 1080 × 1920,PPI = 403, DPI = 360

计算参数:缩放因子 = 360 / 160 = 225。

首先我们注意到DPI变成了360,为什么改了最小宽度,DPI的值会变化呢?实际上Android系统提供的修改最小宽度的方法,同样也是通过修改DPI实现的,只不过包装成了”最小宽度“(事实上就是在修改逻辑分辨率),系统在修改的时候换算成DPI,再修改系统参数。

其次我们看到因为Android使用动态的缩放因子,并且物理分辨率用作计算缩放因子的参数,所以反算出来的渲染分辨率,就是物理分辨率。这种做法的好处是 避免了一次内存中的位图缩放 *** 作

因为逻辑像素的增加,屏幕可以显示更多内容,同时界面元素变小。

为什么基准DPI的值是160呢?Android并没有官方解释,我猜测有一下几方面原因:

因为Android的渲染策略是通过DPI指定的,所以Android对位图的使用策略,也是通过DPI来确定的。Android将DPI划分为了几个档:

开发者需要提供不同DPI的,使用相同的名称,如artboardpng,放到不同的目录下。应用运行时,使用 Rdrawableartboard 引用这张。 *** 作系统根据DPI设置选择合适的资源进行显示。系统的DPI和哪个档位的DPI值相近,就会使用哪个档位的资源。比如:

iOS和Android开发中使用的长度单位,都是密度无关像素,或者称作逻辑像素。逻辑像素和渲染像素之间的转换关系是:

之所以这里在使用渲染像素,而不是物理像素,是为了结论的普适性。对于Android来说:

DP之所以是密度无关像素,就是因为使用DP进行开发,不需要关系DPI,因为在 逻辑层,没有密度的概念 (可以将逻辑层的图像内容,理解为矢量内容)。

看到这里,相信你已经对DPI的来龙去脉都有了比较清晰的了解。我们总结一下:

怎么样,仅DPI这个概念,随着科技发展,特别是消费电子的发展,也发生了非常大的变化。各厂商和 *** 作系统对DPI的使用也不尽相同,从早期微软的虚拟DPI开始,DPI的概念变得越来越难理解。不过,理解DPI不是最终的目的,对于用户来说,了解如何利用DPI调节最适合自己的显示效果;对于开发者来说,了解如何利用DPI构建更精细、协调的界面,才是更有价值的事情。

希望本文能帮助到你。

 说明:本文主要从UI设计师角度,试图回答在移动产品UI设计过程中会遇到的以下问题:

1、如何理解「像素密度」和「逻辑像素」两个概念?

2、面对琳琅满目的手机型号和屏幕大小,应该选择何种倍率和尺寸进行作图?

3、基准设计稿完成后,如何进行屏幕适配? 

说明:本章涉及的概念有:屏幕尺寸、PPI、DPI、物理像素。

诺曼在《情感化设计》一书中提到愉悦感的四大类,其中第一类是:生理的愉悦,也就是本能的感官体验。画质的清晰、细腻、逼真是视觉感官体验的一部分。而画质是由屏幕性质决定的。

当前市场手机型号众多,如何判断不同屏幕清晰度质量的好坏?这里,我们需要引入一个重要概念。

我们知道,屏幕是由很多像素点组成的,每个点发出不同颜色的光,构成我们看到的画面。当我们眼睛的视杆细胞和视锥细胞接收到的光线越多,我们感知到的画面就会越丰富。而如果需要光线多,就需要保证像素点够多。

我们在计算「人口密度」时,会抓出一平方公里的地区,看里面塞了多少人,据此,判断人口的密集程度。同理,我们可以抓出一英寸的界面,看里面塞了多少个像素点,判断像素的密集程度,这就是「像素密度」。

前面提到,「像素密度」表示一英寸界面中的像素点数,所以它跟两个参数有关:界面尺寸 和 像素。

一般手机的出厂配置信息中都标有「屏幕尺寸」,指的是屏幕的对角线长度,单位是inch(1英寸=254厘米,大约是食指最末端那根指节的长度)。设备长、宽的实际长度,即「物理尺寸」,用勾股定理计算可得屏幕尺寸。

我们也可以查到设备的分辨率,即在横纵切上的像素点数,也叫「物理像素」,单位是px。

拿到这两个参数,就可以计算出「像素密度」。

还有一种计算方法,是先算出「物理像素」的平方和,再开根号,最后除以「屏幕尺寸」。

从计算方法可以看出,像素密度就是pixels per inch,简称:PPI。

值得注意的是,在Android系统中,除了像素密度PPI,还有一个DPI,也是「像素密度」,全名为:Dots per inch,两者的区别是:

PPI:表示物理像素密度,是客观存在不会改变的。

DPI:表示软件像素密度,是软件参考了ppi后,人为指定的一个固定值,写在系统出厂配置文件上,保证在某一个区间的ppi在软件上使用同一个值,它是安卓特有的。

所以,可能有几款安卓手机的PPI不同,但是DPI相同。比如,有3款相同分辨率不同尺寸手机的ppi可能分别是430,440,450,那么在Android系统中,可能dpi会全部指定为480,以保证相同分辨率手机的表现一致。

苹果手机型号有限,所以没有DPI的概念,全部用PPI表示。

「像素密度」是连接数字世界和物理世界的桥梁。它是设备的固有属性,反映了屏幕呈现影像细节的能力。像素密度越高,屏幕显示的密度越高,拟真度就越好。Retina屏比普通屏清晰,就是因为它的像素密度翻了一倍。

我们可以根据「像素密度」判断屏幕显示质量的好坏。iPhone 3gs和iPhone 4物理尺寸相同,但是后者的ppi为326,是前者163的两倍,分辨率也是两倍的关系,说明4的呈像能力更佳。同时也可以看出,手机屏幕的物理尺寸和像素尺寸是不成比例的。

总之:只要两款手机的「像素密度」相同,它们的显示「精细程度」就是相同的。 

说明:本章涉及的概念有:逻辑像素、倍率、逻辑像素密度。

假如我们在界面A(1英寸,4x4 px)上放一个1×1像素的红方格,然后把它移动到同样尺寸、2倍像素密度的界面B(1英寸,8x8 px)上,如下图所示。

在界面B上,红方格还是涵盖了1×1像素,但是实际的物理尺寸却变小了。这是不符合一般人的常识的,为什么同一个内容在同样尺寸的界面上显示不一样?

如何解决这个问题?我们可以试着分析一下:

对比界面A和B,B的「像素密度」更大,「界面-物理像素」也更大。

红方格在移动过程中,方格的「物理像素」不变,方格的「物理尺寸」变小。

以上因素中,「物理尺寸」是我们唯一肉眼可以观察到的属性。我们的目标是让红方格的变化过程符合常识,也就是保持红方格的「物理尺寸」不变。根据「像素密度」的计算公式,红方格物理尺寸一定时,当像素密度变成2倍,在界面B中的红方格的物理像素就必须变成原来的2倍。

物理尺寸一样,红方格在界面A和界面B中显示的内容物的多少就是一样的。为了标记这种“不同分辨率界面呈现同样多内容显示效果”的能力,我们引入一个抽象概念,它就是「逻辑像素」。我们约定把界面A的物理像素作为基准,界面B可用对应的像素乘以倍数得出,A和B的显示范围是一样的。这个基准就是逻辑像素。

现在,我们再次把红方格,从界面A移到界面B,因为界面B的像素密度是界面A的2倍,为了红方格在两个界面中肉眼可见的大小排版一致,根据公式,红方格在界面B中占据的物理像素是界面A中的2倍,如下图所示:

逻辑像素作为一组基准手机的分辨率尺寸,为了表达方便,需要有统一的单位。

由于iOS和Android的开发工具不同,逻辑像素在两个平台的单位名称也不同,iOS是pt, Android是dp, 设计师可以简单理解为:pt=dp

iOS 的 pt :point 表示点 。

Android 的 dp :Density-independent Pixels,指密度无关像素。

计量单位决定了我们的思考方式。在设计和开发过程中,应该尽量使用逻辑像素尺寸来思考界面。

「逻辑分辨率」就是用逻辑像素描述屏幕的分辨率;「逻辑像素密度」是用“屏幕像素密度”相对于“基准屏幕密度”的倍数表示,即相对密度。

假设「逻辑像素密度」为n,那么 1 pt = 1 dp = n px。具体单位之间的换算关系随倍率变化:

@1×倍:1pt=1dp=1px

@15×倍:1pt=1dp=15px

@2×倍:1pt=1dp=2px

@3×倍:1pt=1dp=3px

@4×倍:1pt=1dp=4px

可以把「逻辑像素」和「物理尺寸相关联,在分辨率较低的手机中,可能1pt=1px,而在分辨率较高的手机中,可能1pt=2px,这样的话,一个108108pt的控件,在不同的手机中就能表现出肉眼观看的差不多的大小,只是分辨率高的展示的更加清楚。如下图所示。

知道了逻辑像素和单位,实际「物理像素」的计算公式:

iOS的分辨率:px=pt 倍率(其中pt是逻辑像素尺寸,iOS常用倍率为@2×,@3×)

Android的分辨率:px=dp (dpi / 160)    (其中dp是逻辑像素尺寸, dpi是逻辑像素密度,160是规定的@1×的基准逻辑像素密度)。

「逻辑像素」是人为约定的,会影响屏幕显示内容的多寡,与影响清晰度的「像素密度」无关。

物理分辨率:硬件所支持的。

逻辑分辨率:软件可达到的。

当两个设备逻辑像素一致,显示容量就一样;当逻辑像素不一致时,尺寸大的那个显示的内容多。

比如,以iPhone 3gs 和iPhone 4 为例,两者的物理尺寸一致,逻辑分辨率一致;物理分辨率3gs是320×480, 4是640×960,后者无论物理分辨率,还是像素密度都是前者的2倍。因为物理分辨率不同,4的硬件支持的呈像质量更高;因为逻辑分辨率相同,两者的软件可达的容纳物的多少是一致的。

再比如,有两台Android设备的屏幕尺寸为480x800px和720x1280px,它们分别属于hdpi和xhdpi,除以各自倍率15倍和3倍,得到逻辑像素为320×533dp和360×640dp。很显然,后者更宽更高,能显示更多内容。

逻辑分辨率的三大作用:

1、作为屏幕显示内容多少(也就是容积)的表征。逻辑像素尺寸大,显示的内容就多,和设备实际的分辨率尺寸、像素密度和倍率都无关。

2、保证控件在不同屏幕间切换符合人的常识和预期:屏幕显示内容的多少,和分辨率、像素密度无关,和屏幕的物理大小有关,这也符合人们的常识:屏幕越大,显示内容越多。

3、应用于设计和开发:我们不需要关注屏幕的像素密度,只需要关心逻辑分辨率即可,方便设计沟通。 

说明:熟悉了概念,下面进入实 *** :UI设计作图。

UI设计过程中,在我们决定采用哪一种手机屏幕的尺寸作图前,应该首先考虑选择何种倍率呢。

因为正是「倍率」,把大大小小的屏幕拉回到了同一水平线,得以保证一套设计稿适应各种屏幕。

另外,在为开发提供的设计资源中,同一张图通常有两个,甚至三个尺寸。文件名有的带@2x或@3x字样,有的不带。其中@2x,@3x就表示是倍率。不带的用在普通屏上,带的用在Retina屏上。只要准备好,iOS或Android会自己判断用哪张。

我们可以直接选择逻辑像素尺寸(也就是x1倍率)进行设计作图。

但是,x1倍率的设备目前差不多已被淘汰。而我们通常会将做好的设计图导入对应设备查看效果,目前主流设备都采用x2、x3倍率,x1的设计图放入主流设备查看效果必须进行放大,粗略的放大会导致失真,影响效果查看。所以x1倍率在最终查看效果图时存在缺陷。

那x3倍率的怎么样?

在与程序员沟通、设计切图时,我们都会进行倍率之间的换算。x3切图换算不方便;

另外,程序员拿到标注图后,需要将其中的px转换成pt进行开发。(1)情况1:x2倍率下,将列表高120px, 头像高102px的标注转换成逻辑像素后为:60pt,52pt,两者是无法居中对齐的,会有1pt误差,最终设备呈现效果就会有2px的像素偏移;(2)情况2:假如将x3倍率的100px转换成逻辑像素,由于逻辑像素与物理像素一样,必须取整数,程序员只可能在33pt和34pt之间选取一个数值。如果采用33pt,最终呈现在设备上的尺寸是99x99px, 有1px误差;如果采用34pt,最终设备呈现的尺寸是102x103px, 有2px误差。所以,为确保设计图的落地效果,我们需要:

在x1倍率下,尺寸必须为 偶数;

在x2倍率下,尺寸必须为 4的倍数;

在x3倍率下,尺寸必须为 6的倍数。

可以看出,x3倍率的执行难度最高。

通过以上,我们也可以排除“x3倍率”作为我们的作图选择。

因为x1倍率、x3倍率都存在明显短板,常用倍率只剩下x2倍率。鉴于x2倍率各方面都比较均衡,所以:

选择x2倍率作为我们的作图尺寸。

选定作图倍率后,我们就可以选择具体的作图尺寸。    

目前iPhone的主流机型在x2倍率下的尺寸有5种,如下图:

其中,iPhone X 可以认为是iPhone 6 的加长版;iPhone XR 可以认为是iPhone 6P的加长版。如下图:

所以这4种尺寸可以归为2个类型:宽度为750和828的。

而Android系统逻辑像素已统一为360x640,x2倍率就是:720x1280

最后,总结出双平台@2x倍率,共计4种屏幕尺寸。

大屏时代,用小屏为设计基准显然不合时宜。我们一般选择中间尺寸为基准进行适配,因为从中间向上或向下适配,调整幅度最小。

中间尺寸有两个分别是iOS和Android的,要选哪一个?

大多数设计师日常用的都是iPhone,对Android开发可能了解不够;同时Android验收不太受重视,设计师对Android的容错率较高,这也导致Android端常常容易出问题。根据“哪里问题多,从哪里着手”的原则,可选择以 720×1280 作为设计基准。

但是选择750×1334也没有毛病,很多比较倾向于iOS设计。两者都可以“一稿适配双平台”。

当然,很多团队都是同时出iOS和Android两套设计稿,那就可以:

同时把 750×1334 px 和 720×1280 px 作为设计基准。

为了发现作图尺寸和设计规范之间的关系,我们对比不同倍率的屏幕控件尺寸:

发现:控件高度随倍率等比放大/缩小。

(其中iPhone Xs Max只不过顶部状态栏在原来的20pt基础之上增加了24pt变为44pt,底部增加34pt的主页指示器。)

相同倍率,对比控件尺寸:

发现:相同倍率,控件大小不变。页面尺寸变化,不会对控件大小产生影响。

综上得出:控件大小只随倍率变化,与实际作图尺寸无关。也就是说:

作图尺寸对设计规范没有任何影响,设计规范就是组件规范。 

说明:开始作图后,我们开始考虑更多的细节问题。

什么是适配?

就是让同一套APP的UI设计,在不同尺寸分辨率比例的「移动终端设备」上都能正常显示。为此需要根据不同机型对构成界面的组件进行的一系列调整。

为什么要适配?为了在多样性的设备环境中追求体验的一致,保持理想的展示效果。适配只看3个参数:

渲染像素——屏幕截图的尺寸,单位 px

逻辑像素——程序员开发所用尺寸,单位 pt

倍       率——渲染像素/逻辑像素 得到的倍数关系,常见倍率有@2x、@3x。倍率决定切图。

界面元素按照屏幕大小整体等比例缩放,一般是界面版式特殊,布局不能变化的情况。比如墙、列表。适配时,控件尺寸大小随屏幕宽度变化自适应。屏幕越宽,单屏显示内容越少。

注意:界面缩放过程中,要保证资源在拉伸后的清晰度,避免降低产品品质。

对局部控件做调整,进行缩放或自适应。比如,列表控件中局部的放大,文字列表控件文字长度的自适应。

如果界面不适合拉伸,或界面本来就有很多可扩展区域,可考虑将增加的空间分配到这些区域,增加元素的间距。比如,九宫格列表。

还有一些满屏界面,比如启动图、音乐播放器、活动H5页等。因为显示屏宽高比不同,拉伸会导致形变。可以通过调整背景间距增加延展性。

我们平常讲的适配常常都是指宽度的适配,因为一般界面的内容总是在纵向存在超过一屏的滚动内容,可以不断往下滚动,所以纵向的适配设计常常被忽略。

但是,全面屏的出现,使我们不得不正视这个问题。因为全面屏刘海和屏幕圆角的问题,导致整体高度的变化,进而影响了比例的变化。

首先,iPhone全面屏出现了刘海和屏幕圆角设计,我们需要重新定义「安全区域」,确保页面内容不能超出安全区域。

具体的安全区高度=屏幕高度-44-34(单位:pt),如下图所示

以下就顶部、底部和满屏界面进行适配。

顶部区域,非全面屏状态栏高为20pt, 全面屏状态栏高为44pt, 两者存在24pt, 在设计顶部时,需要就差值作出适配。

一般顶部区域主要放置的控件以及应对策略:

底部区域用于手势进入主屏或切换应用。如果将触发交互行为的按钮放在屏幕底部,会破坏APP的 *** 作体验。除了一些无 *** 作的信息流可以不用另外设置,常规做法都是将底部 *** 作区全部提高34pt。

上文已经提到,正常全屏适配的常规做法就是间距调整,全面屏依然适用。需要注意的是一些全屏的视频播放,需要控制在安全区域内。

马上即将迎来折叠屏手机,折叠屏的适配也需要纳入考虑范围。目前有华为和三星两家手机厂商即将发布折叠屏。相关尺寸参数如下:

目前淘宝设计推荐的方法是,采用内容流动的适配方式。

具体需要等正式上市,再进行专门适配。待续……

说明:以下提供iOS和Android两个平台一些常见的手机型号、屏幕尺寸、分辨率等参数。

iOS常用的逻辑像素有:320×568 pt(5/5c/5s/se),375×667 pt(6/6s/7/8),375×812pt(X/Xs),414×736 pt(6p/6sp/7p/8p),414×896pt(XR/Xs Max),常用倍率有:@3x,@2x

根据友盟数据,目前iPhone使用最多的是6/6s/7/8的750×1334px屏幕,倍率为2,逻辑像素320x667 pt。上升势头最猛,未来有望登上第一的是6p/6sp/7p/8p的1080×1920px屏幕。倍率为2,逻辑像素414x736 pt。 

注意:iphone 6plus适配中,有设计版,物理版,放大版:    

因为plus屏幕有1080个像素点,但截屏后发现图像是1242像素,就是在一个物理有1080个像素点的屏幕里塞了个1242像素的内容。而放大版,就是iphone 6的尺寸等比放大15倍得出的分辨率。

在iPhone6的x2倍设计稿中,界面元素之间的常用距离,亲密距离:20px;疏远距离:30px。

疏远距离:比如,所有元素距离手机屏幕最左边的距离。

亲密距离:比如,左边图标与右边文字之间的距离。

安卓由于屏幕尺寸过多,分辨率跨度大,根据dpi分成几个范围区间:

像素密度为160dpi左右的称为mdpi, 240左右的为hdpi, 320左右的xhdpi…以此类推。这样,所有的安卓屏幕都找到了自己的位置,并赋予了相应的倍率。

Android约定:当dpi=160时,倍率为@1x,逻辑像素=320×480 dp  或 360×640 dp ,称之为mdpi,其它的都是基于此通过倍率转化:hdpi:15倍;xhdpi:2倍;xxhdpi:3倍;xxxhdpi:4倍。

如今的Android屏幕逻辑像素已经趋于统一,基准为:360x640 dp。

在实际 *** 作中,我们要用「逻辑像素尺寸」思维来思考界面,把单位设置成逻辑像素。打开PS的首选项——单位与标尺界面,把尺寸和文字的单位都改成点(Point)。这里的点也就是pt,无论设计iOS、Android还是Web应用,单位都用它。

要调节倍率,则通过图像大小里的DPI来控制。这个DPI,其实就是PPI,像素密度。有个常识大家都知道,屏幕上的设计DPI设成72,印刷品设计DPI设成300。

本文从理论入手,先介绍了「像素密度」和「逻辑像素」两个重要概念,其中像素密度影响“屏幕的成像质量”,逻辑像素影响“界面的容积能力”;接着进入实际 *** 作,设计作图应该选择何种倍率和屏幕尺寸;然后是细节的处理,常用的适配方法,以及全面屏的适配。最后是iPhone和Android手机的一些设计参数。

1,首先我们得知道啥是屏幕像素,引用一段百科的介绍:

确定计算机屏幕上显示多少信息的设置,以水平和垂直像素来衡量。屏幕分辨率低时(例如 640 x 480),在屏幕上显示的像素少,但尺寸比较大。屏幕分辨率高时(例如 1600 x 1200),在屏幕上显示的像素多,但尺寸比较小。

显示分辨率就是屏幕上显示的像素个数,分辨率160×128的意思是水平方向含有像素数为160个,垂直方向像素数128个。屏幕尺寸一样的情况下,分辨率越高,显示效果就越精细和细腻。

总而言之就是同样的屏幕下,像素密度越高,你看到的内容更多更清晰,但是尺寸就越小,反之像素密度越低,内容越少,尺寸越大

2,举例探究:例如你在左手掌上画一个1,右手掌画2个1,这时你会看见右手显示出来的东西比左手多,像素密度就是这个道理

3,1080p和720p都是分辨率的意思,分辨率是指设备能显示的像素,分辨率越高,显示的东西越多,越低显示的越少

4,分辨率举例:左手画几个格子组成一个图案,右手画满格子组成同一个图案,这时你发现虽然是同一个图案但是右手的很明显要比左手的清晰,那是因为组成格子的个数不一样,分辨率就是这个道理

5,两者之间的关系举例:5寸的手机(一个手掌)分别在720P和1080p的差别(清晰度不同,格子数不同)

4寸的手机(小一点的手掌)和5寸手机(一个大点的手掌)都在1080P下的显示效果(同样的格子数),而4寸因为小,所以显示的内容更多

以上就是关于进行Android开发的时候没有测试机适配怎么办,如何进行屏幕适配全部的内容,包括:进行Android开发的时候没有测试机适配怎么办,如何进行屏幕适配、iOS、Android 开发单位换算及 UI 切图要求、安卓手机dpi和ppi为什么不相同等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9519208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存