-
-
Notifications
You must be signed in to change notification settings - Fork 151
Item选中事件
angcyo edited this page May 12, 2022
·
8 revisions
DslTabLayout
点击事件, 由DslSelector
组件完成.
可以用过DslTabLayout
的属性tabLayoutConfig
配置, tabLayoutConfig
内部已有默认实现赋值, 亦可修改.
DslTabLayoutConfig
继承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
在DslSelectorConfig
上, 增加了对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;
}
});