zoukankan      html  css  js  c++  java
  • Android复习(二)应用资源

    1. res下的资源类型

    目录资源类型
    animator/ 用于定义属性动画的 XML 文件。
    anim/ 用于定义渐变动画的 XML 文件。(属性动画也可保存在此目录中,但为了区分这两种类型,属性动画首选 animator/ 目录。)
    color/ 用于定义颜色状态列表的 XML 文件。请参阅颜色状态列表资源
    drawable/

    位图文件(.png.9.png.jpg.gif)或编译为以下可绘制对象资源子类型的 XML 文件:

    • 位图文件
    • 九宫格(可调整大小的位图)
    • 状态列表
    • 形状
    • 动画可绘制对象
    • 其他可绘制对象

    请参阅 Drawable 资源

    mipmap/ 适用于不同启动器图标密度的可绘制对象文件。如需了解有关使用 mipmap/ 文件夹管理启动器图标的详细信息,请参阅管理项目概览
    layout/ 用于定义用户界面布局的 XML 文件。请参阅布局资源
    menu/ 用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。请参阅菜单资源
    raw/

    需以原始形式保存的任意文件。如要使用原始 InputStream 打开这些资源,请使用资源 ID(即 R.raw.filename)调用 Resources.openRawResource()

    但是,如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录(而非 res/raw/)下。assets/ 中的文件没有资源 ID,因此您只能使用 AssetManager 读取这些文件。

    values/

    包含字符串、整型数和颜色等简单值的 XML 文件。

    其他 res/ 子目录中的 XML 资源文件会根据 XML 文件名定义单个资源,而 values/ 目录中的文件可描述多个资源。对于此目录中的文件,<resources> 元素的每个子元素均会定义一个资源。例如,<string> 元素会创建 R.string 资源,<color> 元素会创建 R.color 资源。

    由于每个资源均使用自己的 XML 元素进行定义,因此您可以随意命名文件,并在某个文件中放入不同的资源类型。但是,您可能需要将独特的资源类型放在不同的文件中,使其一目了然。例如,对于可在此目录中创建的资源,下面给出了相应的文件名约定:

    请参阅字符串资源样式资源更多资源类型

    xml/ 可在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处。
    font/ 带有扩展名的字体文件(如 .ttf.otf 或 .ttc),或包含 <font-family> 元素的 XML 文件。如需详细了解作为资源的字体,请参阅 XML 中的字体

    注意:切勿将资源文件直接保存在 res/ 目录内,因为这样会造成编译错误。

     

    2.限定符

      命名规则 - <resources_name>-<config_qualifier>

     

     

    配置限定符值描述
    MCC 和 MNC 示例:
    mcc310
    mcc310-mnc004
    mcc208-mnc00
    等等

    移动设备国家代码 (MCC),(可选)后跟设备 SIM 卡中的移动设备网络代码 (MNC)。例如,mcc310 是指美国的任一运营商,mcc310-mnc004 是指美国的 Verizon 公司,mcc208-mnc00 是指法国的 Orange 公司。

    如果设备使用无线装置连接(GSM 手机),则 MCC 和 MNC 值均来自 SIM 卡。

    您也可以单独使用 MCC(例如,将国家/地区特定的合法资源加入应用)。如果只需根据语言指定,则改用语言和地区限定符(稍后进行介绍)。如果决定使用 MCC 和 MNC 限定符,请谨慎执行此操作并测试限定符是否按预期工作。

    另请参阅配置字段 mcc 和 mnc,二者分别表示当前的移动设备国家代码和移动设备网络代码。

    语言和区域 示例:
    en
    fr
    en-rUS
    fr-rFR
    fr-rCA
    b+en
    b+en+US
    b+es+419

    语言通过由两个字母组成的 ISO 639-1 语言代码进行定义,可以选择后跟两个字母组成的 ISO 3166-1-alpha-2 区域码(前缀用小写字母 r)。

    这些代码区分大小写;r 前缀用于区分区域码。您不能单独指定区域。

    Android 7.0(API 级别 24)引入对 BCP 47 语言标记的支持,可供您用来限定特定语言和区域的资源。语言标记由一个或多个子标记序列组成,每个子标记都能优化或缩小由整体标记标识的语言范围。如需了解有关语言标记的详细信息,请参阅用于标识语言的标记

    如要使用 BCP 47 语言标记,请将 b+ 和两个字母的 ISO 639-1 语言代码连接;其后还可选择使用其他子标记,用 + 分隔即可。

    如果用户在系统设置中更改语言,则语言标记可能会在应用的生命周期中发生变更。如需了解运行时应用会因此受到何种影响,请参阅处理运行时变更

    有关针对其他语言本地化应用的完整指南,请参阅本地化

    另请参阅 getLocales() 方法,了解该方法提供的已定义语言区域列表。此列表包含主要的语言区域。

    布局方向 ldrtl
    ldltr

    应用的布局方向。ldrtl 是指“布局方向从右到左”。ldltr 是指“布局方向从左到右”(默认的隐式值)。

    此配置适用于布局、可绘制资源或值等任何资源。

    例如,若要针对阿拉伯语提供某种特定布局,并针对任何其他“从右到左”的语言(如波斯语或希伯来语)提供某种通用布局,则可提供以下资源:

    res/
        layout/
            main.xml (Default layout)
        layout-ar/
            main.xml (Specific layout for Arabic)
        layout-ldrtl/
            main.xml (Any "right-to-left" language, except
                      for Arabic, because the "ar" language qualifier
                      has a higher precedence.)
    
     

    请注意:如要为应用启用从右到左的布局功能,则必须将 supportsRtl 设置为 "true",并将 targetSdkVersion 设置为 17 或更高版本。

    此项为 API 级别 17 中的新增配置。

    smallestWidth sw<N>dp

    示例:
    sw320dp
    sw600dp
    sw720dp
    等等

    屏幕的基本尺寸,由可用屏幕区域的最小尺寸指定。具体而言,设备的 smallestWidth 是屏幕可用高度和宽度的最小尺寸(您也可将其视为屏幕的“最小可能宽度”)。无论屏幕的当前方向如何,您均可使用此限定符确保应用界面的可用宽度至少为 <N> dp。

    例如,如果布局要求屏幕区域的最小尺寸始终至少为 600dp,则可使用此限定符创建布局资源 res/layout-sw600dp/。仅当可用屏幕的最小尺寸至少为 600dp(无论 600dp 表示的边是用户所认为的高度还是宽度)时,系统才会使用这些资源。最小宽度为设备的固定屏幕尺寸特征;即使屏幕方向发生变化,设备的最小宽度仍会保持不变。

    使用最小宽度确定一般屏幕尺寸非常有用,因为宽度通常是设计布局时的驱动因素。界面经常会垂直滚动,但对其水平方向所需要的最小空间具有非常硬性的限制。可用宽度也是确定是否对手持式设备使用单窗格布局,或对平板电脑使用多窗格布局的关键因素。因此,您可能最关注每台设备上的最小可能宽度。

    设备的最小宽度会将屏幕装饰元素和系统界面考虑在内。例如,如果设备屏幕上的某些永久性界面元素沿着最小宽度轴占据空间,则系统会声明最小宽度小于实际屏幕尺寸,因为这些屏幕像素不适用于您的界面。

    以下是一些可用于常见屏幕尺寸的值:

    • 320,适用于屏幕配置如下的设备:
      • 240x320 ldpi(QVGA 手机)
      • 320x480 mdpi(手机)
      • 480x800 hdpi(高密度手机)
    • 480,适用于 480x800 mdpi 之类的屏幕(平板电脑/手机)。
    • 600,适用于 600x1024 mdpi 之类的屏幕(7 英寸平板电脑)。
    • 720,适用于 720x1280 mdpi 之类的屏幕(10 英寸平板电脑)。

    当应用为多个资源目录提供不同的 smallestWidth 限定符值时,系统会使用最接近(但未超出)设备 smallestWidth 的值。

    此项为 API 级别 13 中的新增配置。

    另请参阅 android:requiresSmallestWidthDp 属性(声明与应用兼容的最小 smallestWidth)和 smallestScreenWidthDp 配置字段(存放设备的 smallestWidth 值)。

    如需了解有关不同屏幕设计和使用此限定符的详细信息,请参阅支持多种屏幕开发者指南。

    可用宽度 w<N>dp

    示例:
    w720dp
    w1024dp
    等等

    指定资源应使用的最小可用屏幕宽度(以 dp 为单位,由 <N> 值定义)。当屏幕方向在横向和纵向之间切换时,此配置值也会随之变化,以匹配当前的实际宽度。

    此功能往往有助于确定是否使用多窗格布局,因为即便在使用平板电脑设备时,您通常也不希望竖屏以横屏的方式使用多窗格布局。因此,您可以使用此功能指定布局所需的最小宽度,而无需同时使用屏幕尺寸和屏幕方向限定符。

    应用为此配置提供具有不同值的多个资源目录时,系统会使用最接近(但未超出)设备当前屏幕宽度的值。此处的值会考虑屏幕装饰元素,因此如果设备显示屏的左边缘或右边缘上有一些永久性 UI 元素,考虑到这些 UI 元素,同时为减少应用的可用空间,设备会使用小于实际屏幕尺寸的宽度值。

    此项为 API 级别 13 中的新增配置。

    另请参阅 screenWidthDp 配置字段,该字段存放当前屏幕宽度。

    如需了解有关不同屏幕设计和使用此限定符的详细信息,请参阅支持多种屏幕开发者指南。

    可用高度 h<N>dp

    示例:
    h720dp
    h1024dp
    等等

    指定资源应使用的最小可用屏幕高度(以“dp”为单位,由 <N> 值定义)。当屏幕方向在横向和纵向之间切换时,此配置值也会随之变化,以匹配当前的实际高度。

    对比使用此方式定义布局所需高度与使用 w<N>dp 定义所需宽度,二者均非常有用,且都无需同时使用屏幕尺寸和方向限定符。但大多数应用不需要此限定符,因为界面经常垂直滚动,所以高度需更有弹性,而宽度则应更固定。

    当应用为此配置提供具有不同值的多个资源目录时,系统会使用最接近(但未超出)设备当前屏幕高度的值。此处的值会考虑屏幕装饰元素,因此如果设备显示屏的上边缘或下边缘上有一些永久性 UI 元素,考虑到这些 UI 元素,同时为减少应用的可用空间,设备会使用小于实际屏幕尺寸的高度值。非固定的屏幕装饰元素(例如,全屏时可隐藏的手机状态栏)并在考虑范围内,标题栏或操作栏等窗口装饰亦如此,因此应用必须准备好处理稍小于其指定值的空间。

    此项为 API 级别 13 中的新增配置。

    另请参阅 screenHeightDp 配置字段,该字段存放当前屏幕宽度。

    如需了解有关不同屏幕设计和使用此限定符的详细信息,请参阅支持多种屏幕开发者指南。

    屏幕尺寸 small
    normal
    large
    xlarge
    • small:尺寸类似于低密度 VGA 屏幕的屏幕。小屏幕的最小布局尺寸约为 320x426 dp。例如,QVGA 低密度屏幕和 VGA 高密度屏幕。
    • normal:尺寸类似于中等密度 HVGA 屏幕的屏幕。标准屏幕的最小布局尺寸约为 320x470 dp。例如,WQVGA 低密度屏幕、HVGA 中等密度屏幕、WVGA 高密度屏幕。
    • large:尺寸类似于中等密度 VGA 屏幕的屏幕。大屏幕的最小布局尺寸约为 480x640 dp。例如,VGA 和 WVGA 中等密度屏幕。
    • xlarge:明显大于传统中等密度 HVGA 屏幕的屏幕。超大屏幕的最小布局尺寸约为 720x960 dp。在大多数情况下,屏幕超大的设备体积太大,不能放进口袋,最常见的是平板式设备。此项为 API 级别 9 中的新增配置。

    请注意:使用尺寸限定符并不表示资源适用于该尺寸的屏幕。如果没有为备用资源提供最符合当前设备配置的限定符,则系统可能会使用其中最匹配的资源。

    注意:如果所有资源均使用大于当前屏幕的尺寸限定符,则系统不会使用这些资源,并且应用将在运行时崩溃(例如,如果所有布局资源均以 xlarge 限定符标记,但设备是标准尺寸的屏幕)。

    此项为 API 级别 4 中的新增配置。

    如需了解详细信息,请参阅支持多种屏幕

    另请参阅 screenLayout 配置字段,该字段指示屏幕是小尺寸、标准尺寸还是大尺寸。

    屏幕纵横比 long
    notlong
    • long:宽屏,如 WQVGA、WVGA、FWVGA
    • notlong:非宽屏,如 QVGA、HVGA 和 VGA

    此项为 API 级别 4 中新增配置。

    此配置完全基于屏幕的纵横比(宽屏较宽),并且与屏幕方向无关。

    另请参阅 screenLayout 配置字段,该字段指示屏幕是否为宽屏。

    圆形屏幕 round
    notround
    • round:圆形屏幕,例如圆形可穿戴式设备
    • notround:方形屏幕,例如手机或平板电脑

    此项为 API 级别 23 中的新增配置。

    另请参阅 isScreenRound() 配置方法,该方法指示屏幕是否为圆形屏幕。

    广色域 widecg
    nowidecg
    • {@code widecg}:显示广色域,如 Display P3 或 AdobeRGB
    • {@code nowidecg}:显示窄色域,如 sRGB

    此项为 API 级别 26 中的新增配置。

    另请参阅 isScreenWideColorGamut() 配置方法,该方法指示屏幕是否具有广色域。

    高动态范围 (HDR) highdr
    lowdr
    • {@code highdr}:显示高动态范围
    • {@code lowdr}:显示低/标准动态范围

    此项为 API 级别 26 中的新增配置。

    另请参阅 isScreenHdr() 配置方法,该方法指示屏幕是否具有 HDR 功能。

    屏幕方向 port
    land
    • port:设备处于纵向(垂直)
    • land:设备处于横向状态(水平)

    如果用户旋转屏幕,此配置可能会在应用生命周期中发生变化。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更

    另请参阅 orientation 配置字段,该字段指示当前的设备方向。

    界面模式 car
    desk
    television
    appliance
    watch
    vrheadset
    • car:设备正在车载手机座上显示
    • desk:设备正在桌面手机座上显示
    • television:设备正在通过电视显示内容,通过将界面投影到离用户较远的大屏幕上,为用户提供“十英尺”体验。主要面向遥控交互或其他非触控式交互
    • appliance:设备正在用作没有显示屏的装置
    • watch:设备配有显示屏,并且可戴在手腕上
    • vrheadset:设备正在通过虚拟现实耳机显示内容

    此项为 API 级别 8 中的新增配置,API 13 中的新增电视配置,API 20 中的新增手表配置。

    如需了解应用在设备插入基座或从中移除时的响应方式,请阅读确定并监控插接状态和类型

    如果用户将设备插入基座,此配置可能会在应用生命周期中发生变化。您可以使用 UiModeManager 启用或禁用其中的部分模式。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更

    夜间模式 night
    notnight
    • night:夜间
    • notnight:白天

    此项为 API 级别 8 中的新增配置。

    如果夜间模式停留在自动模式(默认),此配置可能会在应用生命周期中发生变化。在此情况下,该模式会根据当天的时间进行调整。您可以使用 UiModeManager 启用或禁用此模式。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更

    屏幕像素密度 (dpi) ldpi
    mdpi
    hdpi
    xhdpi
    xxhdpi
    xxxhdpi
    nodpi
    tvdpi
    anydpi
    nnndpi
    • 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 中的新增配置
    • anydpi:此限定符适合所有屏幕密度,其优先级高于其他限定符。这非常适用于矢量可绘制对象此项为 API 级别 21 中的新增配置
    • nnndpi:用于表示非标准密度,其中 nnn 是正整数屏幕密度。此限定符不适用于大多数情况。使用标准密度存储分区,可显著减少因支持市场上各种设备屏幕密度而产生的开销。

    六个基本密度之间的缩放比为 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9x9 (ldpi) 位图相当于 12x12 (mdpi)、18x18 (hdpi)、24x24 (xhdpi) 位图,依此类推。

    如果您认为图像资源在电视或其他某些设备上的呈现效果不够好,进而想尝试使用 tvdpi 资源,则缩放系数应为 1.33*mdpi。例如,mdpi 屏幕的 100px x 100px 图像应相当于 tvdpi 屏幕的 133px x 133px 图像。

    请注意:使用密度限定符并不表示资源适用于该密度的屏幕。如果没有为备用资源提供最符合当前设备配置的限定符,则系统可能使用其中最匹配的资源。

    如需详细了解如何处理不同屏幕密度以及 Android 如何缩放位图以适应当前密度,请参阅支持多种屏幕

    触摸屏类型 notouch
    finger
    • notouch:设备没有触摸屏。
    • finger:设备有一个专供用户通过手指直接进行交互的触摸屏。

    另请参阅 touchscreen 配置字段,该字段指示设备上的触摸屏类型。

    键盘可用性 keysexposed
    keyshidden
    keyssoft
    • keysexposed:设备拥有可用的键盘。如果设备启用了软键盘(不无可能),那么即使用户找到硬键盘,或者该设备没有硬键盘,也可使用此限定符。如果未提供或已禁用软键盘,则只有在配备硬键盘的情况下才可使用此限定符。
    • keyshidden:设备具有可用的硬键盘,但其处于隐藏状态,设备启用软键盘。
    • keyssoft:设备已启用软键盘(无论是否可见)。

    如果您提供了 keysexposed 资源,但未提供 keyssoft 资源,则无论键盘是否可见,只要系统已启用软键盘,其便会使用 keysexposed 资源。

    如果用户打开硬键盘,此配置可能会在应用生命周期中发生变化。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更

    另请参阅配置字段 hardKeyboardHidden 和 keyboardHidden,二者分别指示硬键盘的可见性和任一键盘(包括软键盘)的可见性。

    主要的文本输入法 nokeys
    qwerty
    12key
    • nokeys:设备没有用于文本输入的硬按键。
    • qwerty:设备拥有标准硬键盘(无论是否对用户可见)。
    • 12key:设备拥有 12 键硬键盘(无论是否对用户可见)。

    另请参阅 keyboard 配置字段,该字段指示可用的主要文本输入法。

    平台版本(API 级别) 示例:
    v3
    v4
    v7
    等等

    设备支持的 API 级别。例如,v1 对应 API 级别 1(装有 Android 1.0 或更高版本系统的设备),v4 对应 API 级别 4(装有 Android 1.6 或更高版本系统的设备)。如需了解有关这些值的详细信息,请参阅 Android API 级别文档。

    请注意:自 Android 1.0 起便已添加部分配置限定符,因此并非所有版本的 Android 系统都支持所有限定符。使用新限定符会隐式添加平台版本限定符,因此较旧版本系统的设备必然会忽略它。例如,使用 w600dp 限定符会自动包括 v13 限定符,因为可用宽度限定符是 API 级别 13 中的新增配置。为避免出现任何问题,请始终包含一组默认资源(一组不带限定符的资源)。如需了解详细信息,请参阅利用资源提供最佳设备兼容性部分。

     

    3.匹配查找的逻辑

     

    3. 横竖屏切换时,在新版中更希望用户使用ViewModel来进行处理

     

    4.本地化,获取当前的语言环境

       通过 context对象获取

     

    java 代码: 
    Locale primaryLocale = context.getResources().getConfiguration().getLocales().get(0);
        String locale = primaryLocale.getDisplayName();
    
    
    kotlin 代码:
    val primaryLocale: Locale = context.resources.configuration.locales[0]
    val locale: String = primaryLocale.displayName
    

      

      4.1 使用pseudolocale测试本地化的界面是否需要优化

          开启开发者模式后,在build.gradle中添加

          

    android {
          ...
          buildTypes {
            debug {
              pseudoLocalesEnabled true
            }
          }
        
    

      

    5. Unicode 和国际化支持

       对于Android 7.0版本 ICU支持的更好可以直接调用方法,而对于之前的版本则需要打包进apk中

       在Android 7.0版本中使用 android.icu 供开发使用

       对于早先使用 com.ibm.icu 最好尽快更换为 android.icu

       对于需要迁移的包有以下这些: Android 和 Java ICU4J 类 对应关系

       

    替代选项
    java.lang.Character android.icu.lang.UCharacter
    java.text.BreakIterator android.icu.text.BreakIterator
    java.text.DecimalFormat android.icu.text.DecimalFormat
    java.util.Calendar android.icu.util.Calendar
    android.text.BidiFormatter android.icu.text.Bidi
    android.text.format.DateFormat android.icu.text.DateFormat
    android.text.format.DateUtils android.icu.text.DateFormat android.icu.text.RelativeDateTimeFormatter

        Android上的 ICU 不遵循用户的24小时/12小时时间格式设置,需要单独进行设置

       

    java 代码:
    
        String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm";
        String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());
        
    
    kotlin 代码:
    
        val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm"
        val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton(
                skeleton,
                Locale.getDefault()).format(Date()
        )
        
    

      

    6. 音译器

       Android 10(API 级别 29)及更高版本提供 Transliterator ,用于将文字从一种格式音译为另一种格式。在不同的 Android 版本和设备上,可用的音译 ID 组不稳定。设备制造商可能会添加额外的音译 ID。开发者必须先检查可用的 ID(从 Transliterator.getAvailableIDs() 获得),然后在对文字进行音译。

    7. 本地语言设置策略

       

    例如,假设您遇到了以下情况:

    • 您的应用的默认语言为 en_US (US English),但它也在 es_ES 资源文件中对西班牙字符串进行了本地化。
    • 将设备设置为 es_MX

    当您的 Java 代码引用字符串时,系统会从默认 (en_US) 资源文件加载字符串,即使应用在 es_ES 下有本地化的西班牙语资源。这是因为当系统无法找到精确匹配时,它会继续通过将国家/地区代码从语言区域中剥离来查找资源。最后,如果未找到匹配,系统会恢复为默认模式,即 en_US

    如果用户选择应用根本不支持的语言(如法语),则系统也会默认显示 en_US。例如:

    表 1. 没有精确语言区域匹配项的资源解析。

    用户设置应用资源资源解析
    fr_CH 默认值 (en)
    de_DE
    es_ES
    fr_FR
    it_IT
    尝试 fr_CH => 失败
    尝试 fr => 失败
    使用默认值 (en)

    在此示例中,系统在不知道用户是否理解英语的情况下显示英语字符串。目前,此行为很常见

    在Android 7.0 后的方法:

       1. 之前将西班牙语资源存储在 values-es-rUS 目录中,请将其移至包含拉丁美洲西班牙语的 values-b+es+419 目录中。同样,如果您在名为 values-en-rGB 的目录中存储有资源字符串,请将此目录重命名为 values-b+en+001(国际英语),因为 en-GB 字符串的最常用母语为 en-001

       2. 在API 级别 24 开始,Android 显示的 LocaleList.getDefault() API 可让应用直接查询用户已指定的语言列表。您可以使用此 API 创建更成熟的应用行为和更优化的内容显示。例如,搜索可以基于用户的设置以多种语言显示结果。浏览器应用可避免翻译以用户理解的语言显示的页面,键盘应用可自动启用所有适用的布局

    8 动画矢量

       在之前可能需要3个 xml文件 例如

      res/drawable/avd.xml

        <?xml version="1.0" encoding="utf-8"?>
        <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
            android:drawable="@drawable/vectordrawable" >
            <target
                android:name="rotationGroup"
                android:animation="@anim/rotation" />
        </animated-vector>
        
    

      

     

    res/drawable/vectordrawable.xml

       
    <?xml version="1.0" encoding="utf-8"?>
        <vector xmlns:android="http://schemas.android.com/apk/res/android"
            android:height="64dp"
            android:width="64dp"
            android:viewportHeight="600"
            android:viewportWidth="600" >
    
           <group
                android:name="rotationGroup"
                android:pivotX="300.0"
                android:pivotY="300.0"
                android:rotation="45.0" >
                <path
                    android:fillColor="#000000"
                    android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
    
           </group>
        </vector>
        
    

      

     

    res/anim/rotation.xml

       
    <?xml version="1.0" encoding="utf-8"?>
        <objectAnimator xmlns:android="http://schemas.android.com/apk/android"
            android:duration="6000"
            android:propertyName="rotation"
            android:valueFrom="0"
    
           android:valueTo="360" />
        
    

      

    现在可以合成为一个xml文件

     res/drawable/avd.xml

        <?xml version="1.0" encoding="utf-8"?>
        <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:aapt="http://schemas.android.com/aapt" >
    
            <aapt:attr name="android:drawable" >
                <vector
                    android:height="64dp"
                    android:width="64dp"
                    android:viewportHeight="600"
                    android:viewportWidth="600" >
    
                   <group
                        android:name="rotationGroup"
                        android:pivotX="300.0"
                        android:pivotY="300.0"
                        android:rotation="45.0" >
                        <path
                            android:fillColor="#000000"
                            android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
    
                   </group>
                </vector>
            </aapt:attr>
    
            <target android:name="rotationGroup">
                <aapt:attr name="android:animation" >
                    <objectAnimator
                        android:duration="6000"
                        android:propertyName="rotation"
                        android:valueFrom="0"
    
                       android:valueTo="360" />
                </aapt:attr>
            </target>
        </animated-vector>
        
    

      

  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/developer-wang/p/12619436.html
Copyright © 2011-2022 走看看