65.9K
CodeProject 正在变化。 阅读更多。
Home

Android 资源 - Android 资源组织/访问初学者指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (17投票s)

2014 年 8 月 27 日

CPOL

18分钟阅读

viewsIcon

53817

downloadIcon

1242

了解 Android 应用程序资源。

目录

引言

要创建一个伟大的应用程序,光有伟大的代码是不够的,因为用户交互的是视觉部分而不是代码。代码以外的一切都称为 `Resources`(资源),`Resources` 有很多种类,例如文本、图像、动画等。在本文中,您将了解资源类型以及如何在您的应用程序中使用它们。

背景

当 `resources`(资源)成为应用程序的另一个组成部分时,您需要了解应用程序开发和 UI 创建的基础。 

优惠信息

在本文中,我们将通过将 `resources`(资源)应用到现有的代码/UI 来学习。我已经提供了基础项目供您学习本文,您可以从下面的链接下载。

资源

`Resources`(资源)是应用程序中除了 Java 代码之外的所有东西。在 Android 平台上有许多 `Resources`(资源)类型,例如文本、颜色、布局、尺寸等。Android 为每种资源类型提供了特定的文件夹,资源的根文件夹是 `res/`,该文件夹包含许多子文件夹,用于存放每种资源类型。

资源及其文件夹
Directory(目录) 目录中的资源
animator XML 格式的属性动画
anim XML 格式的视图动画
color XML 格式的颜色状态列表资源
drawable 图像文件或 XML 文件
layout XML 格式的 UI 布局文件
菜单 XML 格式的菜单定义文件
原始 您需要在应用程序中使用的其他所有内容
value 简单值,如文本、尺寸、颜色等。
xml 您想在应用程序中使用的另一个 XML 文件,例如配置文件。

布局资源

`Layout resource`(布局资源)是用户界面的定义文件,您已经从上一篇文章(竞赛文章 #4)中学习了这种资源类型。存放布局资源的目录是 `res/layout`。

这是一个 `layout`(布局)文件的示例

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="me.vable.android.androidresourceslessons.ValuesExampleActivity"
    android:orientation="vertical"
    >

    <TextView
        android:text="What is your name?"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:singleLine="true"
        android:maxLines="1"
        android:hint="Name"
        />

    <TextView
        android:text="How do you feel today?"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dp"/>

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <RadioButton
            android:text="Great :)"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <RadioButton
            android:text="Upset :("
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <RadioButton
            android:text="Tearful :'("
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="false"
            />
    </RadioGroup>

</LinearLayout>

值资源

`Value Resource`(值资源)是包含基本值定义的 XML 文件,例如 `string`(字符串)、`color`(颜色)和 `dimension`(尺寸)。这种资源类型存放在 `res/value` 文件夹中,您可以创建任意名称的资源文件,所有值资源都可以放在一个 XML 文件中,但不推荐这样做。

要创建值资源,请右键单击 res/value 文件夹,然后选择 New > Values resource file。

然后,输入资源名称。

目前没有官方的资源文件名命名约定,但我建议您使用 `<resource_type>_<activity or fragment>_<activity or fragment name>.xml` 的格式命名。

例如:我有一个名为 `MainActivity` 的 Activity,我将为这个 Activity 创建 `string value resource`(字符串值资源),资源文件的名称应该是 `string_activity_main.xml`

字符串

String resources(字符串资源)提供您可以在 Java 代码和 UI 布局中使用的文本。

这是一个 `String resources`(字符串资源)文件的示例

<resources>
    <string name="app_name">AndroidResourcesLessons</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
</resource>

在此文件中,有名为 app_name、hello_world 和 action_settings 的 String resources(字符串资源)。您可以在布局中通过输入 "`@string/`" 并后跟您想要的资源 ID 来使用这些 String resources(字符串资源)。

<TextView
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dp" />

而在 Java 中,您可以使用 R 类实例来引用字符串,例如 `R.string.app_name`。

TextView helloWorldTextView = (TextView) findViewById(R.id.textview_hello_world);
helloWorldTextView.setText(R.string.hello_world);

命名约定

目前没有官方的 `String resource`(字符串资源)命名约定,但我建议您使用 `<layout>_<view id>` 的模式,例如 `activity_main_textview_title`,来指定使用此字符串的视图;或者,如果该字符串是常用语,您也可以只使用 `ok`、`error_no_connection` 这样的名称。

现在,打开 `layout activity_values_example.xml` 文件,尝试将所有硬编码的 String(字符串)转换为 String Resource reference(字符串资源引用)。

注意:请创建一个名为 `string_activity_value_example.xml` 的新 String Resources(字符串资源)文件。

注意:某些字符不能在 String Resource 文件中使用,您需要用 转义码 替换它们。

Color

当您想更改 `Layout`(布局)文件中的文本颜色时,您可以使用硬编码的 `color`(颜色)代码,但很多时候您会为许多元素使用相同的颜色。当您想更改颜色时,您需要找到每个使用此颜色的元素,这会浪费您的时间。

`Color resource`(颜色资源)是解决方案,您只需定义您想要使用的颜色,然后在任何您想使用此颜色的地方引用此资源。

您可以为整个应用程序使用相同的 `Color resources`(颜色资源)文件,因为整个应用程序应该使用相同的颜色、相同的样式,以确保体验的一致性。常用的 Color resources(颜色资源)文件名是 `colors.xml`。

这是一个 `Color resources`(颜色资源)的示例。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="text_dark">#252525</color>
    <color name="text_light">#DEDEDE</color>
    <color name="text_warn">#FF0000</color>
</resources>

在 XML 中,有两个颜色资源 text_dark 和 text_light。要在布局中使用它们,只需输入 "`@color/`" 引用,然后跟上 `Color resource`(颜色资源)的名称。

<TextView
        android:text="@string/hello_world"
        android:textColor="@color/text_warn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dp" />

您可以使用 `R.color.<color resource name>` 来引用颜色资源,例如 `R.color.text_warn`。

TextView helloWorldTextView = (TextView) findViewById(R.id.textview_hello_world);
helloWorldTextView.setText(R.string.hello_world);
helloWorldTextView.setTextColor(R.color.text_warn);

命名约定

目前没有官方的 `Color resource`(颜色资源)命名约定,但您可以使用有意义且能表明其资源角色的名称,例如 `text_warn` 表示警告文本的颜色。

现在,打开布局 `activity_values_example.xml`,尝试为文本或视图着色,您想要的。

维度

要调整 `View`(视图)的大小和位置,您可以使用 dp、sp、px 单位的硬编码值。与 `Color resources`(颜色资源)一样,有时您想对许多元素使用相同的值,例如元素的边距和内边距,应该将其作为资源。

与颜色一样,您可以将通用的 `dimension values`(尺寸值)存储在一个文件中,除非您想创建非常特定的值,例如仅为某个元素设置边距。通用的 Dimension resources(尺寸资源)文件名是 dimens.xml。

<resources>
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="default_margin">8dp</dimen>
</resources>

要在布局文件中使用 `dimension resource`(尺寸资源),只需使用 `@dimen/<dimesion resource name>` 来引用。

<TextView
        android:text="@string/hello_world"
        android:textColor="@color/text_warn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/default_margin"
        android:textSize="18dp" />

在 Java 代码中,您可以使用 `R.dimens.<dimesion resource name>` 来引用特定的尺寸资源。

getResources().getDimension(R.dimen.default_margin);

`getResources().getDimension()` 方法将返回像素单位的值。

命名约定

目前没有官方的 Dimension resource(尺寸资源)命名约定,但您可以使用有意义且能表明资源角色的名称,例如 default_padding。

现在,打开布局 activity_values_example.xml,尝试在问题之间添加一些间距。

字符串数组

您也可以将 `String`(字符串)的数组作为 `resource`(资源)。这种类型的资源应该用于提供一系列静态数据,例如用作 Spinner 的数据源。

您可以将 `String array`(字符串数组)与 String resource(字符串资源)放在同一个文件中。

这是一个 String Array resources(字符串数组资源)的示例。

    <string-array name="string_activity_value_example_spinner_color_options">
        <item>Red</item>
        <item>Yellow</item>
        <item>Blue</item>
    </string-array>

示例是用于颜色 `spinner` 的 `String Array`(字符串数组),您可以在 Java 代码中使用 `R.array.<string array resource name>` 来使用它。

我将使用它作为 `Spinner Adapter` 的数据源,这是我的布局

    <Spinner
        android:id="@+id/spinner_color"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

这是旧的 Java 代码

String[] colors = new String[]{"Red","Yellow","Blue"};

Spinner colorSpinner = (Spinner)findViewById(R.id.spinner_color);
        
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, colors);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
colorSpinner.setAdapter(adapter);

然后,我用 getResources().getStringArray() 方法替换了 String[] 硬编码。

String[] colors = getResources().getStringArray(R.array.string_activity_value_example_spinner_color_options);

Spinner colorSpinner = (Spinner)findViewById(R.id.spinner_color);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, colors);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

colorSpinner.setAdapter(adapter);

结果如下

结果与硬编码的 `String array`(字符串数组)相同。

命名约定

目前没有官方的 `String Array resource`(字符串数组资源)命名约定,但我建议您使用 `<layout>_<view id>` 的模式,例如 `activity_main_color_options`,来指定使用此 `String Array`(字符串数组)的视图。

Drawable 资源

`Drawable resource`(Drawable 资源)是指可以在屏幕上绘制的图形文件。`Drawable resources`(Drawable 资源)可以分为两类:第一类是真实图像文件 (.png, .jpg, .gif) 和 9-patch 文件,另一类是 XML 定义文件,例如 XML Bitmap、Layer List 等。

Bitmap

真实图像文件 (.png, .jpg, .gif),您可以直接将任何图像文件放在 `drawable` 目录中,然后在 Java 代码中使用 ID 引用它,例如 `R.drawable.<file name without extension>`,在布局文件中使用 "`@drawable/<file name without extension>`"。

例如:我放入了一个名为 "ic_error.png" 的 png 文件,然后我可以用它作为 ImageView 的 src。

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/ic_error" />

在 Java 代码中,我可以使用 `getResources().getDrawable()` 方法来获取此 drawable。

Drawable drawable = getResources().getDrawable(R.drawable.ic_error);

或者直接将其设置为 ImageView 的源

ImageView errorImageView = (ImageView) findViewById(R.id.imageview_error);

errorImageView .setImageResource(R.drawable.ic_error);

Nine Patch

`Nine Patch`(九图)是 PNG 图像 + 区域标记。Nine Patch(九图)允许 Android 在内容大于图像时进行拉伸。`Nine Patch`(九图)通常用于制作 `View background`(视图背景)图像。

从上图可以看出,当您将 `TextView` 的 `background`(背景)设置为普通位图文件时,当内容溢出时,`background`(背景)图像会变形,但使用 9-patch(九图)时不会出现此问题。

在 `9-patched png`(9-patch PNG)的每个边框外都有 1 像素的额外区域,用于标记可以拉伸的区域和内容区域。顶部和左侧的标记用于定义可拉伸区域,而底部和右侧的标记用于定义内边距框或内容区域(如果没有标记,内容可以适应背景)。

Android 提供了一个创建 nine patch(九图)图像的工具,名为 `draw9patch`,您可以在 `<android_sdk_path>/tools/` 找到它。

让我们尝试构建一个 nine patch(九图),保存下面的图片。

然后打开 draw9patch,将图像文件拖到 draw9patch 窗口。

拖动每个边框上的水平线和垂直线来创建 patch(图块)。

勾选所有选项,并查看窗口右侧的预览。

现在,保存 `9-patched image`(9-patch 图像)并将其添加到项目中。打开 activity_drawable_example.xml 文件,尝试将按钮背景更改为 9-patch(九图)文件。

注意:您可以在 Android Studio 中通过双击 9-patch 文件来编辑 patch(图块)。

菜单资源

Android 提供了 `menu resource`(菜单资源)来创建菜单。在 Android 3.0+ 上,选项菜单会显示在应用程序的 `ActionBar`(操作栏)中,并且有两种选项菜单:`Action Menu`(操作菜单)和 `Popup Menu`(弹出菜单)。但在旧设备上,硬件上有一个菜单按钮,点击后菜单会显示在屏幕底部。然而,有一些开发者创建了将 ActionBar(操作栏)引入旧设备的库,该库称为 `ActionBarSherlock`,现在 Google 通过 `Appcompat` 库将 `ActionBar`(操作栏)引入了旧设备。

要创建 `options menu`(选项菜单),您需要在 `res/menu` 中创建一个 `menu resource`(菜单资源)。

在基础项目中,我已经为您提供了一个 MenuExampleActivity 和 menu_example.xml 作为菜单资源。让我们现在尝试创建菜单!!

这是我们当前的菜单资源 XML 代码

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="me.vable.android.androidresourceslessons.MenuExampleActivity" >
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never" />
</menu>

资源文件中有一个 Settings(设置)菜单,当您运行应用程序时,您将看到如下菜单。

这些是选项 `menu`(菜单)的重要属性。

  • android:id - 此菜单的 ID,没有 ID 您将无法在 Java 代码中访问该菜单。
  • android:title - 您想在此菜单上显示的文本。
  • android:orderInCategory - 该菜单在其 `category`(类别)中的顺序。
  • android:icon - 菜单的图标,当菜单是 `Action Menu`(操作菜单)时会显示,并且在旧样式 `menu`(菜单)(旧版 Android)中始终显示。
  • app:showAsAction / android:showAsAction  - 此菜单是否为 `Action Menu`(操作菜单),您可以将其设置为始终显示为操作菜单,或取决于 `Action Bar`(操作栏)空间,或从不显示为操作菜单。

注意:如果您的 Activity 继承自 `AppCompat` 库中的 `ActionBarActivitiy`,您需要导入 `xmlns:app="http://schemas.android.com/apk/res-auto"` 的 app 命名空间,并使用 `app` 命名空间提供的 `showAsAction` 属性。或者,您可以同时添加 `app:showAsAction` 和 `android:showAsAction` 来确保 `Action Menu`(操作菜单)会显示。

我建议您将 `menu`(菜单)的 ID 命名为 `action_<name>`(如果是 `Action Menu`)或 `menu_<name>`(如果是普通 `Menu`)。

现在,我想创建一个关于菜单作为弹出菜单。

<item android:id="@+id/menu_about"
    android:title="About"
    android:orderInCategory="101"
    app:showAsAction="never"
    />

我将新的菜单的 showAsAction 属性设置为 never,因为我不想将其显示为 ActionMenu。

结果如下

接下来,我将创建一个 Refresh Action Menu(刷新操作菜单)。

<item android:id="@+id/action_refresh"
    android:title="Refresh"
    android:orderInCategory="1"
    app:showAsAction="always"
    />

此菜单将始终显示为操作栏上的 Action Menu(操作菜单)。

如果您不为 Action Menu(操作菜单)提供图标,它将显示标题文本。现在尝试为 Refresh Action Menu(刷新操作菜单)添加图标。

当您创建 `Action Menu`(操作菜单)时,应该添加菜单 `icon`(图标)。Android 建议使用单色图像作为菜单图标,您必须创建简单且含义清晰、广为人知的图像。

我决定使用此图标 作为刷新菜单。Android Studio 提供了 **Image Asset import wizard**(图像资源导入向导),可帮助开发者将图像转换为正确的尺寸和颜色。要使用该向导,请右键单击 `res` 文件夹,然后选择 New > Image Asset。

您将看到向导窗口

您可以使用此向导导入三种 Drawable 资源类型:Launcher Icons(启动器图标)、Action Bar and Tabs Icons(操作栏和标签栏图标)以及 Notification Icon(通知图标)。

我们将使用 Action Bar and Tab Icons(操作栏和标签栏图标)选项导入菜单图标。

这些是选项的描述。

  • Asset Type(资源类型)- 您要创建的 `asset`(资源)的类型。
  • Foreground(前景)- 您可以使用自己的图像,或使用剪贴画,或文本。
    • Image File(图像文件)- 如果您使用自己的图像,向导将允许您选择图像。
    • Clipart(剪贴画)- 如果将前景设置为剪贴画,向导将允许您选择剪贴画。
    • Text(文本)- 如果将前景设置为文本,您可以在此处输入您的文本。
    • Font(字体)- 设置文本的字体。
  • Trim surrounding blank space(修剪周围空白)- 修剪前景元素周围的空间。
  • Additional padding(附加内边距)- 在前景元素周围添加空间。
  • Theme(主题)- 您应用程序的主题,如果您选择自定义选项,它将允许您选择图标的颜色。
  • Resource name(资源名称)- 设置此资源的名称。

注意:资源名称应命名为 `ic_action_<name>`

选择选项后,单击 next 按钮,您将看到输出预览。

我看不见我的图像,因为它是白色的 Frown | :( 选择 Target Module(目标模块)到您的应用程序,并选择您应用程序的 res 目录。

现在,我有一个名为 ic_action_refresh 的 `drawable resource`(Drawable 资源)。将其添加到 `menu`(菜单)中!!

<item android:id="@+id/action_refresh"
        android:title="Refresh"
        android:orderInCategory="1"
        app:showAsAction="always"
        android:icon="@drawable/ic_action_refresh"
        />

结果如下

接下来,我们将访问 Java 代码中的 `options menu`(选项菜单),并编写代码来响应 `options menu`(选项菜单)的点击事件。

打开 `Activity`(活动)文件,您将看到 `onCreateOptionsMenu()` 和 `onOptionsItemSelected()` 方法(如果不存在则创建它们)。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_example, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

`onCreateOptionsMenu()` 方法用于将 `options menu`(选项菜单)膨胀以显示在 `View`(视图)上。

`onOptionsItemSelected()` 方法用于检测 `menu`(菜单)上的点击事件。

现在,我们专注于 `onOptionsItemSelected()` 方法,我将为每个菜单显示 `Toast`(吐司)消息。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            //do something
            Toast.makeText(this,"Settings menu was clicked",Toast.LENGTH_SHORT).show();
            return true;
        }
        else if (id == R.id.menu_about) {
            //do something
            Toast.makeText(this,"About menu was clicked",Toast.LENGTH_SHORT).show();
            return true;
        }
        else if (id == R.id.action_refresh) {
            //do something
            Toast.makeText(this,"Refresh menu was clicked",Toast.LENGTH_SHORT).show();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

然后运行应用程序!!

备用资源

在 `res/` 文件夹中,您会看到一些名称相同但带有后缀的文件夹,例如 drawable、drawable-xhdpi、drawable-mdpi。这些是 `alternative resources`(备用资源),用于为特定设备提供,例如具有大屏幕的设备,运行 Android 4.4+ 的设备等。

Android 提供了 `resource qualifiers`(资源限定符)用于指定资源文件夹是为特定设备或状态提供的。

创建备用资源目录

要创建 `alternative resources`(备用资源)目录,请右键单击 `res/` 文件夹,然后选择 New > Android resource directory。

您将看到 New Resource Directory(新建资源目录)窗口,您可以选择要创建 `alternative resources directory`(备用资源目录)的资源类型。

有许多 `qualifier`(限定符)可用于 `resources`(资源),以创建 `Alternative Resource Directory`(备用资源目录)。例如,如果您想本地化您的应用程序,您需要使用 Region(区域)选项。如果您想为平板电脑创建 UI,您需要使用 Screen Size(屏幕尺寸)选项。

我将向您展示一个针对 `landscape`(横向)方向的 `String alternative resources`(字符串备用资源)示例。选择资源类型为 values,选择 orientation(方向),然后单击 >> 按钮。

将 Screen orientation(屏幕方向)设置为 Landscape(横向),然后单击 OK(确定)按钮。

您将在 res 文件夹中看到 values-land。

现在尝试使用 `alternative resources`(备用资源)!!在基础项目中,我已经创建了 `AlternativeResourcesExampleActivity` 及其布局文件 `activity_alternative_resources_example.xml`。现在,查看布局文件。有一个 Greeting TextView(问候文本视图)。

我们将为横向模式和纵向模式的 Greeting TextView(问候文本视图)提供不同的 String resource(字符串资源)。

首先,在 strings.xml 文件中创建名为 `textview_greeting` 的 String resource(字符串资源),其值为 "Hello, John"。

<string name="textview_greeting">Hello, John</string>

其次,在 `values-land` 文件夹中创建 `strings.xml` 资源文件,并将名为 `textview_greeting` 的 String resource(字符串资源)的值设置为 "Good morning, John"。

<string name="textview_greeting">Good morning, John</string>

最后,将 Greeting TextView(问候文本视图)的文本设置为 String resource(字符串资源) `textview_greeting`。

<TextView
    android:text="@string/textview_greeting"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

运行应用程序并尝试旋转设备。

备用 Drawable 资源

在 `res/` 文件夹中,您会看到 drawable-xxxx 文件夹,它们是针对特定屏幕密度的 `Alternative Drawable Resources`(备用 Drawable 资源)。

上图显示了每个屏幕密度下图像尺寸的比较。`mdpi` 密度是基线尺寸,1 像素等于 1 dp。

密度

DPI

示例设备

Scale

像素/dp

ldpi

~120

三星 Galaxy Y(~133)

0.75x

1px = 0.75dp

mdpi

~160

HTC Wildfire S(~180)

1.0x

1px = 1dp

hdpi

~240

Nexus One(~252)

1.5x

1px = 1.5dp

xhdpi

~320

Nexus 4(~318 dpi)

2.0x

1px = 2dp

xxhdpi

~480

Nexus 5(~445 dpi)

3.0x

1px = 3dp

xxhdpi

~640

-

4.0x

1px = 4dp

该表显示了密度、dpi、比例、每 dp 的像素以及示例设备之间的关系,您会发现设备密度不仅取决于 dpi,还取决于制造商。

查看 `AlternativeDrawableExampleActivity`,其中有许多 ImageView(图像视图),它们从不同的 `drawable` 文件夹中消耗 `image resource`(图像资源)。(我在所有文件夹中都放置了相同尺寸(128px*128px)的图像,但名称不同)。

现在尝试运行它。

您会看到显示在设备屏幕上的图像尺寸不同,因为 Android 会将每个文件夹中的图像缩放到适当的尺寸。

如果您将图像放在屏幕密度高于您设备的文件夹中,Android 会将其缩小。

另一方面,Android 会放大屏幕密度低于您设备的文件夹中的图像。

注意:在图片中,我在 Nexus 5 上运行了应用程序。

注意:drawable 和 `drawable-mdpi` 资源的大小相同。

当 Android 缩小图像时,它会消耗处理器/内存资源。因此,如果可能,您应该提供所有尺寸的图像。

现在,查看 `AlternativeDrawableExample2Activity`。我将图像放入 `drawable-ldpi`、`drawable-mdpi`、`drawable-hdpi` 和 `drawable-xhdpi` 文件夹中,但在本例中,我通过使用上面表格中的乘法因子将每个图像调整到适当的尺寸,并将其重命名为不同的名称。

现在尝试运行它。

哇!!Android 自动将其缩放到相同尺寸并在屏幕上显示。

另一个例子,AlternativeDrawableExample3Activity,此活动只有一个 `ImageVIew`,其 `src` 设置为 `drawable resource`(Drawable 资源)。我已将缩放后的(适当尺寸)图像放入 `drawable-ldpi`、`drawable-mdpi`、`drawable-hdpi` 和 `drawable-xhdpi` 文件夹中。所有图像的名称都相同。

当多个 `resource`(资源)文件夹中有相同的 `resource`(资源)名称时,Android 会通过考虑资源限定符来选择适当的资源。这就是为什么您应该自己缩放图像资源的原因。

有时您只想在高密度显示屏上添加一些额外的图形,您可以通过为每个资源文件夹提供不同的图像来实现,但所有图像都使用相同的资源名称。

现在,在 Android Studio 中打开 `activity_alternative_drawable_example3.xml` 的设计视图,然后单击 preview device(预览设备)按钮并选择 Preview All Screen Size(预览所有屏幕尺寸)。

此屏幕将预览许多设备上屏幕元素的大小,您可以使用此工具检查您的布局和资源。

图片缩放工具

我建议您为 XHDPI 或 XXHDPI 密度设计图像文件,因为您可以缩小图像而不会损失质量。

我推荐一个用于将图像调整到 XHDPI、HDPI、MDPI 和 LDPI 的工具,该工具是 Android Resizer Tool,您可以从 xda-developers 线程下载。

如何使用它?

打开工具。

输入数字 2 进行配置。

输入源图像密度,推荐使用 XHDPI(输入 1)。

输入输出 DPI 1、2、3 和 4。然后输入源图像文件夹。

输入输出图像文件夹。

输入数字 1 进行图像转换。

完成!!

这是一个输出文件夹。

我推荐的另一个工具是 Android Asset Studio,它是一个用于创建主题、图标等的在线工具。

完成!!现在您已经了解了 `Android Resources`(Android 资源)类型,本文中还有许多 `Resources`(资源)我没有提到,请自行尝试。请记住,成功的唯一方法是练习、练习、练习、练习,以及更多的练习。祝您好运!!

完整项目仓库

关注点

创建伟大的应用程序时,`resources`(资源)非常重要,您需要精心处理它们,因为用户与应用程序的视觉部分而不是代码进行交互。学习完本文后,请尝试学习其他资源类型,以完成伟大应用程序的拼图。希望您享受您的 Android 开发生涯!!

历史

2014/08/24 首次提交

2014/08/24 修复内部链接

2014/08/25 添加备用 Drawable 资源示例

2014/08/25 添加更多解释

© . All rights reserved.