Skip to content

Item选中事件

angcyo edited this page May 12, 2022 · 8 revisions

DslTabLayout点击事件, 由DslSelector组件完成.

可以用过DslTabLayout的属性tabLayoutConfig配置, tabLayoutConfig内部已有默认实现赋值, 亦可修改.

DslTabLayoutConfig继承DslSelectorConfig.

DslSelectorConfig 配置项

/**
 * Dsl配置项
 * */
open class DslSelectorConfig {

    /**
     * 用来初始化[itemView]的样式
     * [onSelectItemView]
     * */
    var onStyleItemView: (itemView: View, index: Int, select: Boolean) -> Unit =
        { _, _, _ ->

        }

    /**
     * 选中[View]改变回调
     * @param fromView 单选模式下有效, 表示之前选中的[View]
     * @param reselect 是否是重复选择, 只在单选模式下有效
     * */
    var onSelectViewChange: (fromView: View?, selectViewList: List<View>, reselect: Boolean, fromUser: Boolean) -> Unit =
        { _, _, _, _ ->

        }

    /**
     * 选中改变回调
     * [onSelectViewChange]
     * @param fromIndex 单选模式下有效, 表示之前选中的[View], 在可见性[child]列表中的索引
     * */
    var onSelectIndexChange: (fromIndex: Int, selectIndexList: List<Int>, reselect: Boolean, fromUser: Boolean) -> Unit =
        { fromIndex, selectList, reselect, _ ->
            "选择:[$fromIndex]->${selectList} reselect:$reselect".logi()
        }

    /**
     * 当需要选中[itemView]时回调, 返回[true]表示拦截默认处理
     * @param itemView 操作的[View]
     * @param index [itemView]在可见性view列表中的索引. 非ViewGroup中的索引
     * @param select 选中 or 取消选中
     * @param fromUser 是否是用户产生的回调, 而非代码设置
     * @return true 表示拦截默认处理
     * */
    var onSelectItemView: (itemView: View, index: Int, select: Boolean, fromUser: Boolean) -> Boolean =
        { _, _, _ ->
            false
        }
}

onSelectItemView就是child的选中回调.

DslTabLayoutConfig 配置项

DslTabLayoutConfigDslSelectorConfig上, 增加了对child的控制.

比如, 颜色配置, 滑动配置等.

/**是否开启文本颜色*/
var tabEnableTextColor = true
    set(value) {
        field = value
        if (field) {
            tabEnableIcoColor = true
        }
    }
/**是否开启颜色渐变效果*/
var tabEnableGradientColor = false
    set(value) {
        field = value
        if (field) {
            tabEnableIcoGradientColor = true
        }
    }
/**选中的文本颜色*/
var tabSelectColor: Int = Color.WHITE //Color.parseColor("#333333")
/**未选中的文本颜色*/
var tabDeselectColor: Int = Color.parseColor("#999999")
/**是否开启Bold, 文本加粗*/
var tabEnableTextBold = false
/**是否开启图标颜色*/
var tabEnableIcoColor = true
/**是否开启图标颜色渐变效果*/
var tabEnableIcoGradientColor = false
/**选中的图标颜色*/
var tabIcoSelectColor: Int = NO_COLOR
    get() {
        return if (field == NO_COLOR) tabSelectColor else field
    }
/**未选中的图标颜色*/
var tabIcoDeselectColor: Int = NO_COLOR
    get() {
        return if (field == NO_COLOR) tabDeselectColor else field
    }
/**是否开启scale渐变效果*/
var tabEnableGradientScale = false
/**最小缩放的比例*/
var tabMinScale = 0.8f
/**最大缩放的比例*/
var tabMaxScale = 1.2f
var tabGradientCallback = TabGradientCallback()

具体可以参考源码.

大致使用代码

kotlin使用如下:

val dslTabLayout = viewHolder.v<DslTabLayout>(R.id.tab_layout)
dslTabLayout?.configTabLayoutConfig {
    //选中view的回调
    onSelectViewChange = { fromView, selectViewList, reselect ->
        val toView = selectViewList.first()
        if (reselect) {
            //重复选择
        }
    }
    //选中index的回调
    onSelectIndexChange = { fromIndex, selectIndexList, reselect ->
        val toIndex = selectIndexList.first()
    }
}

//3.2.4后也可以使用新的api

dslTabLayout?.observeIndexChange { fromIndex, toIndex, reselect, fromUser ->
    
}

java 使用如下:

如果不是kotlin工程, 则需要引入kotlin-stdlib库:

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
tabLayout.configTabLayoutConfig(new Function1<DslTabLayoutConfig, Unit>() {
    @Override
    public Unit invoke(DslTabLayoutConfig dslTabLayoutConfig) {
        dslTabLayoutConfig.setOnSelectItemView(new Function4<View, Integer, Boolean, Boolean, Boolean>() {
            @Override
            public Boolean invoke(View itemView, Integer index, Boolean select, Boolean fromUser) {
                //当需要选中itemView时, 触发的回调.
                //返回true, 拦截库中的默认处理.
                return false;
            }
        });
        dslTabLayoutConfig.setOnSelectViewChange(new Function4<View, List<? extends View>, Boolean, Boolean, Unit>() {
            @Override
            public Unit invoke(View fromView, List<? extends View> selectViewList, Boolean select, Boolean fromUser) {
                //fromView 表示之前选中的view, 多选模式不支持.
                //selectViewList 表示目前选中view的集合, 单选模式列表里面只有一个,可以使用selectViewList.get(0)获取.
                return null;
            }
        });
        dslTabLayoutConfig.setOnSelectIndexChange(new Function4<Integer, List<Integer>, Boolean, Boolean, Unit>() {
            @Override
            public Unit invoke(Integer fromIndex, List<Integer> selectIndexList, Boolean select, Boolean fromUser) {
                //参考setOnSelectViewChange
                //只不过对象从view,变成了view在ViewGroup中的索引
                return null;
            }
        });
        return null;
    }
});