关于 Drawable(一)

这里的 Drawable 指的是 Android 项目中 res/drawable 下的资源。

例如:

.9 图、 .png 、 .jpg 等位图文件, xml 格式的可绘制对象等等。

位图文件

关于位图文件,Google 官方首先推荐使用的是 .png ,其次是 .jpg ,以及不建议使用的 .gif 文件。

Tip: 当出现如下错误的时候,

Error:Execution failed for task ':app:mergeDebugResources'.
Error: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: `

可能是你将 .jpg 格式图片的后缀改成了 .png 放到 drawable 目录下了。

另外,drawable 中的文件名称格式有一定的要求

File-based resource names must contain only lowercase a-z, 0-9, or underscore

位图文件的使用很简单:

1
2
3
4
<ImageView
android:layout_width="50dp"
android:src="@drawable/bitmap_test"
android:layout_height="50dp"/>

或者用 background

其中 srcbackground 的主要区别是,前者不会根据 ImageView 控件的大小拉伸原图。

src 的样式可以通过 scaleType 设置,而 alpha 属性可以作用于 background 。两者可以同时作用,src 在前,background 在后。

关于 scaleType 的不同类型,可以用一张图来说明:

屏幕快照 2017-05-03 下午5.28.55

其中 centerCropcenter 用的最多。

XML 中 的位图

有以下这些属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/huaji"
android:alpha="100"
android:antialias="true"
android:autoMirrored="true"
android:dither="true"
android:filter="true"
android:gravity="bottom"
android:tileMode="repeat"
android:mipMap="true"
android:tileModeX="mirror"
android:tileModeY="mirror"
android:tintMode="src_over"
android:tint="null"
/>
  • src 是一定要求有的,是图片资源地址。
  • alpha 图片的透明度。

  • antialias 是否抗锯齿。

  • autoMirrored 否是镜像反转,当布局是从右往左的时候才有用。

  • dither 是否使用位图抖动,当图片像素高于设备配置的时候会用到,它能让图片的显示更加平滑,具体可以点这里

下面的几张图片中, 1 是原图,2 和 3 都是用的同一个调色板,但是 3 用了位图抖动算法,看上去更加的平滑。

屏幕快照 2017-05-03 下午8.06.48

  • filter 当图片进行了压缩或者拉伸时,使用该属性可以使得图片的外观更加的平滑。

  • gravity 这个很理解,和普通的控件中也有,该属性对应的值有点 lefttopright 之类的,用来设置图片在控件中的位置或者说是对齐方式。

  • tileMode tile 是瓷砖,瓦片的意思。该属性用来设置图片的平铺方式,有四种不同的值:

    • disable 默认值,无平铺方式

    • repeat 重复的铺满,如下图

      屏幕快照 2017-05-03 下午4.37.48

    • mirror 镜像的方式,如下图

屏幕快照 2017-05-03 下午4.37.57

  • clamp 效果如下图,其实拉伸的是图片最边缘的那个像素点上的值。
![屏幕快照 2017-05-03 下午4.38.09](http://on9hzfn6s.bkt.clouddn.com/屏幕快照 2017-05-03 下午4.38.09.png)
  • mipMap 这个属性有点邪乎,可以参考里面),大致意思应该是,当你要绘制的 bitmap 小于 50% 原图的时候,开启该属性可以提供更高质量的画质。(但是使用该属性,需要额外的内存开销,并且是 Android 4.2 及以上才能用,而且!用了不一定真的有用哦,它只是给渲染器的一个建议)

  • tileMoteXtileMoteY 都是 Android 5.0 及之后才有的属性,和 tileMote 的性质一样,只是多了方向上的区别。

  • tintMode 也是 Android 5.0 及之后才有的,这个属性是配合 tint 来一起使用的。

    屏幕快照 2017-05-03 下午8.37.25

我们来玩一把,在 android:tint="#0f0" 的条件下,改变 tintMode

  • 当值为 src_over 或者 src_in 或者 src_atop 的时候得到的图形都一样(这里一开我也是用的滑稽的图片,但是由于滑稽图是 .jpg 格式的,于是在这三种模式下就会变成全绿,所以用了 .png 的图片演示)

    屏幕快照 2017-05-03 下午8.59.59

  • 当值为 add 的时候

    屏幕快照 2017-05-03 下午8.46.42

  • 当值为 multiply 的时候

    屏幕快照 2017-05-03 下午8.47.03

  • 当值为 screen 的时候

    屏幕快照 2017-05-03 下午8.47.35

参考链接

Google 官方 API

Android 样式的开发:drawable 汇总篇

Android 入门 —— Drawable 与对应的资源 xml 的应用

Android 5.x 新特性之 elevation (阴影),tinting(着色)以及 clipping(剪裁)

Andorid-Tint使用与原理解析