程序员开发实例大全宝库

网站首页 > 编程文章 正文

这些Drawable的小技巧,身为Android开发的你,都知道吗?(下)

zazugpt 2024-10-22 18:35:12 编程文章 21 ℃ 0 评论
typora-root-url: ./img

Drawable 那么多种,但是场景就这么多

一、前言

本文为本系列的下篇上篇可以查看我头条号的另外一篇文章,查看 Drawable 的更多使用技巧。

三、具体实现

3.7 一个带按下效果的圆角按钮

这个没啥好说的,结合上面的效果就可以做到。你可以选择将它们写在不同的 Drawable 中,也可以在一个 xml 文件中,使用不同 item 来完成。Item 标签是可以支持内部再嵌套一个 Drawable 的。

3.8 带按下动画

按下效果除了使用 <selector> 做一个变色的效果之外,在 Api Level 21 之后,可以尝试使用 StateListAnimator 来实现一个 Material Design 的按下效果。

具体细节可以看看我之前的一篇文章:《利用 StateListAnimator 为你的点击加个动画吧!》

StateListAnimtor 使用起来非常的简单:

  1. 在 res 中创建一个 animator 目录。

  2. 在其中创建一个 xml 资源文件,就是一个 <selector/> 。

  3. 在 xml 资源中使用 <selector/> 中,定义我们 View 切换状态时候的动画,其实就是一个个 <objectAnimator/>。

  4. 最终将定义好的 animtor 通过 View 的 setStateListAnimator() 方法或者 android:stateListAnimator 属性,设置到 View 上。

举个例子。

首先在 /res/animtor 目录下,创建一个 btn_press_animator.xml 文件。

可以看到,和 StateListDrawable 一样,它也是通过 android:state_xxx 属性来定义不同的 Animator 的,如果存在多个 Animator ,可以使用 <set/> 标签将其包裹起来。 这里只是简单的在 state_pressed 的时候,做了一个缩小的动画。

然后,定义一个 View,为其设置属性 android:stateListAnimator="@animator/btn_press_animator"

来看看运行的效果:

3.9 三角形的 Drawable

假如有类似气泡提示的效果,如下图。

这样的效果,除了使用 9patch 来实现之外,还可以拿两个 Drawable 来拼接实现,这就需要一个圆角的矩形和一个三角的 Drawable。

三角 Drawable 的实现思路很清奇,是使用一个矩形的 shape ,通过使用 rotate 实现的旋转,来达到尖角的效果。

这个例子,就是上图的实现效果,是一个黄色的倒三角。如果想要的是一个正三角,只需要改变旋转的角度就可以了。

3.10 Tint 着色的 Drawable

在 Drawable 中,如果使用的是 BitmapDrawable 或者 NinePatchDrawable(9patch) 的资源的话,可以使用 android:tint 属性为其着色。

默认情况下,待着色的图片资源,会将其所有有颜色地方,都着色成我们指定的颜色,但是会保留透明度。

效果图如下,上面是原图,下面是使用 tint 之后的效果:

前面这里给的是 tint 默认的效果,还可以通过 android:tintMode 指定成不同的着色效果,例如下面将 android:tintMode 指定成 screen 之后,效果就完全不一样了。

3.11 铺平的 Drawable

有时候,作为一些有规则的图片的背景,可以使用一张很小的图片,然后设定 android:tileMode 属性,为其设定一个平铺的效果。

tileMode 可以指定多个属性值,用于指定不同的效果,以下就是两个比较常用的,上图使用的是 repeat ,下图使用的是 mirror。

3.12 状态可控的层级 Drawable

如果想要一个 ImageView 上,根据不同的条件显示不同的 Drawable ,可以使用 <level-list/> 。从名字上就可以看出它是一个带层级的 Drawable 组合,和 <selector/> 很像,但是区别在于它的显示状态是我们逻辑可控的。最常见的例子是拿它实现一个开关的灯泡,两态的图片,一个表示开灯,一个表示关灯,相信大家应该都见过例子。

今天举一个例子,给某个图标加红点的逻辑。当然我们也可以使用通过一个 FrameLayout 来实现,但是今天我们试试用 <level-list/> 来实现它。

这里使用一个 <level-list/> ,内部根据不同的 maxLevel 和 minLevel 来控制范围,这里只有两态,所以直接让它们取值一致。红点使用 <layer-list> 做了一个层叠,在右上角上,直接画了一个大小为 5dp 的红色圆点。

最终我们可以通过 ImageView 的

setImageLevel()

方法来控制显示的内容。

四、结语

到这里基本上涵盖了 Drawable 大部分的使用场景,在实际例子中学东西是印象最深刻的。当然,Drawable 的使用不止这些,还有一些例如拿 ClipDrawable 来实现一个切割进度的效果之类的,这种还需要写逻辑代码,就不在本文的范围内了,本文主要介绍一些静态能实现的效果。

你只需要掌握最基本的规则,什么 Drawable 能实现什么效果,具体碰到实际需求的时候,再来细致的研究,基本上微调一下就可以使用。

如果你还又什么更有意思的 Drawable 使用技巧,欢迎在文末留言,我们一起讨论一下,如有需要,会持续更新。

我准备了一些我整理的学习资料,包含:Android反编译、算法、设计模式、kotlin、Python、爬虫、虚拟机、Linux、计算机网络、Web项目源码。如果有兴趣可以私信我。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表