Android 资源 - Android 资源组织/访问初学者指南
了解 Android 应用程序资源。
- AndroidResourcesLessons - 基础版 - 899 KB (已更新备用 Drawable 资源示例)
- AndroidResourcesLessons - 完整版 - 1,019.7 KB (已更新备用资源示例)
目录
引言
要创建一个伟大的应用程序,光有伟大的代码是不够的,因为用户交互的是视觉部分而不是代码。代码以外的一切都称为 `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 按钮,您将看到输出预览。
我看不见我的图像,因为它是白色的 选择 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 添加更多解释