Android中可以通过三种方式获到屏幕大小:
1、通过WindowManager获取
DisplayMetrics dm = new DisplayMetrics();
getWindowManager()getDefaultDisplay()getMetrics(dm);
Systemoutprintln("heigth : " + dmheightPixels);
Systemoutprintln("width : " + dmwidthPixels);
2、通过Resources获取
DisplayMetrics dm2 = getResources()getDisplayMetrics();
Systemoutprintln("heigth2 : " + dm2heightPixels);
Systemoutprintln("width2 : " + dm2widthPixels);
3、通过Display 获取屏幕的默认分辨率
Display display = getWindowManager()getDefaultDisplay();
Systemoutprintln("width-display :" + displaygetWidth());
Systemoutprintln("heigth-display :" + displaygetHeight());
例如:对于DPR=2的Retina屏幕而言1个位图像素对应于4个物理像素,由于单一位图像素不可再分割,所以只能就近取色,从而导致模糊。所以对于清晰度问题,较好的方案是提供两倍图 @x2 。
像素密度表示设备屏幕能够显示的设备独立像素DIP的数量,屏幕显示的像素数量越多画面也就越精细,同时同样屏幕区域能够显示的信息也就越多。
屏幕由像素点组成,每个像素点发出不同颜色的光,进而构成界面。而屏幕的物理尺寸与像素尺寸是不成比例的。不同尺寸的手机屏幕拥有不同的分辨率,分辨率实际上是手机像素的宽高尺寸。
像素密度(pixels per inch,PPI或DPI)表示每英寸长度上排列的设备独立像素点DIP的个数,1英寸等于253厘米。像素密度PPI越高则表示屏幕分辨率越高进而屏幕显示越精细。Retine屏幕比普通屏幕清晰的原因,是因为它的像素密度是普通屏幕的数倍。
例如:35英寸的iPhone手机屏幕
日常所说的屏幕尺寸,实际是指屏幕对角线的长度。计算像素密度首先需要计算设备屏幕对角线等效像素,然后除以对角线长度。例如HTC G7分辨率为480x800,37英寸,计算出像素密度为252PPI。
像素密度PPI = 平方像素宽加平方像素高之和开平方的结果,再除以屏幕对角线的英寸数。
密度决定比例
通过计算像素密度PPI可以得知设备屏幕属于哪个密度区间,因为不同密度区间对应着不同的默认缩放比例。
通俗来说视区 Viewport 就是浏览器上用来显示页面的区域,也就是说,浏览器的实际宽度和手机宽度不一样,无论手机宽度是320px或640px,在手机浏览器内部宽度始终会是浏览器本身的视区。
现代浏览器都会给自身的视区提供一个默认值,大多会以980px或1024px为主。在移动端视区默认一般来说是会大于手机屏幕的,所以当在桌面浏览器正常显示的页面,会以960px设计主区域。放到移动端就会出现横向滚动条,因此会专门会给浏览器设计移动端的页面。
移动端浏览器会将页面放在一个虚拟的窗口 viewport 中,通常这个虚拟的窗口会比屏幕宽,这样就不用将每个页面挤到很小的窗口中,以防止破坏没有针对手机浏览器优化的网页布局,用户可以通过平移或缩放来查看页面中的不同部分。
页面中视区 viewport 是可绘制的区域,虽然视区的可视面积和屏幕尺寸相匹配,但视区页由自己的尺寸,用来确定页面中的像素数量。
在 iPhone 和 Android 平台中 WebKit 内核的历览器使用980像素宽的视见区或逻辑尺寸,相当于viewport中的width=980px。当页面加载后,页面内容通常被完全缩放以便整个页面都可见,尽管内容会被缩放的非常小且不可读。
在Web页面中,可通过JS动态获取相关参数。
根据目前市场主流移动终端,统计设备独立像素后,移动端H5设计稿推荐尺寸为640 x 1136、750 x 1334。
除去浏览器全屏显示,几乎所有情况下均会存在顶部状态栏和导航栏。根据iPhone标准,状态栏和导航栏的独立像素高度分别为40px和88px。Android平台可以更改状态和导航栏高度可取默认值48px和100px为准。在网页中就会将页面内容向下挤入盲区,根据不同的布局方式可能会挤出视口,也就是可视区域之下。因此取两个平台的最大值148。因此设计稿要尽量保证单页下没有重要内容。如果要在所有屏幕上将重要内容显示完全,需要注意市面上存在的小尺寸屏幕,绝对部分智能机分辨率在640 x 960之上,因此只要重要内容放在盲区之上即可。计算出的最安全高度为812 = 960 - 148。
简单来说视区 Viewport 是严格等于浏览器的窗口,在桌面浏览器中视区就是浏览器窗口的宽高,但在移动设备上由于视区太窄,为了更好的为 CSS 布局服务,所以提供了两个视区,分别是可见视区 Visual Viewport 和布局视区 Layout Viewport 。
如果将移动设备浏览器的可视区域设置为Viewport,某些网站会因为Viewport太窄而显示错乱,所以浏览器会默认将Viewport设置为一个较宽的值,比如980px,使得为桌面浏览器设计的网站也能在移动设备浏览器上正常显示。这个浏览器默认的Viewport也就是Layout Viewport布局视区。布局视区的宽度可以使用JavaScript的 documentdocumentElementclientWidth 获取。移动设备中默认的视区就是Layout Viewport。
布局视区的宽度是大于浏览器可视区域的宽度的,因此需要一个Viewport来表示浏览器可视区域大小,这个Viewport也就是可见视区Visual Viewport,可见视区可使用JavaScript的 documentdocumentElementinnerWidth 获取。
Ideal Viewport是一个能完美适配移动设备的Viewport,首先无需缩放和横向滚动条就能正常查看页面所有内容,其次显示的文字、大小合适。比如14px的文本不会因为一个高密度像素的屏幕而显示的太小或无法看清。无论在何种密度屏幕、何种分辨率下,显示出来的大小都差不多,这个Viewport也就是Ideal Viewport。
Ideal Viewport并没有一个固定的尺寸,不同的设备拥有不同的尺寸。比如在IPhone设备中Ideal Viewport宽度是320px,无论屏幕宽度是320还是640的。Ideal Viewport的意义在于,无论在何种分辨率下,针对Ideal Viewport而设计的页面无需缩放和横向滚动条都可以完美地呈现给用户。
移动设备中默认的视区是Layout Viewport,在进行移动设备页面开发时则需要Ideal Viewport。要得到完美视区,需设置 meta 标签。
该 meta 标签的作用是让当前视区宽度等于设备宽度,同时不允许用户手动缩放。 minimum-scale=10 与 maximum-scale=10 并不是必需的。但 width = device-width 则是必须的,以保证不会出现横向滚动条。
width 能够控制默认布局视区Layout Viewport的宽度,若不指定则默认会是980px或1024px,这个值会由设备自身所决定。当把布局视区宽度设置为移动设备宽度 width = device-width 时,此时布局视区将会变成完美视区。
其实要将当前视区宽度设置为完美视区宽度,既可以设置 width = device-width 也可以设置 initial-scale = 10 ,但是单单设置 width = device-width 会导致iPhone、iPad设备中横竖屏不分,单单设置 initial-scale = 10 则会导致IE中横竖屏不分。所以都以竖屏的完美视口宽度为标准,最完美的写法时两则都写上去, width = device-width 解决iPhone、iPad缺陷, initial-scale = 10 则解决IE的缺陷。
CSS3新增视区单位vm和vh,在移动端iOS8+和Android44+获得支持。
设备像素比定义了物理像素与设备独立像素之间的对应关系,计算公式为:设备像素比 = 物理像素 / 设备独立像素。
在CSS中可通过以下方式进行媒体查询,针对不同DPR设备做出样式适配。
在JavaScript中可通过 windowdevicePixelRatio 获取当前设备的DPR。
在Ratina高清设备屏幕中一个CSS像素对应4个物理像素
Web页面设置视口后,页面与屏幕是1:1显示,移动设备都具有设备像素比 DPR ,当DPR=2时移动设备上的一个CSS像素由4个物理像素点组成。
安卓客户端限制了 viewport 设置的缩放属性,让客户端放开限制就行,但是由于市场上的app版本还是不支持,所以需要做兼容性处理。
iPhone6 上有1px 的滚动条,最后处理方案是通过 viewport 中的 maximum-scale 的值加了01,由于设置了user-scalable=no,maximum-scale 的值加01并不会有什么影响。
通过JS动态获取移动设备的设备像素比,通过设备像素比来计算并设备Web页面中 html 标签的字体大小 font-size 以及缩放比例。
例如:动态设置 html 的font-size, 同时根据设备DPR调整页面的缩放值,进而达到高清效果。
rem 全称 font size of the root element 是指相对于根元素的字体大小的相对单位,计算规则依赖于根元素。
rem 是通过根元素进行适配的,web中根元素是指 html ,所以通过设置 html 的字体大小即可控制 rem 的大小。
REM布局的核心是设置好根 html 元素的字体大小 font-size ,为了防止在高清屏下像素不够用而导致模糊,当拿到移动设计稿时,移动设计稿一般会以iPhone5设备宽320px或iPhone6设备宽375px为基准,制作出两倍宽的设计稿,即640px或750px。
例如:设置 html 标签的 font-size:10px ,6rem即610px。
rem 适用于WebApp,出于兼容性考虑,WebApp下使用 rem 更加能凸价值和功能。
使用CSS的媒体查询控制
移动UI设计稿会采用iPhone宽度作为标准
使用JS控制Web页面文字大小使其自适应屏幕
使用 rem 布局的本质是等比缩放,一般是基于宽度。
将屏幕宽度均分100份,每一份的宽度使用x表示,即x=屏幕宽度/100,如果将x作为单位,x前面的数值代表屏幕宽度的百分比。想要屏幕元素随着屏幕宽度等比缩放,只需要确定x单位,可通过CSS3中的 rem 来实现。可通过JS设置HTML字体大小等于屏幕宽度的百分之一。
若UE设计稿宽度尺寸为640px,设计稿中某元素宽度为100px,则可以计算出100 / 640px 100px = 15625。
最佳实践:px2rem移动端自适应方案 >
用if else来判断,给<script>设置一个ID,再根据setAttribute改变src的属性。
@media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){/ 兼容iphone4/4s /
class{}
}
@media (device-height:568px) and (-webkit-min-device-pixel-ratio:2){/ 兼容iphone5 /
class{}
}
分辨率可以从显示分辨率与图像分辨率两个方向来分类。
显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。
可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。
图像分辨率则是单位英寸中所包含的像素点数,其定义更趋近于分辨率本身的定义。
以上就是关于Android手机js获取屏幕尺寸不准,导致计算的问题全部的内容,包括:Android手机js获取屏幕尺寸不准,导致计算的问题、页面布局方案、帮写一个css3或者js,判断4S,iphone5以及1080p的手机屏幕分辨率,加载不同的css等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)