android技能树,Android技能树 — Drawable小结

前言

Android技能书系列:

Android基础知识

数据结构基础知识

算法基础知识

先上脑图:

159c0d77c3cd1a17a7155d1a200fd8a6.png

e1ac9d1188b8065d119138c08c241581.png

Drawable

6b1497c31e9d62b66b1bf14a51d45128.png

固有高/宽 & 大小

17983f341d7a450401b176b87fb7b729.png

我们知道平常使用最多的Drawable可能是图片了,我们知道一个图片的原本的尺寸,比如下面这个图:8b8f3ba8d6f3fc7d906892b972cc05bf.png

2519023cdd76471b8c8c47a5d1cbcfdf.png

大小为64X64,我们把它赋值给一个ImageView做为背景,同时这个ImageView设置的宽高都很大:

android:layout_width="300dp"

android:layout_height="300dp"

android:background="@drawable/back"/>

复制代码

17822aeef863152b3eaeb5ef20a98a0b.png

我们可以看到我们的图片实际上变的很大,所以最终的图片大小不一定是它固有宽/高。

所以对于这个图片,它的固有高/宽是它原本图片的大小,而实际上当最为我们ImageView的背景后,被拉伸至于View同等大小了。而且对于一些我们自己画的Drawable,不像图片那样,有自己原本的尺寸,比如我们自己写了个一个红色的Drawable,这时候它没有固定的尺寸,所以getIntrinsicWidth/height会返回-1。

7d77ae863d85b06053b79afafe6cf91f.png

Drawable分类

3d98574cfd33aec3db4d0cfb906fa89e.png

单个Drawable

c4035a3a800f8e15be6e41e98153f92b.png

BitmapDrawable:

2b5b3de3b8d093560aa69d469e962859.png

这里特别讲一下平铺模式,比如还是上面那个箭头的图片,我们写相应BitmapDrawable代码:

android:src="@drawable/back"

android:tileMode="repeat"

>

复制代码

android:id="@+id/logo"

android:layout_width="300dp"

android:layout_height="300dp"

android:background="@drawable/bitmapdrawable"/>

复制代码

850067d2d009710e107755b76b219d8c.png

这里有一点要注意:记住是赋给android:background,有些人写习惯了,可能就赋给了ImageView的android:src属性, 然后就不会有效果了。

ShapeDrawable

614efe7f4108457384683a601a06d75a.png

我们主要注意这几点:

当我们对描边进行设置虚线时候,android:dashWidth和android:dashGap只要有一个为0,虚线效果将不能生效。

比如:

android:shape="rectangle"

>

android:width="2dp"

android:dashGap="30dp"

android:dashWidth="40dp"/>

复制代码

我们可以看到效果是:3c575042f4386d1441cb6d270f993d8b.png

但是只要一个为0,就会变成

2bea938d856569a39d5b0d37eabd2e71.png

标签的设置:

定义内容离边界的距离,有些人说我设置了Padding,可是没有看出效果来,比如下面:

android:shape="rectangle"

>

android:width="2dp"

android:dashGap="0dp"

android:dashWidth="40dp"/>

/>

复制代码

e4bb23d2c7f731ee0798e3340a00dbb0.png

android:id="@+id/logo"

android:layout_width="300dp"

android:layout_height="300dp"

android:background="@drawable/bg"/>

复制代码

034bf13572c5e5f1e7e98e4fb045e62f.png

然后我们会发现,what啥都没变啊。其实我们要知道是内容离边界的距离。比如我们这里换成TextView就知道了:

android:id="@+id/logo"

android:layout_width="300dp"

android:layout_height="300dp"

android:text="aaaaaaaaaaaaaaaaaaaa"

android:background="@drawable/sdf"/>

复制代码

b21d5459fb4545e09ec750e5f144a03a.png

文字距离左边padding了130dp了。

标签的作用:

我们知道图片的话,有自己的固有宽/高,但是像这种ShapeBitmap,没有固有宽/高,getIntrinsicWidth/height获取到的是-1,所以我们如果设置了标签,获取到的就是你设置的值了。

android:width="100dp"

android:height="100dp"/>

复制代码

InsetDrawable:

42e34f94a0d4b251a526cda419e2cdec.png

可以把其他的Drawable内嵌到自己里面,然后在可以设置四周的距离。

比如我们有时候在状态栏处,点击返回按钮,但是美工切图的返回键有点小,直接设置进去,有时候用户按返回键会按不到,一种是把ImageView的宽高设置的大一点,另外一种可以使用这个InsetDrawable。

android:drawable="@drawable/back"

android:insetLeft="20dp"

android:insetTop="20dp"

android:insetRight="20dp"

android:insetBottom="20dp"

>

复制代码

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/insetdrawable"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/back"

/>

复制代码

我们可以查看设置了InsetDrawable和直接设置返回按钮图片的样子:6e672af445e234765441f4ffddd68668.png

ScaleDrawable:

414677e42f43f871041b10d48fed1543.png

可以缩放的Drawable,效果如下:

1cb5495b272b61bca8a1ae64036baf64.gif

ClipDrawable:

560185059ce2dbaf61b8467296c595e9.png

可裁剪的Drawable,效果如下:

65ad77654562f06889d300e96d5a2225.gif

c483af2c782b2ff3020c9044f846fad9.png

Drawable集合

fe443ac8c65eecf26a58673d94681cb1.png

Drawable集合的意思是这些Drawable可以放多个Drawable,比如可以放多个图片资源在里面。

LayerDrawable

4d77a6200297bf6c5f35e1b56ab8b04f.png

它是一种层次化的Drawable集合,通过不同的Drawable放置在不同的层上面达到了叠加后的效果。并且下面的item覆盖上面的item。

792f85b206769a822aa123f7a6ba960d.png

比如这个图片上的搜索框:

b58d2915a807306ea6a98d9dd013c820.png

我们可以使用LayerDrawable来实现,只需要把中间的放大镜和文字变成一个图片,比如40ad55569c564b77684de8775291a5b1.png

然后背景为:

android:shape="rectangle">

复制代码

70d42115db50e502be151968427aeb7c.png

最后使用LayerDrawable:

android:drawable="@drawable/search_bg"/>

android:right="60dp"

android:left="60dp"

android:top="10dp"

android:bottom="10dp"

/>

复制代码

效果图为:

84ab1dc7d73991edee5dd0513f1b78fe.png

具体可以参考以下文章:

StateListDrawable

354f02e79551ad26488c8d5a1bf41e00.png

这个估计是大家用的最多的,通常用在不同的按钮上,当按下是什么背景,送开的时候是什么背景,当处于不可点击的时候是什么背景。

f5298e62b2a70cde1d88d4d92db570de.gif

这里额外说一个注意点:

系统根据View状态从selector中按照从上到下的顺序查找选择对应item,所以默认的item放在最后一条,这样上面都不符合时候,会匹配上默认的item,因为默认的item不附带状态,可以匹配View的任何状态

LevelListDrawable

23df28edf83b8ebc5a776a311bed4e0b.png

这个有点像StateListDrawable,在不同Level下会使用不同的图,不同的是,它是根据每个item设置的Level范围来确定的。

TransitionDrawable

0fe2d1004a07ef4086ad63a8e1a406ff.png

主要是用来实现二个Drawable之间的淡入淡出,很容易就想到了animation动画来实现,但是发现使用动画的话,但是在调用statAnimation的时候因为图片已经显示了,再播放一次动画其实会导致细微的闪烁效果。所以可以使用TransitionDrawable来实现。

如下效果:1e68dd84a5ac90ffd76aa2d21987c3b5.gif

结语

其实都是很基础的东西。但是就当自己做个总结了。

PS:这块的Drawable内容参考《Android 开发艺术探索》。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值