Android中给ImageView添加背景资源时,有两种方式可以选择,第一种是使用android:src添加,另一种是使用android.background添加,这两种添加方式虽然都能够起作用,但是在实际的使用效果中还是有些许的区别。
在这里只介绍背景资源为使用xml文件画出的图片加载。
首先我们使用以下xml文件画出一个带边框的方形:
在drawable文件中创建文件focus_style.xml
<?xml version="1.0" encoding="utf-8"?>`
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<gradient
android:endColor="@android:color/holo_blue_dark"
android:startColor="@android:color/holo_blue_bright" />
</shape>
</item>
</layer-list>
在这个xml文件中我们画出了一个渐变色块。然后在布局文件中添加一个 <ImageView>
标签,在该标签中使用android:src
与android:background
来加载图片资源的效果是一样的。
但是如果我们在drawable文件中绘制图片的时候使用了相对的位置信息,如下所示:(在上图中添加了两个item
)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient
android:endColor="@android:color/holo_blue_dark"
android:startColor="@android:color/holo_blue_bright" />
</shape>
</item>
<item>
<shape>
<solid android:color="@android:color/transparent"/>
<stroke android:width="8dp"
android:color="@color/colorAccent"/>
</shape>
</item>
<item android:bottom="8dp"
android:left="8dp"
android:top="8dp"
android:end="8dp">
<shape>
<solid android:color="@android:color/transparent"/>
<stroke android:width="8dp"
android:color="#000"/>
</shape>
</item>
</layer-list>
这种情况下两种资源加载方式便不尽相同:
使用src加载的效果如下:
使用background加载的效果如下:
两种加载效果并不相同,其中很重要的原因在于(Android版本的原因):
在Android 6及以前的系统中,可以认为
background是作为背景显示的,而src是作为内容填充显示的,可以被认为是前景。
background可以为控件设置图片或者颜色,设置的大小时match_parent
或者固定值时,该图片将会被拉伸以填充满整个控件.如果设置成wrap_content
时,则会显示原本的大小.上面的实例中,我们设置了<ImageView>
的长宽,因此该图片将会以填充的方式显示。
如果background设置为颜色值,那么<ImageView>
整个区域都会被该颜色值填充。当<ImageView>
仅仅设置了背景颜色而没有设置src,且宽或者高被设置为wrap_content时,则该View将不会显示。
使用background添加背景资源时,所添加的背景能够充满整个控件的大小,如果当前使用的资源不能够满足控件大小时,将会把当前资源自动进行拉伸以满足添加背景资源的需要。但是在使用src填充是,如果填充的资源没有固定的大小,那么src将会按照自己的方式将整个控件占满,不会考虑多层叠加的效果
以上的结果是在Android6.0的版本上进行编译运行的,但是在Android7.0以上的版本上已经修复了这个bug,因此在7.0以上的版本上无论使用src还是background,都能设置成上图二中这样的多层描边效果。
因此当应用要跨Android版本使用时,要注意这个问题,避免因为设置图片资源出现布局错误的情况。