导航:首页 > 操作系统 > android资源适配

android资源适配

发布时间:2022-12-30 06:37:24

‘壹’ android-屏幕适配全攻略(绝对详细)(一)

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

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

从上图可以看出,主流的分辨率是前六种:1280×720、1920×1080、800×480、854×480、960×540、1184×720,不过我们有解决方案。看完这篇文章,想必你就可以解决常见的屏幕适配问题。

接下来正式进入正题。

介绍几个在Android屏幕适配上非常重要的名词:

屏幕尺寸 是指屏幕对角线的长度。单位是英寸,1英寸=2.54厘米
屏幕分辨率 是指在横纵向上的像素点数,单位是px,1px=1像素点,一般是纵向像素横向像素,如1280×720
屏幕像素密度 是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度和屏幕尺寸和屏幕分辨率有关

dip: Density Independent Pixels(密度无关像素)的缩写。以 160dpi 为基准,1dp=1px
dp: dip
dpi: 屏幕像素密度的单位,“dot per inch”的缩写

px: 像素,物理上的绝对单位

sp: Scale-Independent Pixels的缩写,可以根据文字大小首选项自动进行缩放。Google推荐我们使用12sp以上的大小,通常可以使用12sp,14sp,18sp,22sp,最好不要使用奇数和小数。

用于区分不同的像素密度。

在Google官方开发文档中,说明了 ** mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 ** 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。

我们可以通过以下几种方式来支持各种屏幕尺寸:

wrap_content: 根据控件的内容设置控件的尺寸
math_parent: 根据父控件的尺寸大小设置控件的尺寸
weight: 权重,在线性布局中可以使用weight属性设置控件所占的比例

例如,我们要实现下图所显示的效果:当屏幕尺寸改变时,new reader控件两边的控件大小不变,new reader控件会占完剩余的空间。

具体布局文件如下:

小插曲: 关于 android:layout_weight 属性

一般情况,我们都是设置要进行比例分配的方向的宽度为0dp,然后再用权重进行分配。如下:

效果为:

效果为:

button1宽度=L+(L-2L)×1/3=2/3L
button2宽度=L+(L-2L)×2/3=1/3L

当然,还有其他的方式,都可以运用此公式进行计算。
在实际开发中,我们一般使用0dp的方式,而不使用其他方式。

简单的布局一般都使用 线性布局 ,而略微复杂点的布局,我们使用 相对布局 ,大多数时候,我们都是使用这两种布局的嵌套。

我们使用 相对布局 的原因是, 相对布局 能在各种尺寸的屏幕上保持控件间的相对位置。

res/layout/main.xml 单面板:

res/layout-large/main.xml 双面板:

如果这个程序运行在屏幕尺寸大于7inch的设备上,系统就会加载 res/layout-large/main.xml 而不是 res/layout/main.xml ,在小于7inch的设备上就会加载 res/layout/main.xml 。

需要注意的是,这种通过 large 限定符分辨屏幕尺寸的方法,适用于android3.2之前。在android3.2之后,为了更精确地分辨屏幕尺寸大小,Google推出了最小宽度限定符。

res/layout-sw600dp/main.xml ,双面板布局: Small Width 最小宽度

这种方式是不区分屏幕方向的。这种最小宽度限定符适用于android3.2之后,所以如果要适配android全部的版本,就要使用 large 限定符和 sw600dp 文件同时存在于项目 res 目录下。

这就要求我们维护两个相同功能的文件。为了避免繁琐操作,我们就要使用布局别名。

由于后两个文具文件一样,我们可以用以下两个文件代替上面三个布局文件:

res/layout/main.xml 单面板布局
res/layout/main_twopanes.xml 双面板布局

然后在 res 下建立
res/values/layout.xml 、
res/values-large/layout.xml 、
res/values-sw600dp/layout.xml 三个文件。

默认布局
res/values/layout.xml :

Android3.2之前的平板布局
res/values-large/layout.xml :

Android3.2之后的平板布局
res/values-sw600dp/layout.xml :

这样就有了 main 为别名的布局。
在activity中 setContentView(R.layout.main);

这样,程序在运行时,就会检测手机的屏幕大小,如果是平板设备就会加载 res/layout/main_twopanes.xml ,如果是手机设备,就会加载 res/layout/main.xml 。我们就解决了只使用一个布局文件来适配android3.2前后的所有平板设备。

如果我们要求给横屏、竖屏显示的布局不一样。就可以使用 屏幕方向限定符 来实现。
例如,要在平板上实现横竖屏显示不用的布局,可以用以下方式实现。
res/values-sw600dp-land/layouts.xml :横屏

res/values-sw600dp-port/layouts.xml :竖屏

自动拉伸位图,即android下特有的 .9.png 图片格式。

当我们需要使图片在拉伸后还能保持一定的显示效果,比如,不能使图片中的重要像素拉伸,不能使内容区域受到拉伸的影响,我们就可以使用 .9.png 图来实现。

要使用 .9.png ,必须先得创建 .9.png 图片,androidSDK给我们提供了的工具就包含 .9.png 文件的创建和修改工具。双击 SDK安装目录 oolsdraw9patch.bat ,就会打开下图所示的窗口。

下面是一个例子:

Button属性设置:

如果我们选择的内容区域偏差太大,可能就不会显示出text值 BUTTON 。

好了,这篇文章写的有点多了,剩下的内容放在 下篇文章 记录吧。
内容提要:
解决方案-支持各种屏幕密度
解决方案-实施自适应用户界面流程

未完待续

‘贰’ Android兼容性适配(一)—— 设备兼容性概览

Android 适用于众多类型的设备,从手机到平板电脑和电视都能搭载使用。作为开发者,如此广泛的设备类型能为您的应用带来广大的潜在受众群体。为了能在所有这些设备上顺利运行,应用应该容许部分设备功能的变化,并提供可适应不同屏幕配置的灵活界面。

随着您进一步阅读 Android 开发相关内容,您可能会在各种语境下遇到“兼容性”一词。兼容性有两种类型:设备兼容性和应用兼容性。

作为应用开发者,您无需担心设备是否兼容 Android,因为只有与 Android 兼容的设备才会附带 Google Play 商店或该设备的官方手机应用市场。因此,您可以放心,通过Google Play 商店和官方手机应用市场安装您的应用的用户使用的是 Android 兼容设备。

不过,您确实需要考虑您的应用是否兼容每一种可能的设备配置。由于 Android 以各种设备配置运行,因此部分功能并不适用于所有设备。例如,某些设备可能未配备罗盘传感器。如果应用的核心功能需要使用罗盘传感器,那么应用只能与带有罗盘传感器的设备兼容。

应用可通过平台 API 利用 Android 支持的各种功能。有些功能基于硬件(例如罗盘传感器),有些功能基于软件(如应用窗口微件),有些功能则依赖于平台版本。并非每台设备都支持所有功能,因此您可能需要根据应用所需的功能控制应用在设备上的可用性。

要尽可能扩大应用的用户群,您应设法使用单个 APK 支持尽可能多的设备配置。在大多数情况下,要实现这一目标,您可以在运行时停用可选功能,并为应用资源提供针对不同配置的替代选项(例如针对不同屏幕尺寸的不同布局)。不过,如果需要,您可以根据以下设备特征,通过 Google Play 商店限制应用在设备上的可用性:

为了让您根据设备功能管理应用的可用性,Android 为可能并不适用于所有设备的任何硬件或软件功能定义了功能 ID。例如,罗盘传感器的功能 ID 为 FEATURE_SENSOR_COMPASS,而应用微件的功能 ID 为 FEATURE_APP_WIDGETS。

根据需要,要在用户的设备不具备特定功能时阻止用户安装您的应用,您可以通过应用清单文件中的<uses-feature>元素声明这一点。

例如,如果您的应用在没有罗盘传感器的设备上没有意义,您可以使用以下清单标记声明需要罗盘传感器:

Google Play 商店会将您的应用所需的功能与每个用户的设备上可用的功能进行比较,以确定您的应用是否与每台设备兼容。如果设备不具备您的应用所需的所有功能,则用户无法安装您的应用。

但是,如果应用的主要功能不需要某项设备功能,则应将required属性设置为 "false"并在运行时检查是否有该设备功能。如果应用功能在当前设备上不可用,请适当降级相应的应用功能。例如,您可以通过调用hasSystemFeature()来查询功能是否可用,如下所示:

Java

Kotlin

不同的设备可能会运行不同版本的 Android 平台,例如 Android 4.0 或 Android 4.4。每个后续的平台版本通常会添加之前版本中不可用的新 API。为表明可用的 API 集,每个平台版本都会指定API 级别。例如,Android 1.0 是 API 级别 1,而 Android 4.4 是 API 级别 19。

通过 API 级别,您可以使用<uses-sdk>清单标记及其minSdkVersion属性来声明应用兼容的最低版本。例如,Android 4.0(API 级别 14)中添加了 日历提供程序 API。如果您的应用在没有这些 API 的情况下无法运行,您应将 API 级别 14 声明为应用的最低支持版本。

minSdkVersion属性声明应用兼容的最低版本,targetSdkVersion属性声明应用经过优化后适用的最高版本。

不过,请注意<uses-sdk>元素中的属性会被替换为build.gradle文件中的相应属性。因此,如果您使用的是 Android Studio,则必须在其中指定minSdkVersion和targetSdkVersion值:

要详细了解build.gradle文件,请参阅 如何配置编译版本 。

每个后续版本的 Android 都为使用之前平台版本的 API 构建的应用提供兼容性,因此您的应用应始终与未来版本的 Android 兼容,同时使用已记录的 Android API。

注意 : targetSdkVersion 属性不会阻止您的应用安装在高于指定值的平台版本上,但它很重要,因为它向系统指示您的应用是否应继承较新版本中的行为更改。如果您不将 targetSdkVersion 更新到最新版本,则系统会认为您的应用在最新版本上运行时需要一些向后兼容性行为。例如,在 Android 4.4 中的行为更改 中,使用 AlarmManager API 创建的闹钟现在默认不精确,因此系统可以批量处理应用闹钟并节省系统电量,但如果您的目标 API 级别低于“19”,则系统会为您的应用保留之前的 API 行为。

不过,如果您的应用使用的是较新平台版本中添加的 API,但其主要功能并不需要这些 API,则应在运行时检查 API 级别,并在 API 级别过低时适当降级相应的功能。在这种情况下,请将 minSdkVersion 尽量设置为适用于应用主要功能的最低值,然后将当前系统的版本 SDK_INT 与 Build.VERSION_CODES 中对应于您要检查的 API 级别的一个代号常量进行比较。例如:

Android 可在各种尺寸的设备上运行,包括手机、平板电脑和电视。为了按照屏幕类型对设备进行分类,Android 为每种设备定义了两个特征:屏幕尺寸(屏幕的物理尺寸)和屏幕密度(屏幕上像素的物理密度,称为 DPI)。为了简化不同的配置,Android 将这些变体归纳成组,使它们更容易作为定位目标:

四种广义的尺寸:小、标准、大和特大。
还有几种广义的密度:mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)等。
默认情况下,您的应用会兼容所有屏幕尺寸和密度,因为系统会根据需要对各个屏幕的界面布局和图片资源进行相应的调整。不过,您应针对不同的屏幕尺寸添加专门的布局,针对常见的屏幕密度添加优化的位图图片,以优化每种屏幕配置的用户体验。

‘叁’ Android 屏幕适配

1: dp: android 尺寸的基本单位。 在不同的分辨率的手机里面,1dp对应着不同数量的px, 这样就实现了dp定义一个控件大小的时候,在不同分辨率手机里表现出相应大小的像素值。
2: 屏幕分辨率: 1080下160, 表示宽度有1080个像素点而高度有2160个像素点。常见的分辨率有320x480, 480x800, 720x1280, 1080x1920等。
3: 屏幕尺寸: 以寸为单位, Android设备对角线的长度
4: 像素密度: 每英寸的像素点
5: 屏幕尺寸, 分辨率,像素密度 三者之间的关系:
密度(dpi)= √(宽2 + 高2)/屏幕尺寸

6: px:像素,是屏幕上显示数据的最基本的点
7: dpi:屏幕像素密度,每英寸上的像素点数
8: sp:与dp类似,通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。

1: dp适配方案: Android自带的原始的适配方案, 在不同的分辨率手机里面表现出相应大小的像素点。
缺点: Android的碎片化严重, 如果生产厂家没有根据屏幕尺寸、分辨率和像素密度的关系来规则定义, 或者出一些乱七八糟的屏幕大小,这样的适配方案就不在适合了。

2: 宽高限定符:枚举所有的屏幕宽高像素值,根据等比缩放去适配。如果没有找到对应的屏幕, 则取默认的。 目前这种方案已经被弃用。

缺点:
1: 占用资源大,会增加APK的体积。
2: 容错机制大需要精准命中资源文件才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形。

3:AndroidAutoLayout适配方案(停止维护)

4: SW限定符适配方案:(smallestWidth最小宽度适配)
Android 会去识别屏幕可用高度或者宽度的最小尺寸的dp值。然后根据识别到的结果去对应的资源文件里面去找寻相应的结果。
如何生成:ScreenMatch插件

此方案跟宽高限定的适配方案相比,有很好的容错机制, 如果没有找到对应的适配宽度, 那么会在vlues文件里面去找跟他最接近的宽度。

5:今日头条适配方案:
1>: px 转 dp 的公式 dp = px / density.不管我们设定的单位是什么, 最终我们都会将这些单位长度转化为px的。density就是他们的转化比, 所以,动态改变这个转化比也是可以达到我们适配屏幕的目的的。
2>: 通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值(在清单文件中定义),这样就解决了所有的适配问题。
3>: Density = 当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) ;
4>:引入了AndroidAutoSize屏幕适配框架:
https://github.com/JessYanCoding/AndroidAutoSize

最后, 最重要的................
点赞 点赞 点赞, 不重要的事情也就说3遍......

‘肆’ Android 屏幕适配

摘自: https://www.jianshu.com/p/ec5a1a30694b
摘自: https://www.jianshu.com/p/337c47721690
摘自: https://www.jianshu.com/p/4669814362ee

因为ui设计师给你的设计图是以px为单位的,Android开发则是使用dp作为单位的,那么我们需要进行转换:

扩展:
Android屏幕适配-基础篇

   Android推荐使用dp作为尺寸单位来适配UI ,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。
   缺点:
  (1)这种方案只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,但dpi的不同,还是会存在差异。
  (2)一般的设计稿都是以px为单位的,所以我们在写layout文件的时候需要将px转为dp,影响开发效率。

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

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

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

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

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

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

   优点:
    1.非常稳定,极低概率出现意外
    2.不会有任何性能的损耗
    3.适配范围可自由控制,不会影响其他三方库
   缺点:
    就是多个dimens文件可能导致apk变大,几百k。

    这里有个问题:
    在项目的其他 mole 中怎么实现适配?难道也要多套 dimens 文件?

    解答:
    并不需要多套 dimens 文件,只需要在 values 文件夹下有一套与 app mole 一样的 dimens 文件即可达到适配。因为经过编译,所有 mole 中的 dimen 数据都会统一归类到主 mole(即 app mole)中的 values/dimens.xml 文件中了,然后系统又会根据你设置的值去找对应 values-swxxxdp 文件夹下的dimens.xml 文件中的值。

附件: [生成sw文件的工具]( https://links.jianshu.com/go ?

to=https%3A%2F%2Fgithub.com%2Fladingwu%2Fdimens_sw)

实现原理:修改系统的density值(核心)
  今日头条适配是以设计图的宽或高进行适配的,适配最终是改变系统density实现的。
过程:

缺点:
   1.只需要修改一次 density,项目中的所有地方都会自动适配,这个看似解放了双手,减少了很多操作,但是实际上反应了一个缺点,那就是只能一刀切的将整个项目进行适配,但适配范围是不可控的。
   2.这个方案依赖于设计图尺寸,但是项目中的系统控件、三方库控件、等非我们项目自身设计的控件,它们的设计图尺寸并不会和我们项目自身的设

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

   使用也非常简单只需两步:
     第一步: 导入依赖

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

老师给的UI设计是在蓝湖上的,因为还没工作,接触就蓝湖,SW个人感觉好处就是蓝湖上尺寸多少你就写多少就行

阅读全文

与android资源适配相关的资料

热点内容
addto新建文件夹什么意思 浏览:158
有服务器地址怎么安装软件 浏览:659
安卓如何完全清除数据 浏览:690
安卓安卓证书怎么信任 浏览:53
服务器被攻击如何解决 浏览:221
学霸变成程序员 浏览:881
c语言编译错误fatalerror 浏览:441
ipv4内部服务器地址怎么分配 浏览:463
java线程安全的方法 浏览:950
重复命令画梯形 浏览:164
在疫情就是命令 浏览:328
自己搭建一个什么服务器好玩 浏览:253
java基础马士兵 浏览:823
完美世界手游如何查看服务器 浏览:859
光遇安卓与ios什么时候互通 浏览:598
js如何运行时编译 浏览:917
引力app在哪里下载 浏览:609
编写app如何得到钱 浏览:801
吉利汽车软件放哪个文件夹安装 浏览:224
多文件编译c 浏览:543