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喝喝茶,我是新来的第一次写这种文章请多多包涵呀。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)