当前位置: 首页 > 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)}}
http://www.xdnf.cn/news/567433.html

相关文章:

  • 命令行参数和环境变量
  • 力扣热题100,力扣148.排序链表力扣.26找出字符串中第一个匹配项的下标力扣146.LRU缓存序列管理器
  • MySQL 8.0 OCP 1Z0-908 171-180题
  • Keepalived 配置深度解析及最佳实践
  • 回表是数据库概念,还是mysql的概念?
  • MyBatis 关联映射深度解析:_association_ 与 _collection_ 实战教程
  • k8s-ServiceAccount 配置
  • spring5-配外部文件-spEL-工厂bean-FactoryBean
  • 【疑难杂症】Mysql 无报错 修改配置文件后服务启动不起来 已解决|设置远程连接
  • Redis SETNX:分布式锁与原子性操作的核心
  • Docker run命令-p参数详解
  • Python打卡训练营day28-类的定义与方法
  • 2021-04-12 VSC++: 寻找N以内的亲密数对。(求因子和)
  • 【Node.js】Web开发框架
  • 牛客网NC15869:长方体边长和计算问题解析
  • Python中的常量和变量分别是怎么定义的?
  • 【QT】在界面A打开界面B时,界面A隐藏,界面B关闭时,界面A复现
  • chromedp -—— 基于 go 的自动化操作浏览器库
  • Redis 的 key 的过期策略是怎么实现的
  • Redis String 设计思想深度解析
  • 系统架构设计师案例分析题——数据库缓存篇
  • 解除diffusers库的prompt长度限制(SDXL版)
  • ArcGIS Pro 3.4 二次开发 - 核心主机
  • Linux yq 命令使用详解
  • 【Qt】QImage实战
  • 一文读懂迁移学习:从理论到实践
  • Git Clone 原理详解:为什么它比本地文件复制更快? -优雅草卓伊凡
  • word格式相关问题
  • C语言——函数递归与迭代
  • 微调后的模型保存与加载