开发之关于,修改launcher行数和列数的方法

android 修改launcher行数和列数

引言

一入 Android 深似海,相信很多 Android 开发者深有体会,Android
系统版本的碎片化,Android 硬件设备的多样性,第三方 Rom
的不确定因素。现在想开发一个合格的商业化 App
真的不容易,先不说别的,应用的兼容性就是一项技术和耐心的双重考验,想完美适配各种情况可以说是不可能的,往往都是在人力和适配率之间寻找平衡,今天要说的
drawable 就是需要适配的一个重要角色。

Launcher3桌面的行数和列数都是在InvariantDeviceProfile.java和DeviceProfile.java中动态计算的,xml中无法配置。

配置限定符

对于不同的屏幕密度、不同的设备方向,不同的语言和区域,都会涉及到备选
drawable 资源,在运行时,Android
会检测当前设备配置并根据具体规则(后面会提到)为应用加载合适的资源。下面是可以使用的配置限定符详细可以参考这里,需要说明的是这些配置限定符不仅对
drawable 有效,对其他资源类型(如:layout 等)也有效

  • 移动国家代码 (MCC):mcc310, mcc310-mnc004, mcc208-mnc00
  • 语言和区域:en, fr, en-rUS 等等
  • 布局方向:ldrtl(从右到左)ldltr(从左到右)
  • smallestWidth:sw<N>dp 如:sw320dp, sw600dp, sw720dp
    等等,屏幕可用高度和宽度的最小尺寸,屏幕的“最小可能尺寸”。
  • 可用宽度:w<N>dp 如:w720dp, w1024dp
    等等,指定资源应该使用的最小可用屏幕宽度,以 dp 为单位,由 <N>
    值定义。在横向和纵向之间切换时,为了匹配当前实际宽度,此配置值也会随之发生变化。
  • 可用高度:h<N>dp 如:h720dp, h1024dp
    等等,指定资源应该使用的最小可用屏幕高度,以dp为单位,由 <N>
    值定义。
    在横向和纵向之间切换时,为了匹配当前实际高度,此配置值也会随之发生变化。
  • 屏幕尺寸:small, normal, large, xlarge
  • 屏幕纵横比:long 宽屏,如 WQVGAWVGAFWVGAnotlong
    非宽屏,如 QVGAHVGAVGA
  • 屏幕方向:port 设备处于纵向(垂直),land 设备处于横向(水平)
  • UI 模式:car, desk, television, appliance, watch
  • 夜间模式:night 夜间,nontight 白天
  • 屏幕像素密度:ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi,
    nodpi, tvdpi
  • 触摸屏类型:notouch, finger
  • 键盘可用性:keysexposed, keyshidden, keyssoft
  • 主要文本输入法:nokeys, qwerty, 12key
  • 导航键可用性:navexposed 导航键可供用户使用,navhidden
    导航键不可用
  • 主要非触摸导航方法:nonav, dpad, trackball, wheel
  • 平台版本(API 级别):v3, v4, v7 等等,如 v1 对应于 API
    级别 1,v4 对应于 API 级别 4

如果你认真研究下每个配置限定符,你就会体会到:想完美适配各种情况可以说是不可能的,其实我们平时最常用的也是基本必须要用的就是冠亚体育手机网站,屏幕像素密度,这里有必要详细的说一下该参数:

ldpi:低密度屏幕;约为 120dpi。
mdpi:中等密度(传统 HVGA)屏幕;约为 160dpi。
hdpi:高密度屏幕;约为 240dpi。
xhdpi:超高密度屏幕;约为 320dpi。API 级别 8 中新增配置
xxhdpi:超超高密度屏幕;约为 480dpi。API 级别 16 中新增配置
xxxhdpi:超超超高密度屏幕使用(仅限启动器图标,请参阅“支持多个屏幕”中的注释);约为
640dpi。 API 级别 18 中新增配置
nodpi:它可用于您不希望缩放以匹配设备密度的位图资源。
tvdpi:密度介于 mdpi 和 hdpi 之间的屏幕;约为
213dpi。它并不是“主要”密度组,
主要用于电视,而大多数应用都不需要它。对于大多数应用而言,提供 mdpi 和
hdpi 资源便已足够,系统将根据需要对其进行缩放。API 级别 13
中引入了此限定符。
六个主要密度之间的缩放比为 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9×9
(ldpi) 位图相当于 12×12 (mdpi)、18×18 (hdpi)、24×24 (xhdpi)
位图,依此类推。

Note:L版本无InvariantDeviceProfile.java,是DynamicGrid.java,但是计算方法都是一样的。

限定符命名规则

  • 可以为单组资源指定多个限定符,并使用短划线分隔。例如,drawable-en-rUS-land
    适用于横排美国英语设备。
  • 这些限定符必须遵循上面列出的顺序,所以上面的列表是有顺序的。例如:错误:drawable-hdpi-port/,正确:drawable-port-hdpi/
  • 不能嵌套备用资源目录。例如,您不能拥有 res/drawable/drawable-en/
  • 值不区分大小写。在处理之前,资源编译器会将目录名称转换为小写,以避免不区分大小写的文件系统出现问题。
    名称中使用的任何大写字母只是为了便于认读。
  • 对于每种限定符类型,仅支持一个值。例如,若要对西班牙语和法语使用相同的
    drawable 文件,则您肯定不能拥有名为 drawable-rES-rFR/
    的目录,而是需要两个包含相应文件的资源目录。

InvariantDeviceProfile中用InvariantDeviceProfile来配置各种屏幕的手机桌面。如下:

Android 匹配最佳 drawable 规则

如果你只使用一个配置限定符,那么很好匹配,找到符合该配置的 drawable
即可,但当你同时使用多个配置限定符,且同时存在多个 drawable
目录时,匹配最佳 drawable 就没那么简单了,这里以 Android Developer
官方的例子说明,例如:现在你的应用包含如下目录:

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

同时,假设目标设备的配置如下:

区域设置 = en-GB 
屏幕方向 = port 
屏幕像素密度 = hdpi 
触摸屏类型 = notouch 
主要文本输入法 = 12key

具体的匹配过程如下:

  1. 淘汰与设备配置冲突的资源文件:其中 drawable-fr-rCA/ 目录与 en-GB
    区域设置冲突,因而被淘汰(但有个例外,屏幕像素密度是唯一一个未因冲突而被淘汰的限定符,尽管设备的屏幕密度为
    hdpi,但是 drawable-port-ldpi/
    未被淘汰,因为此时每个屏幕密度均视为匹配)
  2. 选择在上面限定符列表中优先级最高的限定符,先从 MCC
    开始,然后下移,看是否有资源目录包括此限定符,若无则看下一个限定符,在该示例中,除非达到语言限定符,否则答案始终为“否”。
  3. 若有,则淘汰不含此限定符的资源目录。在该示例中,系统会淘汰所有不含语言限定符的目录。所以到这一步符合要求的
    drawable 还剩:

drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
  1. 选择下一个优先级的限定符,重复执行步骤 2, 3,
    4。直到只剩下一个目录,该例中应该是 port, 所以淘汰后只剩:

drawable-en-port/

有两点需要说明一下:

  1. 屏幕像素密度是唯一一个未因冲突而被淘汰的限定符,如果涉及的限定符是屏幕像素密度,则
    Android 会选择最接近设备屏幕密度的选项。通常 Android
    倾向于缩小大型原始图像,而不是放大小型原始图像。
  2. 如果一个符合限定符的 drawable 都没有怎么办?还能怎么办,崩溃呗!

InvariantDeviceProfile的各个参数依次代表:

drawable 和 mipmap 的区别和联系

现在通过 Android Studio 创建工程,默认会创建一系列 mipmap
文件夹,而不是以前的 drawable 文件夹。那么 mipmapdrawable
到底是什么关系?mipmap 取代了 drawable 了吗?先看一下官方说明:

drawable/
For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML
files that describe Drawable shapes or Drawable objects that contain
multiple states (normal, pressed, or focused). See the Drawable
resource type.
mipmap/
For app launcher icons. The Android system retains the resources in
this folder (and density-specific folders such as mipmap-xxxhdpi)
regardless of the screen resolution of the device where your app is
installed. This behavior allows launcher apps to pick the best
resolution icon for your app to display on the home screen. For more
information about using the mipmap folders, see Managing Launcher
Icons as mipmap Resources.

这里先说结论:mipmap 文件夹下,仅仅建议放启动图标 (app launcher
icons),也就是应用安装后,会显示在桌面的那个图标,而其他的图片资源等,还是按照以前方式,放在
drawable 文件夹下。

那么为什么要把 Launcher Icon 放在mipmap 文件夹下?
下面英文是官方解释:

Different home screen launcher apps on different devices show app
launcher icons at various resolutions. When app resource optimization
techniques remove resources for unused screen densities, launcher
icons can wind up looking fuzzy because the launcher app has to
upscale a lower-resolution icon for display. To avoid these display
issues, apps should use the mipmap/ resource folders for launcher
icons. The Android system preserves these resources regardless of
density stripping, and ensures that launcher apps can pick icons with
the best resolution for display.
Make sure launcher apps show a high-resolution icon for your app by
moving all densities of your launcher icons to density-specific
res/mipmap/ folders (for example res/mipmap-mdpi/ and
res/mipmap-xxxhdpi/). The mipmap/ folders replace the drawable/
folders for launcher icons. For xxhpdi launcher icons, be sure to add
the higher resolution xxxhdpi versions of the icons to enhance the
visual experience of the icons on higher resolution devices.

这里是我的理解:很多不同的 Launcher App 采用的 Launcher Icon
的大小不一致,而在应用安装时 Android 资源优化会把 drawable
文件夹下不需要的分辨率资源删除掉,例如在 xhdpi 的设备上将
drawable-xxhdpi 下的资源删掉,当然里面的 Launcher Icon
也会被删掉,这时如果 Launcher App 采用的 Launcher Icon
大小偏大,而高分辨 xxhdpi 下的 Icon 又被删掉了,就只能把 xhdpi
下的小尺寸 Icon 进行放大显示了,这样就会造成 Launcher Icon
显示模糊。为了避免上面的问题,就引入了 mipmap,Android 会保证 mipmap
下的资源不会因为资源优化而被删除,确保大尺寸的 Launcher Icon
可以找到更合适分辨率的 Icon。所以 mipmap 是为 Launcher Icon
而生的,而其它的图片资源还是放在 drawable 文件夹下,这样有助于Android
资源优化删除无用的资源,减少应用体积。

配置名字(任意定义)、最小宽度(单位是dp)、最小高度(单位是dp)、桌面行数、桌面列数、文件夹行数、文件夹列数、主菜单中predicted
apps最小列数、桌面Icon的size(单位是dp)、桌面Icon的文字size(单位是dp)、Hotseat的Icon个数、Hotseat的Icon的size(单位是dp)、默认的桌面配置LayoutId。

PS:

如何由手机分辨率计算最小宽度、最小高度?

例如:手机分辨率为720*1280,DPI=320。

竖屏时:X*Y=720*1230(1230=屏幕高度-状态栏高度-NavigationBar高度)

横屏时:Y*X=646*1280(646=屏幕宽度-状态栏高度-NavigationBar高度)

最小宽度为:323=Min(720,646)/(320/160)

最小高度为:615=Min(1230,1280)/(320/160)

如果要配置自己手机桌面的行数、列数、Hotseat的Icon个数,需要计算”桌面Icon的size、桌面Icon的文字size、Hotseat的Icon的size”,计算方式如下:

1、挑选三个和自己的手机配置最接近的DeviceProfile。最接近意味着dn 最小。

dn 的计算公式为:

冠亚体育手机网站 1

 2、由逆距离加权插值计算结果,计算公式如下:

冠亚体育手机网站 2

计算结果为: 

r1+r2+r3

例如:手机的最小宽度为294dp,最小高度为544dp。

1、挑选三个和自己的手机配置最接近的DeviceProfile:

▪Nexus S,distance is 52

▪Nexus 4,distance is 69

▪Stubby,distance is 102

2、由逆距离权重差值计算结果:

冠亚体育手机网站 3

Hotseat的Icon的size为:37.57+10.65+1.29 = 49dp

dp转换为px:如果手机DPI=240,那么dp应该乘以1.5(240/160)转换为px,即49dp=73.5px。

桌面Icon的size、桌面Icon的文字size 计算与此类似。

总结

以上所述是小编给大家介绍的android
修改launcher行数和列数的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

  • Android7.0开发实现Launcher3去掉应用抽屉的方法详解
  • Android开发实现Launcher3应用列表修改透明背景的方法
  • Android开发中Launcher3常见默认配置修改方法总结
  • Android
    launcher中模拟按home键的实现
  • Android6.0
    Launcher2应用解析
  • Android的Launcher启动器中添加快捷方式及小部件实例
  • Android实现向Launcher添加快捷方式的方法

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注