赞
踩
ImageView 和 TextView 一样是直接继承自 View 的基础控件,顾名思义,TextView 用来展示文本,那 ImageView 就是用来展示图片的了。因为 Android 碎片化严重,在 Android 中图片很容易使用但是却很难控制。不同的机型有不同的屏幕尺寸,导致对图片的适配要求很高。但是 Android 系统为我们提供了强大的图片控件,学好 ImageView 是做好 Android UI 适配的第一步。
ImageView 的功能说起来很简单,就是在屏幕上展示一张图片,但是如何展示就很有学问了,先来看看相关的属性:
前三个属性是重中之重,其中android:backgroud
在之前的控件中已经多次出现,这再次拿出来并不是因为它和其他控件的background
有所不同,只是因为很多人会把它和android:src
搞混淆。对于 ImageView 而言,android:background
的属性和其它控件含义一样表示背景样式,同样可以设置成图片文件或者背景资源;而android:src
是 ImageView 特有的一个属性,用来设置 ImageView 要展示的图片;
剩下一个android:scaleType
也是一个难点,它就是帮助我们做图片适配的,我们通过android:scaleType
告诉系统,当图片尺寸和 ImageView 尺寸不同时,系统该如何帮助我们对图片进行缩放。
首先看看最简单直接的用法:
- <?xml version="1.0" encoding="utf-8"?>
- <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:background="#59A004"
- android:src="@drawable/image" />
我们直接在根布局中添加一个 ImageView,设置android:src
为图片文件,android:background
设置为绿色。
这里可以对android:src
和android:background
有一个定性的认识:android:src
表示ImageView的前景,而android:backgound
设置的是ImageView的背景,对应的Java代码是:
- setImageDrawable( ); // 设置ImageView的前景
- setBackgroundDrawable( ); // 设置ImageView的背景
前面有提到,android:background
也可以直接设置成图片,那么在设置成图片的场景下,它和android:src
是否是一样的呢?我们来进一步考察一下:
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout 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"
- tools:context=".MainActivity">
-
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="#CC1010"
- android:src="@drawable/image" />
-
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:background="@drawable/image" />
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="bottom"
- android:background="#CC1010"
- android:src="@drawable/image" />
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="bottom|right"
- android:background="@drawable/image" />
- </FrameLayout>
在上面的代码中,我们在屏幕的 4 个角放置了 4 个 ImageView ,分别从尺寸大小、图片设置方式两个维度做了区分,为了方便对比,在使用android:src
属性之后,通过android:background
加了红色的背景。
我们首先看上排的两个图片效果:
wrap_content
android:src
右边一个用的是android:background
200dp
android:src
右边一个用的android:background
这样一来就可以得出结论:
android:background
设置图片和使用android:src
效果一样android:src
会保留图片原始比例并居中显示,而用android:background
设置的会将图片拉伸直至铺满整个 ImageView。这里有一个疑问,为什么尺寸不一致的时候,Android 系统是采取居中显示,而不是其他的样式呢?这就是我们接下来要说明的属性了。
特别注意以上说的都是尺寸比例,并非长和宽的值。
在实际开发过程中,大多数场景我们都是没办法保证每张图片的尺寸比例都一致的,所以需要有大量的缩放和裁剪,如何让缩放裁剪的适配更加得心应手,就需要用到 ImageView 的另一个关键属性:android:scaleType
。
这里我之所以称之为缩放裁剪模式,就是要强调这个属性的两个维度:是否改变图片比例以及超出部分如何裁剪。其实scaleType
这个属性要规范的就是这两个维度,下面就从这两个维度来学习:
android:background
的样式。改比例、不裁剪。以上的样式都还比较好理解,下面我们来写段代码测试一下几种具有代表性的样式:
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout 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"
- tools:context=".MainActivity">
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:background="#CC1010"
- android:scaleType="matrix"
- android:src="@drawable/image" />
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="right"
- android:background="#CC1010"
- android:scaleType="fitXY"
- android:src="@drawable/image" />
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="center_vertical"
- android:background="#CC1010"
- android:scaleType="fitStart"
- android:src="@drawable/image" />
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="center_vertical|right"
- android:background="#CC1010"
- android:scaleType="center"
- android:src="@drawable/image" />
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="bottom"
- android:background="#CC1010"
- android:scaleType="centerCrop"
- android:src="@drawable/image" />
-
- <ImageView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="bottom|right"
- android:background="#CC1010"
- android:scaleType="centerInside"
- android:src="@drawable/image" />
- </FrameLayout>
上面我们介绍了 8 种属性,其中fitStart
、fitCenter
以及fitEnd
三个属性只是摆放的位置不同,其余完全一样,所以只选择fitStart
做样例。那么去掉fitCenter
和fitEnd
之后,按照顺序我们对于 6 种属性按左右排列了 6 张图片
ImageView 和 TextView 都是基础 View,可以围绕它们开发出很多有意思好用的控件。对于 ImageView 而言,最复杂的就是缩放裁剪模式,这里就要关注的两个点:比例是否改变以及是否裁剪,这样相信就可以应对未来纷繁杂乱的图片尺寸的适配了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。