feat(swipe): 接入 SwipeRevealLayout 并统一侧滑删除交互

引入 SwipeRevealLayout 替换原有滑动删除方案,修复点击冲突与开合状态问题,并在菜品列表与食材列表中统一删除确认与侧滑行为。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-29 18:18:32 +08:00
co-authored by Claude Sonnet 4.6
parent a958262dff
commit d1569faa85
12 changed files with 1782 additions and 205 deletions
+95 -71
View File
@@ -1,85 +1,109 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.shuwei.dish.match.view.swipereveallayout.SwipeRevealLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/swipeRevealLayout"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="15dp"
android:background="@drawable/shape_white_fb_15_corners">
app:dragEdge="right">
<TextView
android:id="@+id/tvDishName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="1"
android:textColor="@color/black"
android:textSize="30sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/tvDishType"
app:layout_constraintEnd_toStartOf="@+id/tvDishWeight"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="雪菜" />
<FrameLayout
android:id="@+id/layoutDelete"
android:layout_width="160dp"
android:layout_height="120dp"
android:background="@drawable/bg_swipe_delete">
<TextView
android:id="@+id/tvDishType"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="1"
android:textColor="@color/black999"
android:textSize="26sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/tvDishName"
app:layout_constraintStart_toStartOf="@id/tvDishName"
app:layout_constraintTop_toBottomOf="@id/tvDishName"
tools:text="主辅材:主材" />
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
android:contentDescription="删除"
android:src="@drawable/ic_trash_white" />
<ImageView
android:id="@+id/ivOperateIcon"
android:layout_width="80dp"
android:layout_height="60dp"
tools:src="@drawable/ic_dish_selected"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/ivClearIcon"
android:layout_marginEnd="10dp"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
</FrameLayout>
<ImageView
android:id="@+id/ivClearIcon"
android:layout_width="80dp"
android:layout_height="60dp"
android:src="@drawable/ic_delete"
android:layout_marginEnd="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clBlock"
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@drawable/shape_white_fb_15_corners">
<TextView
android:id="@+id/tvDishWeight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="30dp"
android:textColor="@color/dish_green"
android:textSize="32sp"
android:textStyle="bold"
android:hint="-"
android:textColorHint="@color/gray_d6"
app:layout_constraintBottom_toBottomOf="@id/ivOperateIcon"
app:layout_constraintEnd_toStartOf="@id/ivOperateIcon"
app:layout_constraintTop_toTopOf="@id/ivOperateIcon"
tools:text="375克"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tvDishName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="1"
android:textColor="@color/black"
android:textSize="30sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/tvDishType"
app:layout_constraintEnd_toStartOf="@+id/tvDishWeight"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="雪菜" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/tvDishType"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="1"
android:textColor="@color/black999"
android:textSize="26sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/tvDishName"
app:layout_constraintStart_toStartOf="@id/tvDishName"
app:layout_constraintTop_toBottomOf="@id/tvDishName"
tools:text="主辅材:主材" />
<ImageView
android:id="@+id/ivOperateIcon"
android:layout_width="80dp"
android:layout_height="60dp"
android:layout_marginEnd="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/ivClearIcon"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_dish_selected" />
<ImageView
android:id="@+id/ivClearIcon"
android:layout_width="80dp"
android:layout_height="60dp"
android:layout_marginEnd="10dp"
android:src="@drawable/ic_delete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tvDishWeight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="30dp"
android:hint="-"
android:textColor="@color/dish_green"
android:textColorHint="@color/gray_d6"
android:textSize="32sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/ivOperateIcon"
app:layout_constraintEnd_toStartOf="@id/ivOperateIcon"
app:layout_constraintTop_toTopOf="@id/ivOperateIcon"
tools:ignore="HardcodedText"
tools:text="375克" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.shuwei.dish.match.view.swipereveallayout.SwipeRevealLayout>
+76 -50
View File
@@ -1,61 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.shuwei.dish.match.view.swipereveallayout.SwipeRevealLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/clBlock"
android:id="@+id/swipeRevealLayout"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="7dp"
android:layout_marginEnd="15dp"
android:layout_marginTop="7dp"
android:layout_marginBottom="8dp"
android:background="@drawable/shape_white_fb_15_corners"
android:foreground="?android:attr/selectableItemBackground"
android:paddingStart="30dp"
android:paddingEnd="30dp">
app:dragEdge="right">
<TextView
android:id="@+id/tvShowState"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black999"
android:textSize="32sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="烹饪中" />
<!-- 后景层(secondaryView = getChildAt(0)):删除按钮,右对齐 -->
<FrameLayout
android:id="@+id/layoutDelete"
android:layout_width="160dp"
android:layout_height="150dp"
android:background="@drawable/bg_swipe_delete">
<TextView
android:id="@+id/tvDishName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/dish_green"
android:textSize="32sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/tvDishCount"
app:layout_constraintEnd_toStartOf="@id/tvShowState"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="冬虫夏草炝拌芥兰苗" />
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
android:contentDescription="删除"
android:src="@drawable/ic_trash_white" />
<TextView
android:id="@+id/tvDishCount"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/black999"
android:textSize="26sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/tvDishName"
app:layout_constraintStart_toStartOf="@id/tvDishName"
app:layout_constraintTop_toBottomOf="@id/tvDishName"
tools:text="累计统计:2.3kg(2次)" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- 前景层(mainView = getChildAt(1)):item 主内容 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clBlock"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="@drawable/shape_white_fb_15_corners"
android:foreground="?android:attr/selectableItemBackground"
android:paddingStart="30dp"
android:paddingEnd="30dp">
<TextView
android:id="@+id/tvShowState"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black999"
android:textSize="32sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="烹饪中" />
<TextView
android:id="@+id/tvDishName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/dish_green"
android:textSize="32sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/tvDishCount"
app:layout_constraintEnd_toStartOf="@id/tvShowState"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="冬虫夏草炝拌芥兰苗" />
<TextView
android:id="@+id/tvDishCount"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/black999"
android:textSize="26sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/tvDishName"
app:layout_constraintStart_toStartOf="@id/tvDishName"
app:layout_constraintTop_toBottomOf="@id/tvDishName"
tools:text="累计统计:2.3kg(2次)" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.shuwei.dish.match.view.swipereveallayout.SwipeRevealLayout>