炫酷!从未见过如此Q弹的Switcher--修改部分内容

2020-08-09  本文已影响0人  StoneWay3

今天手机推给我一条消息,打开一看是个漂亮的控件。炫酷!从未见过如此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)
        }

经测试,现在动态修改控件的状态是没有报错的,也达到了我想要的效果,但是代码不是很优雅,希望各位看官给出一些更加优雅的解决方法,如果改的不对也希望作者见谅。

上一篇下一篇

猜你喜欢

热点阅读