Skip to content

侧滑菜单

angcyo edited this page May 12, 2020 · 1 revision

版本2.4.0之后, 支持左/右侧滑菜单.

使用方式

1.需要使用SwipeMenuHelper组件.

SwipeMenuHelper.install(recyclerView)

2.布局结构

<ViewGroup>
    <ViewGroup>
        <!--菜单布局, 必须放在index=0的位置-->
    </ViewGroup>
    <ViewGroup>
        <!--内容层-->
    </ViewGroup>
    ...
</ViewGroup>

注意:对布局的唯一要求就是, 必须包含2个及以上的view.且不要使用Gravity margin等定位属性. 默认FrameLayout布局定位即可.

3.菜单填充和事件

DslAdapterItemonItemBind方法中, 自行addView removeView集合, 点击事件处理和普通view一致.

库中提供了扩展方法, 用于ViewGroup添加DslAdapterItem的支持.

使用方法:

itemHolder.group(R.id.menu_wrap_layout)?.resetDslItem(listOf(DslAdapterItem(), DslAdapterItem(), DslAdapterItem()))

高级用法

DslAdapterItem侧滑相关属性:

 /**用于控制打开or关闭菜单*/
 var _itemSwipeMenuHelper: SwipeMenuHelper? = null

 /**是否激活侧滑菜单.需要[SwipeMenuHelper]的支持*/
 var itemSwipeMenuEnable = true

 /**支持滑动菜单打开的手势方向.
  * [ItemTouchHelper.LEFT]
  * [ItemTouchHelper.RIGHT]
  * */
 var itemSwipeMenuFlag = ItemTouchHelper.LEFT

 /**滑动菜单滑动的方式*/
 var itemSwipeMenuType = SWIPE_MENU_TYPE_DEFAULT

如果不喜欢库中的侧滑效果, 可以自行实现itemSwipeMenuTo方法:

库中的默认实现如下:

open fun onItemSwipeMenuTo(itemHolder: DslViewHolder, dX: Float, dY: Float) {
    val parent = itemHolder.itemView
    if (parent is ViewGroup && parent.childCount > 1) {
        //菜单最大的宽度, 用于限制滑动的边界
        val menuWidth = itemSwipeWidth(itemHolder)
        val tX = clamp(dX, -menuWidth.toFloat(), menuWidth.toFloat())
        parent.forEach { index, child ->
            if (index == 0) {
                if (itemSwipeMenuType == SWIPE_MENU_TYPE_FLOWING) {
                    if (dX > 0) {
                        child.translationX = -menuWidth + tX
                    } else {
                        child.translationX = parent.mW() + tX
                    }
                } else {
                    if (dX > 0) {
                        child.translationX = 0f
                    } else {
                        child.translationX = (parent.mW() - menuWidth).toFloat()
                    }
                }
            } else {
                child.translationX = tX
            }
        }
    }
}