在textView中添加 drawable

在textView中添加 drawable,第1张

TextView 有这些属性: drawableLeft是指定drawable放在文本的左边,其他类推drawableStart与drawableLeft类似drawablePadding指定文本和drawable之间padding

TextView他有一个方法

public void setCompoundDrawables (Drawable left, Drawable top, Drawable right, Drawable bottom)

这个方法呢,就是可以在Java代码动态的画 左上右下几个方向

类似于xml中的 android:drawableLeft="@drawable/icon"

android:drawableTop="@drawable/icon"

android:drawableRight="@drawable/icon"

android:drawableButtom="@drawable/icon"

具体在代码中的用法是:

Drawable drawable = getResources().getDrawable(R.drawable.spinner_checked)

drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight())//设置边界

titleTv.setCompoundDrawables(null, null, drawable, null)//画在右边

也还可以通过这个方法实现

public void setCompoundDrawablesWithIntrinsicBounds (Drawable left,

Drawable top, Drawable right, Drawable bottom)

介绍一个带加载功能的按钮控件的实现原理,加载动画来自于 CircularProgressDrawable

圆环加载就是用setCompoundDrawables放到TextView的drawablewStart中,将文字的Gravity设置Center

结果效果是这个亚子的:

看来实际的效果与我们想象中的不太一样,原来Drawable在一开始我们并没有设置它的位置

那么我们应该如何将drawable居中显示文字的旁边?

用一张草图表示大概是这个样子的:

中间那部分就是我们想要的位移,通过下面的计算就可以得到所要的位移,

而getWidth()这些参数需要在Layout之后才可以得到,

所以我们干脆在onDraw中对drawable进行位移

需要特别注意的一点是,我们需要事先将Drawable的Bounds(尺寸和位置)保存起来作为参考,原因是如果在原来Drawable的Bounds基础上偏移,在每次onDraw()时会不断向右偏移。

例如第一次onDraw()偏移是5,第二次onDraw()是在原来的5再次偏移5。

似乎看起来还是有一点点别扭,从效果上看出文字和drawable是一起居中的,

看了一下TextView的源码发现setCompoundDrawables后会先划分出TextView左侧及右侧drawable需要的空间,

然后再按照剩余的空间来居中显示,

所以最后得到通过位移得到的效果是文字和drawable一起居中显示的。

为了让文字在整个布局的中间,我们可以通过平移画布来实现文字的居中效果

主要也是通过 getLayoutParams().width和 getLayoutParams().height来改变布局的尺寸,

在开始收缩时先将文本设置为空字符、drawablePadding设为0,然后再开始收缩动画,具体的方式可以自行尝试

本文介绍了带加载效果的按钮实现整体思路,然鹅如果想要真正使用并没有文中介绍的那么简单,还需要考虑各种细节和因素。(头发又变少了呢~)

最后可以看下完整实现的效果,已经上传到github上了( LoadingButton ),加了一些功能(本来只是想简单实现一个按钮旁边有一个Loading,结果功能越写越多就变成这样,苦笑~)

有兴趣朋友可以给个星星,提提issue喝喝茶,我是新来的第一次写这种文章请多多包涵呀。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11422618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存