iielse / switchbutton

iOS风格SwitchButton。 只涉及到一个类文件,异常容易集成进入你的项目。支持开关的"延时和回滚"操作。only one class file, very easy to integrate into your program. support the delay operation and rolling back action of the switch
674 stars 192 forks source link

点击后通过网络请求更新状态异常 #17

Open aigc-in-all opened 7 months ago

aigc-in-all commented 7 months ago
switcher.setOnStateChangedListener(object : SwitchView.OnStateChangedListener {
    override fun toggleToOn(view: SwitchView?) {
        viewModel.doSomethingAsync(1)
    }

    override fun toggleToOff(view: SwitchView?) {
        viewModel.doSomethingAsync(0)
    }
})

viewModel.state.observe(this) {
    switcher.setOpen(it)
}

如上场景,doSomethingAsync里会异步执行网络请求,如果请求成功会更新state (这是一个LiveData),更新成功后再通过observe 更新 open 状态。这是一个很正常的流程。

但是,如果网络请求失败,我希望什么都不做,即继续保持之前的状态。也即不会调用 switcher.setOpen 方法,但是我发现一个问题,再次点击无反应

查看源码,发现这里有问题:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if ((state == STATE_SWITCH_ON || state == STATE_SWITCH_OFF) && (sAnim * bAnim == 0)) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    return true;
                case MotionEvent.ACTION_UP:
                    lastState = state;

                    bAnim = 1;
                    if (state == STATE_SWITCH_OFF) {
                        refreshState(STATE_SWITCH_OFF2);
                        listener.toggleToOn(this);
                    } else if (state == STATE_SWITCH_ON) {
                        refreshState(STATE_SWITCH_ON2);
                        listener.toggleToOff(this);
                    }

                    if (mOnClickListener != null) {
                        mOnClickListener.onClick(this);
                    }
                    break;
            }
        }
        return super.onTouchEvent(event);
    }

这个if 进不去了,因为此时 state 状态为 STATE_SWITCH_OFF2STATE_SWITCH_ON2 ,那么这两个状态有什么用?

或者我的用法有什么问题吗?

iielse commented 7 months ago

用这个toggleSwitch方法收尾延时变化