ScrollView嵌套EditText联带滑动的解决办法

本篇文章的相关内容需结合上文:从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决办法


在说完了如何解决ScrollView嵌套EditText的滑动事件冲突之后,我们接下来说一下如何实现它们两者之间的联带滑动。什么是联带滑动呢,就是当EditText滑动到底部的时候,这时就应该让外部的ScrollView跟着滑动,好让它们之间完成连贯的滑动事件,就是我们这篇文章的目的。具体效果就像下面这样:


上图是一个GIF图片,所以有些卡顿的效果,实际上效果是非常流畅的。那么实现这种效果该怎么做呢?


我们知道,子View可以根据requestDisallowInterceptTouchEvent方法来请求是否允许其祖父布局拦截本次的触摸事件,那么,我们就有了初步的解决办法,就是,在需要的时候,不要让祖父布局拦截事件,在不需要的时候,让它们拦截,这时,事件就会被交给祖父布局来处理,并会让ScrollView滑动起来。


上篇文章,我们已经对这一步做了基本的处理,如果你已经按照上文实现了的话,发现并没有按照想象中的那样实现本效果。那么是哪里出现了问题,是哪里还有问题吗?


细心的同学可以发现,我们在onScrollChanged方法中对到达顶部和底部时做了处理,允许祖父布局对事件进行拦截。但是,如果做了调试的话,onScrollChanged方法调用之后onTouchEvent方法也调用了一次requestDisallowInterceptTouchEvent,并设置的参数还是true,也就是说,刚才在onScrollChanged方法中做的处理被取消了。所以,这时我们需要加个标志,用于帮助onTouchEvent方法中的requestDisallowInterceptTouchEvent方法进行合理的调用。


So,我们的问题就解决了。


不过还需要一些后续工作,就是在dispatchTouchEvent判断时候有新一轮的事件被传递过来,这时,我们还需要将这个标志重新初始化一下。


全部的实现代码如下:

<span style="font-family:'Microsoft YaHei';font-size:14px;">package com.example.sahadev.gridlayout;import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;/*** Created by Sahadev on 2016/4/20.*/
public class MyEditText extends EditText {//滑动距离的最大边界private int mOffsetHeight;//是否到顶或者到底的标志private boolean mBottomFlag = false;public MyEditText(Context context) {super(context);init();}public MyEditText(Context context, AttributeSet attrs) {super(context, attrs);init();}public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int paddingTop;int paddingBottom;int mHeight;int mLayoutHeight;//获得内容面板Layout mLayout = getLayout();//获得内容面板的高度mLayoutHeight = mLayout.getHeight();//获取上内边距paddingTop = getTotalPaddingTop();//获取下内边距paddingBottom = getTotalPaddingBottom();//获得控件的实际高度mHeight = getHeight();//计算滑动距离的边界mOffsetHeight = mLayoutHeight + paddingTop + paddingBottom - mHeight;}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN)//如果是新的按下事件,则对mBottomFlag重新初始化mBottomFlag = false;//如果已经不要这次事件,则传出取消的信号,这里的作用不大if (mBottomFlag)event.setAction(MotionEvent.ACTION_CANCEL);return super.dispatchTouchEvent(event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean result = super.onTouchEvent(event);//如果是需要拦截,则再拦截,这个方法会在onScrollChanged方法之后再调用一次if (!mBottomFlag)getParent().requestDisallowInterceptTouchEvent(true);return result;}@Overrideprotected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) {super.onScrollChanged(horiz, vert, oldHoriz, oldVert);if (vert == mOffsetHeight || vert == 0) {//这里触发父布局或祖父布局的滑动事件getParent().requestDisallowInterceptTouchEvent(false);mBottomFlag = true;}}}
</span>

代码,相比上篇文章进行了稍微的改良。看起来更加明确。


所以,上面就是我们常常看到的对不同View之间进行连贯性滑动的解决办法。



PS:对于这种事件类的调试,如果身边没有源码可以调试的话,那么打印日志是一个好的解决办法。


经过这两篇文章,相信你一定会触摸事件之间的关系有了更进一步的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库智能运维探索与实践

从自动化到智能化运维过渡时&#xff0c;美团DBA团队进行了哪些思考、探索与实践&#xff1f;本文根据赵应钢在“第九届中国数据库技术大会”上的演讲内容整理而成&#xff0c;部分内容有更新。 背景 近些年&#xff0c;传统的数据库运维方式已经越来越难于满足业务方对数据库的…

论文浅尝 | PAKDD2020 - 利用支持集中匹配信息的 few shot 事件分类方法

论文笔记整理&#xff1a;申时荣&#xff0c;东南大学博士生。来源&#xff1a;PAKDD 2020链接&#xff1a;https://arxiv.xilesou.top/pdf/2002.05295.pdf1.介绍&#xff1a;事件分类是一个重要的信息抽取任务&#xff0c;其目的是根据事件的提及实例对事件类别进行分类。目前…

梯度下降法的神经网络容易收敛到局部最优,为什么应用广泛?

文 | Summer Clover知乎本文已获作者授权&#xff0c;禁止二次转载这是Deep Learning Theory里很基本也很核心的一个问题。在这个问题上&#xff0c;初学者容易被入门教学误导&#xff0c;非此研究方向的业内人士也容易有过时的认知。首先问题描述不够准确。更准确的说法是&…

机器学习在美团配送系统的实践:用技术还原真实世界

在2018 AI开发者大会&#xff08;AI NEXTCon&#xff09;上&#xff0c;美团配送AI方向负责人何仁清&#xff0c;分享了美团在即时配送领域中机器学习技术的最新进展&#xff0c;以及如何通过大数据和机器学习手段&#xff0c;建立对线下真实世界各种场景的感知能力&#xff0c…

LeetCode 99. 恢复二叉搜索树(中序遍历)

1. 题目 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下&#xff0c;恢复这棵树。 你能想出一个只使用常数空间的解决方案吗&#xff1f; 2. 解题 循环中序遍历&#xff08;栈&#xff09;&#xff0c;记录不满足的节点&#xff0c;交换其valO(n)O(n)O(n)…

AAAI21 | Seq2Seq模型成为“复读机”的原因找到了?

文 | 苏剑林编 | Sheryc_王苏单位 | 追一科技去年笔者写过博文《如何应对Seq2Seq中的"根本停不下来"问题&#xff1f;》[1]&#xff0c;里边介绍了一篇论文中对Seq2Seq解码不停止现象的处理&#xff0c;并指出那篇论文只是提了一些应对该问题的策略&#xff0c;并没有…

论文浅尝 | ICLR 2020 - 图神经网络的预训练策略

论文笔记整理&#xff1a;杨帆&#xff0c;浙江大学计算机学院。动机现有的用于图结构的预训练方法要么只关注node-level&#xff0c;导致在图表示空间没有区分度&#xff0c;要么只关注graph-level&#xff0c;导致在节点表示空间没有区分度。一种优质的节点表示应该保证不仅在…

常见的距离算法和相似度计算方法

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/138107999 首发于算法加油站写文章常见的距离算法和相似度计算方法奋发的菜鸟酱​华东师范大学 计算机技术博士在读91 人赞同了该文章注&#xff1a;不定时更新1.常见的距离算法1.1 欧几里得距离&#xff08;Euclidean Dista…

美团AI全景图:吃喝玩乐背后的黑科技

很多人都会发现日常生活已经越来越离不开美团了&#xff0c;这个互联网平台涵盖了吃、住、行、游、购、娱……能帮我们做很多事情&#xff0c;非常接地气。黄色的美团外卖骑手&#xff0c;橙色的摩拜单车&#xff0c;还有美团和大众点评的Logo……会不时出现在各个角落&#xf…

LeetCode 547. 朋友圈(图的遍历BFS DFS)

文章目录1. 题目2. 解题2.1 BFS 广度优先2.2 DFS 深度优先1. 题目 问有几个连通网络 2. 解题 2.1 BFS 广度优先 参考图的数据结构 class Solution { public:int findCircleNum(vector<vector<int>>& M) {int n M.size(), groups 0, i;bool visited[n] …

开源开放 | 《大词林》开源 75 万核心实体和围绕核心实体的细粒度概念、关系列表...

1《大词林》简介《大词林》(http://101.200.120.155/)是由哈尔滨工业大学社会计算与信息检索研究中心推出&#xff0c;由我中心秦兵教授和刘铭副教授主持开发&#xff0c;是一个自动构建的大规模开放域中文知识库。自2014年11月推出第一版《大词林》&#xff0c;《大词林》共经…

推荐几个不错的CUDA入门教程(非广告)

文 | godweiyang最近因为项目需要&#xff0c;入坑了CUDA&#xff0c;又要开始写很久没碰的C了。对于CUDA编程以及它所需要的GPU、计算机组成、操作系统等基础知识&#xff0c;我基本上都忘光了&#xff0c;因此也翻了不少教程。这里简单整理一下&#xff0c;给同样有入门需求的…

logging.getLogger(logger)

https://www.cnblogs.com/bjdxy/archive/2012/12/03/2799322.html logging模块学习笔记&#xff1a;logger 对象、日志等级 logger&#xff1a;日志对象&#xff0c;logging模块中最基础的对象&#xff0c;用logging.getLogger(name)方法进行初始化&#xff0c;name可以不填。通…

美团DB数据同步到数据仓库的架构与实践

背景 在数据仓库建模中&#xff0c;未经任何加工处理的原始业务层数据&#xff0c;我们称之为ODS(Operational Data Store)数据。在互联网企业中&#xff0c;常见的ODS数据有业务日志数据&#xff08;Log&#xff09;和业务DB数据&#xff08;DB&#xff09;两类。对于业务DB数…

论文浅尝 | AAAI2020 - 基于生成对抗的知识图谱零样本关系学习

论文笔记整理&#xff1a;耿玉霞&#xff0c;浙江大学直博生。研究方向&#xff1a;知识图谱&#xff0c;零样本学习等。来源&#xff1a;AAAI2020论文链接&#xff1a;https://arxiv.org/pdf/2001.02332.pdf本文是发表在AAAI2020上的一篇基于生成对抗网络进行知识图谱零样本关…

LeetCode 1184. 公交站间的距离

1. 题目 环形公交路线上有 n 个站&#xff0c;按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离&#xff0c;distance[i] 表示编号为 i 的车站和编号为 (i 1) % n 的车站之间的距离。 环线上的公交车都可以按顺时针和逆时针的方向行驶。 返回乘客从出发点…

追剧计划第三弹!UC Berkeley出品,全栈深度学习!

关注卖萌屋比较早的小伙伴&#xff0c;大概还记得2020年初时我们组织的斯坦福大学CS224N自然语言处理公开课追剧计划&#xff0c;以及后来的斯坦福大学CS520知识图谱公开课追剧活动。尽管活动已经结束很长一段时间&#xff0c;但是仍然有小伙伴后台问“什么时候开始下一波追剧哇…

美团外卖iOS App冷启动治理

一、背景 冷启动时长是App性能的重要指标&#xff0c;作为用户体验的第一道“门”&#xff0c;直接决定着用户对App的第一印象。美团外卖iOS客户端从2013年11月开始&#xff0c;历经几十个版本的迭代开发&#xff0c;产品形态不断完善&#xff0c;业务功能日趋复杂&#xff1b;…

LeetCode 538. 把二叉搜索树转换为累加树(逆中序 根右左)

文章目录1. 题目2. 逆中序&#xff08;根右左&#xff0c;降序循环遍历&#xff09;1. 题目 给定一个二叉搜索树&#xff08;Binary Search Tree&#xff09;&#xff0c;把它转换成为累加树&#xff08;Greater Tree)&#xff0c;使得每个节点的值是原来的节点值加上所有大于…

应用实践 | 电商应用——一种基于强化学习的特定规则学习模型

本文转载自公众号&#xff1a;浙大KG。作者&#xff1a;汪寒&#xff0c;浙江大学硕士&#xff0c;主要研究方向为知识图谱和自然语言处理。应用场景在电商实际应用中&#xff0c;每个商品都会被挂载到若干个场景&#xff0c;以图结构中的节点形式存在。商品由结构化信息表示&a…