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

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

作者: StoneWay3 | 来源:发表于2020-08-09 12:16 被阅读0次

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

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/rturrktx.html