39

Android9编程六:图像资源

 5 years ago
source link: https://blog.csdn.net/niu_gao/article/details/89810270?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

上一篇: Android9编程五:Layout资源

一、添加图像资源

如果我们想在图像中显示自己喜欢的图像,肿么办呢? 这也不难,我们可以把电脑上的图像复制到工程的资源中,这样就可以在工程中使用它们了。

做法是这样的:在你的文件浏览器中找一个图像文件(如果没有就从网上下载一个),最好是png格式的,jpg的也行,然后在文件浏览器中复制此文件(不要说你不知道怎么复制,按Ctrl+C或右键菜单中选“复制”),然后在你的工程中,在要放入的组上点右键,在右键菜单中选“Paste(粘贴)”即可。如下图:

BZNzAnV.png!web

图像必须放到“drawable”组中。drawable组中专门放可以绘制的资源,所以你不要放到其它组中。点了粘贴(Paste)之后出现如下对话框:

rUnQZ3F.png!web

这个对话框给你一个修改文件名和文件存放位置的机会,存放位置没问题,不要动。资源名字你可以随便取,但要有意义,而且也不能用中文,不能以数字开头,字母不能大写,如果不符合这些要求,工程编译通不过。如果你英语不好就用拼音取名。如果你的资源文件名不符和要求,当你编译App时,就会看到错误,如下图:

RbYNF3U.png!web

在“Messages”这个窗口中,输出了编译中遇到的错误,可以看到这个错误最后给出的原因:“The resource name must start with a letter”,意思是资源的名字必须以字母开头。

二、文件或文件夹改名

如果这个资源已加入了工程,但是名字不合格,肿么办呢? 还是可以改名的!改名方式是这样的:在文件上点出右键菜单,选“Refactor(重构)”,再选“Rename(重名命)”,如下图:

nQ7FJfi.png!web

一个窗口现身:

rqyERzM.png!web

注意改名时不要改扩展名,改完后点“Refactor(重构)”即可。

既然已添加了自己的图像资源,那就把它显示出来吧? 预知后事如何,下节分解。

三、显示自己的图像

选中图像控件,打开属性栏:

IRbQzq7.png!web

在列出的属性中没有改变图像的项,不是没有,是隐藏了。默认下,属性栏中只显示少量常用的属性,要想看到全部属性,需要点箭头所指的链接“View all properties(查看所有属性)”,你会发现显示出了一大坨属性:

mE7bmy3.png!web

拖动滚动条,就可以看到所有属性。那么,哪个是改变所显图像的属性呢? 这个属性叫“srcCompat”,上图中可以看到,它的值是“@mipmap/ic_launcher”。这个以“@”开头的字符串叫表示的是一个ID,每个资源都有自己的ID,ID的名字就是这个资源的文件名。这里通过这个ID引用了一个图像资源。我们要改变显示的图像,可以为这个属性直接写入某个图片的ID,但是手写麻烦易出错,我们还是借助工具来设置吧,点下图所示按钮:

nqmYbaa.png!web

弹出了资源选择对话框:

M36ZVfm.png!web

这次选“Project”区中的female图像(我们刚加入的),点OK。现在图像控件变成了这样:

bAV7zmr.png!web

终于看到了这颗人头!

你一定要注意:Android Studio 会很自作聪明的把属性编辑器中你刚刚编辑过的属性移到靠顶的位置,就是说这些属性在属性栏中乱跑!这到底是在帮忙还是捣乱?反正搞得我很不适应。

运行起来看看真实的效果是什么样的吧?

此时,activity_main.xml这个文件的内容是这样的:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="niuedu.com.andfirststep.MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:srcCompat="@drawable/female"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="16dp" />
</android.support.constraint.ConstraintLayout>

这些源码是怎么看到的呢? 看下图就明白了:

j2eeUb3.png!web

四、XML小解

界面设计文件的格式是XML。虽然我作此书时假设你已知道什么是XML,但是终究会有偶有初学者读此书,我还是把XML稍微解释一下。

XML是存储数据的一种格式,它只能以文本方式存数据,也就是说它存不了图片(也有办法存,但很麻烦,也不推荐这样做,所以你现在可以认为它只能存文本)。它的数据由元素组成,一条数据是一个元素,元素由标记来表示,标记即以“< >”包起来的文本。比如 : 就是一个元素,是元素的开始标记,是它的结束标记。如果一个元素不包含子元素,则为空元素。比如这里就是一个空元素。空元素可以把结束标记省略,写作: 。以下则表示有儿子和,还有孙子:

<aaa>
       <bbb>
              <ccc />
       </bbb>
       <ddd />
</aaa>

一个元素除了可以有多个儿子,还可以有多个属性,如: ,eee就是的一个属性,等号前是属性的名字,等号后是属性的值。注意属性的值必须用单引号或双引号包起来。

注意!引号必须是半角字符!这是一个新手常掉进去的坑。

五、Layout源码解释

现在让我们逐条解释activity_main.xml文件中一些令人迷惑的代码。

  • <?xml version="1.0" encoding="utf-8"?>

XML都这样开头,不要太在意。version表示版本是1.0,encoding表示编码是utf8,要想没乱码,你必须保证这个XML文件真的是utf8编码。

这是界面的最外层的元素,可以看到标记名是一个类(ConstraintLayout)的全名。如果这个类是Android SDK的核心库中的类,可以把包省略,只写类名。跟据类名我们就知道界面的最外面是一个ConstraintLayout控件。

此元素中有一些“xmlns”开头的属性,它为xml命名空间指定了别名,比如”android“、“app”和“tools”就是三个别名,要使用那个命名空间中定义的符号,必须在名字前带上命名空间的别名,比如:android:layout_width=“match_parent”,这个属性名layout_width就属于android这个别名所对应的命名空间中定义的符号,如果命名空间就没有引入,则不能使用。此时Android Studio会提示语法错误。比如,当我把xmlns:android=“ http://schemas.android.com/apk/res/android ” 这一条删掉之后,出现了下图所示的样子:

JVJNBrA.png!web

看到了吧? 所有的“android”变成了红色。

宽和高这两个属性必须存在,即:

android:layout_width="match_parent"
android:layout_height="match_parent"

它们是控件的宽和高,这两个属性必须存在!“match_parent”的意思是匹配父控件,就是与父控件的大小一样。ConstraitLayout是最外面的控件,它的大小必须与Activity一样,也就充满整个屏幕,所以值必须为“match_parent”。(我们前面讲过了,宽和高的值可以有三种:match_parent、wrap_content和固定值)。

以“tools”为前缀的属性,仅在界面设计器中起作用。这些属性都是用于设计界面时指示界面设计器的行为的,在App运行时它们是不起作用。比如 tools:context=“niuedu.com.andfirststep.MainActivity” ,这是告诉界面设计器此Layout中定义的界面与MainActivity这个类关连,其实真正的关联是由Java代码决定的,可以与这里不一致而不影响运行。

  • android:id="@+id/imageView2"

这个属性是为控件设置ID。ID是一个控件的唯一标志,此处的ID叫做“imageView2”。在一个Layout文件中的ID不能重复。“imageView2”是ID的名字,ID在App运行时其实是一个整数。如果一个控件要与另一个控件发生关系,那么就是通过ID来引用另一个控件。不仅控件要有ID,所有的资源都有ID,比如我们这个layout文件activity_main.xml,它的ID的名字就是文件名activity_main。

(摘自《Android9编程通俗演义》,京东淘宝及各大书店有售)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK