当前位置: 首页 > news >正文

Android 自定义SnackBar和下滑取消

如何自定义SnackBar

首先我们得了解SnackBar的布局:
在这里插入图片描述
之前我看有一些方案是获取内部的contentLayout,然后做一些处理。但是现在已经行不通了:

@RestrictTo(LIBRARY_GROUP)
public static final class SnackbarLayout extends BaseTransientBottomBar.SnackbarBaseLayout@RestrictTo(LIBRARY_GROUP)
public class SnackbarContentLayout extends LinearLayout implements ContentViewCallback

现在这些都添加的有@RestrictTo(LIBRARY_GROUP)注解,只能内部使用。

那所以有一个比较挫一点的方案,就是全部移除,并添加:

val customView = layoutInflater.inflate(R.layout.layout_snack_info_sticker_tips, null).apply {findViewById<TextView>(R.id.snack_info_sticker_tips).text = message
}// 替换默认视图
(view as ViewGroup).apply {removeAllViews()addView(customView)
}

需要注意的一个点:

  1. Snackbar.view这里拿到的是最外层的SnackbarLayout
  2. SnackbarLayout左右有一个默认的padding,查看代码是12dp

下滑取消

我们知道Snackbar的下滑取消是通过Behavior实现的,它是BaseTransientBottomBar的内部类:

public static class Behavior extends SwipeDismissBehavior<View> 

那么有一定就需要注意,Snackbar挂载的父view就必须是ConstraintLayout,否则就不会生效。
另外默认的滑动取消是从左向右

那么如何实现下滑取消,也很简单:

  1. 把默认的滑动取消屏蔽掉
  2. 重新拦截时间自己处理
			var initialX = 0.0fvar initialY = 0.0fbehavior = object : BaseTransientBottomBar.Behavior() {// 禁用原有的向右滑动关闭override fun canSwipeDismissView(child: View): Boolean = false// 添加触摸事件处理override fun onInterceptTouchEvent(parent: CoordinatorLayout, child: View, event: MotionEvent): Boolean {when (event.action) {MotionEvent.ACTION_DOWN -> {// 如果点击的是snackbar,再记录起始位置if (parent.isPointInChildBounds(child, event.x.toInt(), event.y.toInt())){initialX = event.xinitialY = event.y} else {  // 否则直接不处理return false}}MotionEvent.ACTION_UP -> {// 计算滑动距离val dx = abs(event.x - initialX)val dy = abs(event.y - initialY)// 当纵向滑动距离大于横向时拦截事件,且超过阈值if (dy > dx && dy > 20) {dismiss()return true}}}return super.onInterceptTouchEvent(parent, child, event)}}

相关文章:

  • java基础 之 Hash家族(一)
  • 和风天气 API 获取天气预报 2025/5/21
  • Axure通过下拉框选项改变,控制字段显隐藏
  • 多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity(含 KeyMob 工具实测)
  • 【Qt】QImage::Format
  • Kotlin 极简小抄 P8(不可空类型、可空类型、注意事项、非空断言 !!)
  • linux文件重命名命令
  • html,js获取扫码设备的输入内容
  • HTTPS和HTTP区别
  • springboot3.x只需两步快速整合nacos作配置中心
  • javaweb-html
  • springboot使用xdoc-report包导出word
  • 【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
  • 深度学习Y8周:yolov8.yaml文件解读
  • Python60日基础学习打卡D32
  • 强化学习鱼书(7)——神经网络和Q学习
  • TCP全连接和tcpdump抓包实现
  • 量化研究--ATR高频量化网格策略实盘研究
  • cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins
  • JavaWebsocket-demo
  • 以总理称将全面控制加沙,对伊朗保留单方面行动权利
  • NFL球员将参加洛杉矶奥运会腰旗橄榄球比赛
  • 近代中国商业航空的兴起——基于“竺可桢日记”的考察
  • 是否担心关税战等外部因素冲击中国经济?外交部:有能力、有条件、有底气
  • 科学与艺术的跨界对话可能吗?——评“以蚁为序的生命网络”
  • 国家话剧院发讣告悼念朱媛媛:始终秉持“戏比天大”的信念