资讯详情

资讯详情

SwipeAwayDialog 进阶:用 onSwipedAway 回调拦截滑动关闭,精准识别左右手势

【免费下载链接】SwipeAwayDialogDialogFragment swipeable away like Tinder UI.项目地址https://gitcode.com/gh_mirrors/sw/SwipeAwayDialog点击查看免费下载SwipeAwayDialog是一个让 Android 弹窗DialogFragment支持 Tinder 式滑动甩掉关闭手势的开源库。本文聚焦它的进阶能力如何重写onSwipedAway回调来拦截滑动关闭并通过toRight参数精准识别左右方向手势实现左滑拒绝、右滑喜欢的差异化交互。一分钟回顾SwipeAwayDialog 能做什么普通的 Android 弹窗只能点按钮或点外部关闭。SwipeAwayDialog 让你用横向滑动手势甩走弹窗效果与 Tinder 卡片一样自然。它的核心思路只有一个让你的弹窗继承SwipeAwayDialogFragment而不是原生DialogFragment。兼容DialogFragmentSwipeAwayDialogFragment.java兼容support.v4包下的DialogFragmentsupport/v4/SwipeAwayDialogFragment.java项目自带的多种弹窗示例Alert、List、日期、时间、自定义图片等ExampleDialogFragment.java官方安装方式Gradledependencies { compile com.labo.kaji:swipeawaydialog:0.1.1 }onSwipedAway 回调滑动关闭的拦截器库内部在 SwipeAwayDialogFragment.java 中定义了这个方法public boolean onSwipedAway(boolean toRight) { return false; }它的语义非常直白可以把它理解为一张放行/拦截通行证返回值行为典型用途false默认行为弹窗被正常关闭记录埋点、提交数据true阻止关闭弹窗回到原位二次确认、未完成的操作关键在于这个回调发生在关闭动画已经播放完之后、真正执行dismiss()之前。也就是说用户的手指已经甩出去了但你的代码仍有一次反悔的机会。拦截关闭滑动前的最后防线以删除确认弹窗为例——用户手滑甩走弹窗时你不想让它就这么消失可以拦截并给出提示Override public boolean onSwipedAway(boolean toRight) { // 阻止滑动关闭弹出二次确认 Toast.makeText(this, 确定要放弃吗, Toast.LENGTH_SHORT).show(); return true; } 小技巧如果某个弹窗完全不需要滑动关闭比如加载中的 ProgressDialog可以调用setSwipeable(false)直接禁用无需依赖回调拦截。精准识别左右手势Tinder 式喜欢 / 拒绝onSwipedAway唯一的参数toRight是一个布尔值用来区分用户是向右滑true还是向左滑false。这让弹窗可以像 Tinder 卡片一样对两个方向做出完全不同的响应Override public boolean onSwipedAway(boolean toRight) { if (toRight) { sendLike(); // 右滑喜欢 } else { skipProfile(); // 左滑拒绝 } return false; }这种方向 拦截的组合拳正是构建 Tinder-like UI 的核心右滑 → 记录喜欢 → 关闭弹窗 → 展示下一位 左滑 → 记录拒绝 → 关闭弹窗 → 展示下一位 上滑/点按钮 → 走原有逻辑onSwipedAway 不参与底层原理手势如何被判定为甩掉SwipeAwayDialog 的滑动判定来自 SwipeDismissTouchListener.java它借用了 Android 官方 SwipeToDismiss 组件的成熟逻辑判定规则有两条满足其一即可触发关闭拖拽超过一半手指水平位移超过弹窗宽度的一半见 第 148 行此时toRight由位移方向deltaX 0决定快速甩动Fling水平速度超过系统最小甩动速度、且水平速度明显大于垂直速度此时按甩动速度方向判定左右。方向判定后会播放一次平移 45° 旋转 淡出的飞出动画第 162-172 行动画结束才回调onSwipedAway。若判定不成立弹窗会弹性回位。整个手势链路如下环节负责类作用触摸拦截SwipeableFrameLayout.java包裹弹窗内容接管触摸事件手势识别SwipeDismissTouchListener.java判定位移/速度决定左右方向回调分发SwipeAwayDialogFragment.java调用onSwipedAway按返回值决定是否dismiss()进阶技巧让拦截逻辑更智能结合 canDismiss按状态决定能否滑动内部回调 canDismiss 会检查isCancelable() mSwipeable所以不可取消的弹窗天然无法被滑动关闭。你也可以在业务层配合控制表单未填写完时调用setSwipeable(false)填写完成后恢复。关闭倾斜动画获得更克制的手感默认滑动时弹窗会倾斜跟手。若觉得晃眼可调用setTiltEnabled(false); // 见 setTiltEnabled 实现对应实现在 SwipeAwayDialogFragment.java#L36-L41。左右方向的业务化设计建议右滑 肯定喜欢、确认、点赞左滑 否定拒绝、删除、跳过——符合用户从 Tinder 养成的肌肉记忆左右行为不一致时比如删除操作只想响应左滑在onSwipedAway中用toRight分支处理另一个方向return true直接拦截拦截后建议给用户明确反馈Toast、震动、提示音否则用户会误以为弹窗卡住了。常见问题 FAQQ1onSwipedAway 返回 true 后弹窗状态会不会出错不会。动画结束后库会重置视图的位置、旋转和透明度见 performDismiss弹窗完好地回到原位可继续交互。Q2为什么我的回调里 toRight 判断反了toRight true表示向右滑手指从左往右甩。如果视觉上感觉相反先确认自己是按手指移动方向还是卡片飞出的视觉印象在写判断。Q3Kotlin 项目怎么写完全一致Kotlin 中重写方法时不需要Override publicoverride fun onSwipedAway(toRight: Boolean) !toRight needConfirm()Q4滑动关闭会触发 onActivityResult 等生命周期吗会。滑动拦截不成立时内部调用的是标准dismiss()与代码主动关闭完全等价所有 DialogFragment 的生命周期回调都会正常触发。总结三个要点收尾onSwipedAway 是拦截器返回true即可阻止滑动关闭是最后悔机会toRight 是方向传感器true为右滑、false为左滑天然适配 Tinder 式左右双向交互拦截要有反馈阻止关闭后请配合 Toast / 震动提示用户体验才完整。配合setSwipeable、setTiltEnabled两个开关SwipeAwayDialog 可以用极少代码让你的任意 DialogFragment 拥有卡片式滑动手感 。赞分享【免费下载链接】SwipeAwayDialogDialogFragment swipeable away like Tinder UI.项目地址https://gitcode.com/gh_mirrors/sw/SwipeAwayDialog点击查看免费下载相关推荐MediaPipe手势识别中如何区分左右手MediaPipe手势识别中如何区分左右手 MediaPipe作为谷歌开源的跨平台多媒体机器学习解决方案其手势识别功能在JavaScript应用中得到了广泛应人工智能机器学习计算机视觉多模态语音本地部署Readest 自动滚动调速手势右缘滑动与左缘亮度手势的对称实现剖析Readest 自动滚动调速手势右缘滑动与左缘亮度手势的对称实现剖析 摘要 本文深入解析 Readest 阅读器中通过屏幕右缘竖向滑动调节自动滚动Auto前端桌面应用移动开发跨平台进阶指南React Native Swipe List View 的左右滑动动作系统进阶指南React Native Swipe List View 的左右滑动动作系统 想要为你的 React Native 应用添加流畅的滑动交互体验吗 R上一篇终极指南Mantle反射机制之MTLReflection.h核心功能全解析下一篇Firebase JS SDK 的 LiveSessionResumptionUpdate 接口详解Live 会话状态恢复更新机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →