Android手机js获取屏幕尺寸不准,导致计算的问题

Android手机js获取屏幕尺寸不准,导致计算的问题,第1张

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());

关键字: 屏幕适配 px dp dpi sp large限定符 9png

前言: 这篇文章依然是我在 [慕课网 ][h]学习 凯子哥 的同名视频 Android-屏幕适配全攻略 ,所记录下来的笔记---凯子哥讲得真的超详细。

[h]: >

请看下面截图,例子来自android学习手册,360手机助手中下载,排到第4个,里面有108个例子、源码还有文档

我们在网上看得最多的应该是以下这个方法:

WindowManager wm = getWindowManager();

Display display = wmgetDefaultDisplay();

int screenWidth = displaygetWidth();

int screenHeight = displaygetHeight();

但studio提示它已经过时了,建议不再使用。

再去查看android源码,发现可使用getSize替代,代码如下:

public static Point getSize(Activity act) {

Display display = actgetWindowManager()getDefaultDisplay();

Point size = new Point();

displaygetSize(size);  //sizex就是宽度,sizey就是高度

return size;

}

一段时间后发现getWindowManager方法只能在activity中使用或者被activity实例调用,那像我们在Fragment或者Adapter中想获得屏幕分辨率,又有困难了(因为Fragment和Adapter一般只有Context),虽然可以通过强制类型转换来处理,可是毕竟劳民伤财需要时时记得去转换。所以又改了从Context获取系统服务,然后再去取分辨率,改后的代码如下:

public static Point getSize(Context ctx) {

WindowManager wm = (WindowManager) ctxgetSystemService(ContextWINDOW_SERVICE);

Display display = wmgetDefaultDisplay();

Point size = new Point();

displaygetSize(size);

return size;

}

再后来发现通过DisplayMetrics也能获取分辨率

public static Point getSizeNew(Context ctx) {

WindowManager wm = (WindowManager) ctxgetSystemService(ContextWINDOW_SERVICE);

DisplayMetrics dm = new DisplayMetrics();

wmgetDefaultDisplay()getMetrics(dm);

Point size = new Point();

sizex = dmwidthPixelsdmdensity;

sizey = dmheightPixelsdmdensity;

return size;

}

不久便发现这个新方法时常量错了,结果确认widthPixels和heightPixels就是宽和高,无需再乘上density。因为widthPixels和heightPixels的单位都是像素,而density指的是像素密度,即一个单位内有几个像素,所以在我这边乘上density没有意义,只有除以density才有意义。dmwidthPixels/dmdensity指的是宽度上有多少单位,dmheightPixels/dmdensity指的是高度上有多少单位。网上乘以density的做法,可能只是他们恰好遇上部分特殊机型罢了。最后的代码如下:

public static Point getSizeNew(Context ctx) {

WindowManager wm = (WindowManager) ctxgetSystemService(ContextWINDOW_SERVICE);

DisplayMetrics dm = new DisplayMetrics();

wmgetDefaultDisplay()getMetrics(dm);

Point size = new Point();

sizex = dmwidthPixels;

sizey = dmheightPixels;

return size;

}

@[TOC](文章目录)

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 前言

<font color=#999AAA >使用工具Android studio,利用values文件下dimensxml界面适配安卓屏幕</font>

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

<font color=#999AAA >提示:以下是本篇文章正文内容,下面案例可供参考

# 一、概念

1屏幕分辨率单位是px,例如Android手机常见的分辨率:320x480px、480x800px、720x1280px、1080x1920px。

2手机屏幕的密度:每英寸的像素点数,单位是dpi。

| 密度类型 |代表的分辨率(px)| 屏幕像素密度(dpi) | 1dp转换为px |

|:--------|:--------|:--------|:--------|

| 低密度(ldpi) |240x320|120|075|

| 中密度(mdpi) |320x480|160|1|

| 高密度(hdpi)|480x800|240| 15|

| 超高密度(xhdpi)|720x1280|320|2|

| 超超高密度(xxhdpi) |1080x1920|480|3|

3由于android的机型屏幕大小品类太多了,有一些是不标准的,这时我们就需要单独去获取屏幕的分辨率和密度了。

# 二、获取屏幕的分辨率和密度

```java

DisplayMetrics displayMetrics = getResources()getDisplayMetrics();

    float density = displayMetricsdensity;

    int densityDpi = displayMetricsdensityDpi;

    int width = displayMetricswidthPixels;

    int height = displayMetricsheightPixels;

    Loge("123","密度:"+density+"---"+densityDpi);

    Loge("123","屏幕分辨率:"+width+"x"+height);

    Loge("123","安卓系统:"+androidosBuildVERSIONRELEASE);

    Loge("123","手表型号:"+androidosBuildPRODUCT);

```

# 三、SmallestWidth适配

smallestWidth适配,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。

sw计算公式:sw = 屏幕宽度 / (dpi/160)  注:160是默认的

例如:屏幕宽度为1080px、480dpi 的sw = 1080/(480/160)

# 四、生成 dimens 文件

1、 首先在 res 目录下新建各种尺寸的 values 文件 。文件名为:values-sw(你要适配屏幕的sw值)dp。

例如:

![code23](>

Android屏幕适配-基础篇

Android屏幕适配-应用篇

从两个大方面阐述一下Android的屏幕适配:

Android推荐使用dp作为尺寸单位来适配UI ,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。

缺点

(1)这种方案只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,但dpi的不同,还是会存在差异。

(2)一般的设计稿都是以px为单位的,所以我们在写layout文件的时候需要将px转为dp,影响开发效率。

 为了高效的实现UI开发,出现了新的适配方案,我把它称作宽高限定符适配。简单说,就是穷举市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件:

鸿洋大神的作品 ,使用也超级简单,核心功能就是在绘制的时候在onMeasure里面做变换,重新计算px。

缺点 :我们自定义的控件可能会被影响或限制,可能有些特定的控件(框架没有做适配的控件),需要单独适配。

  小结:上述几种适配方案都是实际开发中用过的方案,但随着技术不断的更新,出现了更好的适配方案。

   实现原理 :Android会识别屏幕可用高度和宽度的最小尺寸的dp值( 其实就是手机的宽度值 ),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。

   sw限定符适配 宽高限定符适配 类似,区别在于,前者有很好的容错机制,如果没有value-sw360dp文件夹,系统会向下寻找,比如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问题。

   优点: 1非常稳定,极低概率出现意外

    2不会有任何性能的损耗

    3适配范围可自由控制,不会影响其他三方库

   缺点 :就是多个dimens文件可能导致apk变大,几百k。

   附件: 生成sw文件的工具

   实现原理 修改系统的density值 (核心)

  今日头条适配是以设计图的宽或高进行适配的,适配最终是改变系统density实现的。

   过程:

  AndroidAutoSize 是基于今日头条适配方案,该开源库已经很大程度上解决了今日头条适配方案的两个缺点,可以对activity,fragment进行取消适配。也是目前我的项目中所使用的适配方案。

使用也非常简单只需两步:

(1)引入:

(2)在 AndroidManifest 中填写全局设计图尺寸 (单位 dp),如果使用副单位,则可以直接填写像素尺寸,不需要再将像素转化为 dp,详情请查看 demo-subunits

以上就是关于Android手机js获取屏幕尺寸不准,导致计算的问题全部的内容,包括:Android手机js获取屏幕尺寸不准,导致计算的问题、Android-屏幕适配全攻略(绝对详细)(一)、android 怎么获取当前使用的屏幕分辨率等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存