第九章 多语言环境的支持和多屏幕的适配(2)

9.3多屏幕的适配

9.3.1屏幕参数的基本概念

Android手机屏幕大小不一,有480x320640x360800x480等等,还包括不同屏幕密度,怎样才能让应用程序自动适应不同的屏幕呢?

首先我们来了解几个基本概念:

1)屏幕尺寸Screensize

即显示屏幕的实际大小,按照屏幕的对角线进行测量。

为简单起见,Android把所有的屏幕大小分为四种尺寸:小、普通、大、超大(分别对应:smallnormallargeextralarge)。

应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局,平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序是透明的。

2)屏幕长宽比Aspectratio

长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。

3)屏幕分辨率Resolution

在屏幕上显示的物理像素总和。需要注意的是:尽管分辨率通常用宽*高表示,但分辨率并不意味着具体的屏幕长宽比。在Andorid系统中,应用程序不直接使用分辨率。

4)密度Density

根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。

在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。

屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在低密度的显示屏上显得很大,而在高密度显示屏上看起来就很小。

5)设备独立像素Density-independentpixel dpsp

应用程序可以用来定义UI组件的虚拟像素单元,通过密度无关的方式来描述布局尺寸和位置。

一个设备独立像素相当于一个160dpi屏幕上的物理像素。

在程序运行时,系统会根据屏幕的实际密度,自动处理任何需要缩放的控件,设备独立像素转换成屏幕实际像素的换算很简单:pixels= dpi * density/ 160)。

例如在240dpi的屏幕上,1个设备独立像素等于1.5物理像素。为确保UI组件在不同的屏幕都能合适的展示,强烈建议像素单位都使用dpi,文本单位使用sp来定义你的应用程序UI

9.3.2屏幕参数的各种单位及相互转换

前面我们介绍了屏幕参数的基本概念。在开发中,我们可以参考SDK会发现Android设备有各种单位的密度和尺寸等。

先看下面的一段获取屏幕信息的示例代码。

DisplayMetricsmetrics = new DisplayMetrics();

Displaydisplay = activity.getWindowManager().getDefaultDisplay();

display.getMetrics(metrics);

metrics.density;//显示的逻辑分辨率,160dpi==1240dpi==1.5(高分辨率)

metrics.heightPixels;//屏幕绝对高度

metrics.widthPixels;//屏幕绝对宽度

metrics.densityDpi;//表示1英寸里有多少个px

metrics.xdp;//宽度上1英寸里有多少个px

metrics.ydpi;//高度上实际物理像素


从上述代码中,我们可以看到了像素、密度等单位,下面我们来说明下它们的意义。

px:是屏幕的像素点。

in1英寸=25.4毫米(cm)。

mm:毫米。

pt1=1/72英寸。

dp:一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px

dip:等同于dp

sp:同dp相似,但还会根据用户的字体大小偏好来缩放。

Dpi:值表示1英寸里有多少个px

下面给出一个方法,来对它们之间进行转换。

publicfloat applyDimension(int unitfloatvalueDisplayMetricsmetrics)

{

floatret = 0f;

switch(unit) {

caseTypedValue.COMPLEX_UNIT_PX:// 像素

ret= value;

break;

caseTypedValue.COMPLEX_UNIT_DIP://像素转成dip

ret= value * metrics.density;

break;

caseTypedValue.COMPLEX_UNIT9_SP://像素转成文本的单位

ret= value * metrics.scaledDensity;

break;

caseTypedValue.COMPLEX_UNIT_PT://像素转成磅

ret= value * metrics.xdpi * (1.0f/72);

break;

caseTypedValue.COMPLEX_UNIT_IN://像素转成英寸

ret= value * metrics.xdpi;

break;

caseTypedValue.COMPLEX_UNIT_MM://像素转成毫米

ret= value * metrics.xdpi * (1.0f/25.4f);

break;

}

returnret;

}

9.3.3处理屏幕自适应的方法

Android会对资源包下的图片进行合理的缩放。例如:一张240x240高密度图片,显示在中密度的屏幕上,图片大小自动变为160x160。一般我们会对于需要自适应的图片放在不同的文件下,如:

drawable-ldpi存放低分辨率的图片,如QVGA240x320

drawable-mdpi存放中等分辨率的图片,如HVGA320x480

drawable-hdpi高分辨率的图片,如WVGA480x800),FWVGA480x854

如果你不想系统自动帮你缩放图片,可以建立一个res/drawable-nodpi文件夹,存放你的图片。如果你只在drawable文件夹下存放了图片,那么在高分辨率的屏幕手机中,图片的宽和高将会被放大1.5倍。

下面是Android提供3种方式处理屏幕自适应方法:

1)预缩放的资源(基于尺寸和密度去寻找图片)

  • 如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。

  • 如果没法找到相应的尺寸,而找到密度,则认为该图片尺寸为“medium”,利用缩放这个图片显示。

  • 如果都无法匹配,则使用默认图片进行缩放显示。默认图片标配“medium”160)。

2)自动缩放的像素尺寸和坐标(密度兼容)

  • 如果应用程序不支持不同密度Android:anyDensity="false",系统自动缩放图片尺寸和这个图片的坐标。

  • 对于预缩放的资源,当Android:anyDensity="false",也不生效。

  • Android:anyDensity="false",只对密度兼容起作用,尺寸兼容没效果。

3)兼容模式显示在大屏幕,尺寸(尺寸兼容)

  • 对于你在<supports-screens>声明不支持的大屏幕,而这个屏幕尺寸是normal的话,系统使用尺寸为("normal")和密度为("medium)显示。

  • 对于你在<supports-screens>声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统同样使用尺寸为("normal")和密度为("medium)显示。


经验分享:

Android多屏幕机制是在Android1.6或以上SDK的版本中是默认设置,也就是说在配置文件AndroidManifest.xml中如果设置<uses-sdkAndroid:minSdkVersion="4"/>才对多屏幕有效,如果不设置,那么默认的话是不支持的。

或者,你也可以在AndroidManifest.xml中添加以下代码,效果也是等同的。

<supports-screens

Android:largeScreens="true" // 是否支持大屏

Android:normalScreens="true" // 是否支持中屏

Android:smallScreens="true" // 是否支持小屏

Android:anyDensity="true" // 是否支持多种不同密度

/>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于uniapp的多屏幕适配,根据提供的引用内容,可以采用以下方法进行适配: 1. 根据引用提到的情况,如果多window方案对于复杂的界面不适用,可以考虑自己实现响应式布局。根据引用中提到的需要适配不同屏幕尺寸,可以使用bootstrap响应式布局作为思路。在uniapp中,可以通过使用动态类名和vuex来管理屏幕尺寸,以快速解决不同屏幕下的样式问题。这样可以快速适配不同屏幕尺寸,满足公司的业务需求。 2. 另外,也可以考虑使用媒体查询来实现响应式布局。虽然uniapp本身无法使用媒体查询,但可以通过在项目中引入第三方的CSS预处理器,如less或sass,来使用媒体查询。通过编写不同屏幕尺寸下的样式代码,可以实现多屏幕适配的效果。 总之,对于uniapp的多屏幕适配,可以考虑自己实现响应式布局,使用动态类名和vuex管理屏幕尺寸,或者使用第三方CSS预处理器来实现媒体查询。这样可以快速适配不同屏幕尺寸,满足公司的业务需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [UNIAPP 宽屏适配 响应式](https://blog.csdn.net/qq_43129072/article/details/130936969)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值