Android编程权威指南(第4版)
上QQ阅读APP看书,第一时间看更新

2.5 添加图标资源

GeoQuiz应用现在已经可用了。如果NEXT按钮上能够显示向右的图标,用户界面看起来更简洁美观。

本书随书文件中提供了这样的箭头图标。每章一个,随书文件包括本书全部Android Studio项目文件。

下载随书文件,找到并打开02_MVC/GeoQuiz/app/src/main/res目录。在该目录下,可以看到drawable-hdpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi和drawable-xxxhdpi五个目录。

五个目录各自的后缀名代表设备的像素密度。

  • mdpi:中等像素密度屏幕(约160dpi)。
  • hdpi:高像素密度屏幕(约240dpi)。
  • xhdpi:超高像素密度屏幕(约320dpi)。
  • xxhdpi:超超高像素密度屏幕(约480dpi)。
  • xxxhdpi:超超超高像素密度屏幕(约640dpi)。

(另外还有ldpi和tvdpi这两个类别,本书用不到它们,因此未包括在内。)

每个目录下有两个图片文件:arrow_right.png和arrow_left.png。这些图片文件都是按照目录名对应的dpi定制的。

GeoQuiz项目中的所有图片资源都会随应用安装在设备里,Android操作系统知道如何为不同设备提供最佳匹配。注意,在为不同设备准备适配图片的同时,应用安装包容量也随之增大。当然,对于GeoQuiz这样的小项目,问题并不明显。

如果应用不包含设备对应的屏幕像素密度文件,则在运行时,Android系统会自动找到可用的图片资源,并针对该设备进行缩放适配。有了这种特性,就不一定要准备各种屏幕像素密度文件了。因此,为控制应用包的大小,可以只为主流设备准备分辨率较高的定制图片资源。至于那些不常见的低分辨率设备,让Android系统自动适配就好。

(第22章会介绍为屏幕像素密度定制图片的替代方案,另外,还会解释mipmap目录的用途。)

2.5.1 向项目中添加资源

接下来,将图片文件添加到GeoQuiz项目资源中去。

首先,确认打开了Android Studio的Project视角模式。如图2-6所示,展开GeoQuiz/app/src/main/res目录会看到已有mipmap-hdpi和mipmap-xhdpi这样的目录。

图2-6 在Project视角模式下查看资源

在随书文件中,选择并复制drawable-hdpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi和drawable-xxxhdpi这五个目录,将它们粘贴到app/src/main/res目录中。完成后,在Android Studio的项目工具窗口可以看到这五个目录,每个目录中含有对应的arrow_left.png和arrow_right.png文件,如图2-7所示。

图2-7 drawable目录中的箭头图标文件

如果将项目工具窗口切换回Android视角模式,新增加的drawable图片资源会以图2-8所示的形式展示。

图2-8 drawable目录中的箭头图标文件汇总

向应用添加图片就这么简单。任何添加到res/drawable目录中,后缀名为.png、.jpg或者.gif的文件都会自动获得资源ID。(注意,文件名必须是小写字母且不能有空格。)

这些资源ID并不按照屏幕像素密度匹配,因此不需要在运行时确定设备的屏幕像素密度,只要在代码中引用这些资源ID就可以了。应用运行时,操作系统知道如何在特定的设备上显示匹配的图片。

Android资源系统是如何工作的?从第3章起,我们会深入学习这方面的相关知识。现在,能显示右箭头图标就可以了。

2.5.2 在XML文件中引用资源

在代码中可以使用资源ID引用资源。如果想在布局定义中配置NEXT按钮显示箭头图标,该如何在布局XML文件中引用资源呢?

答案很简单,只是语法稍有不同而已。打开activity_main.xml文件,为Button部件新增两个属性,如代码清单2-11所示。

代码清单2-11 为NEXT按钮增加图标(res/layout/activity_main.xml)

<LinearLayout  ... >
    ...
    <LinearLayout  ... >
        ...
    </LinearLayout>

    <Button
        android:id="@+id/next_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/next_button"
        android:drawableEnd="@drawable/arrow_right"
        android:drawablePadding="4dp" />

</LinearLayout>

在XML资源文件中,可以通过资源类型和资源名称引用其他资源。以@string/开头的定义是引用字符串资源。以@drawable/开头的定义是引用drawable资源。

从第3章开始,我们还会学习更多资源命名以及res目录结构中其他资源的使用等相关知识。

运行GeoQuiz应用。新按钮很漂亮吧?测试一下,确认它仍然工作正常。