今天手机推给我一条消息,打开一看是个漂亮的控件。炫酷!从未见过如此Q弹的Switcher。下载了源码,很漂亮还是kotlin写的。可是我在运行的时候发现了一个bug:就是大家都知道,Switcher在使用的时候有很多的情况就是等到有可运算结果才会改变状态,所以我在原来的setOnCheckedChangeListener监听里面设置switcher_x.setChecked(checked)状态的时候,报错了,报的是动画异常,而且就算是没有报错,也是只要一点击就改变状态,这也不是我想要的效果。所以我就大胆的做了一下修改:
(1)在Switcher。kt文件中,修改了点击事件:
init {
attrs?.let { retrieveAttributes(attrs, defStyleAttr) }
// setOnClickListener { setChecked(!isChecked) }
setOnClickListener { }
}
(2)注释掉了setOnCheckedChangeListener方法:
// protected open var listener: (() -> Unit)? = null
//
// /**
// * Register a callback to be invoked when the isChecked state of this switch
// * changes.
// *
// * @param listener the callback to call on isChecked state change
// */
// open fun setOnCheckedChangeListener(listener: () -> Unit) {
// this.listener = listener
// }
(3)修复SwitcherC。kt中的相关方法:
animatorSet?.apply {
doOnStart {
// listener?.invoke()
}
override fun setChecked(checked: Boolean, withAnimation: Boolean) {
if (this.isChecked != checked) {
this.isChecked = checked
if (withAnimation && width != 0) {
animateSwitch()
} else {
animatorSet?.cancel()
if (!checked) {
currentColor = offColor
iconProgress = 1f
} else {
currentColor = onColor
iconProgress = 0f
}
// listener?.invoke()
}
}
}
(4)同理修复SwitcherX。kt中的相关方法:
animatorSet?.apply {
doOnStart {
// listener?.invoke()
}
override fun setChecked(checked: Boolean, withAnimation: Boolean) {
if (this.isChecked != checked) {
this.isChecked = checked
if (withAnimation && width != 0) {
animateSwitch()
} else {
animatorSet?.cancel()
if (!checked) {
currentColor = offColor
iconProgress = 1f
} else {
currentColor = onColor
iconProgress = 0f
}
// listener?.invoke()
}
}
}
(5)最后使用方法:没有了原来的setOnCheckedChangeListener的方法
switcher_x.setOnClickListener {
var isChecked=getRandomBoolean()
Log.e("###",isChecked.toString())
switcher_x.setChecked(isChecked)
switcher_c.setChecked(!isChecked)
}