本篇文章的相关内容需结合上文:从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:对于这种事件类的调试,如果身边没有源码可以调试的话,那么打印日志是一个好的解决办法。

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

ScrollView嵌套EditText联带滑动的解决办法相关推荐

  1. ScrollView 嵌套EditText 滑动冲突解决

    ScrollView 嵌套EditText,导致EditText 文字过多,滑动不了. 布局文件: <?xml version="1.0" encoding="ut ...

  2. 解决ScrollView嵌套ViewPager出现的滑动冲突问题

    /** * 解决ScrollView嵌套ViewPager出现的滑动冲突问题 */ public class ScrollView1 extends ScrollView { private bool ...

  3. Android ScrollView与 X5Webview+RecyclerView的滑动冲突解决

    要解决ScrollView嵌套的X5WebView.滑动.高度冲突,则首先要解决ScrollView与 X5Webview的滑动冲突, <ScrollView     android:layou ...

  4. android edittext字数显示不全,Android的EditText字数检测和限制解决办法

    Android的EditText字数检测和限制解决办法 控件EditText在Android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输 ...

  5. python3数据经base64解码后带b'的解决办法

    在写代码过程中,需要对获取的进行base解码,但是输出的数据格式带b' checksum = r.url.split('?g=')[1] check =base64.b64decode(checksu ...

  6. selenium自动化,iframe嵌套导致窗口下滑失效及解决办法

    首先selenium窗口下滑无效, 是否满足网页iframe嵌套. 非该条件,下面办法无法解决 原因:         网页异步加载, 有部分数据必须窗口下滑才能异步加载完全, 这个异步加载的数据又渲 ...

  7. spring用注解无法灵活注入带参构造函数解决办法

    在日常使用spring中,用注解开发比较多,包括 @Repository  @Autowird等,但是有时候需要的对象是带参构造函数的,这个时候使用@Repository就会报错,而直接在使用处new ...

  8. thinkpad电脑无法双指滑动页面解决办法

    需要查看电脑是否装了鼠标的驱动器,下图是我装完驱动器后显示的界面,在安装以前没有thinkpad显示的那一栏. 装完鼠标驱动后,重启电脑,就可以实现双指滑动页面的功能了.(该页面进入方式:控制面板-& ...

  9. thinkphp5 框架内分页带参数的解决办法

    文档有说可以在paginate带参数,然后研究了下,大概就是这样的: $list=Db::name('member')->where('member_name|member_mobile|sex ...

最新文章

  1. 自动驾驶中的3D物体状态检测
  2. 在函数调用中,星号运算符是什么意思? [重复]
  3. Linux 常用命令使用方法
  4. POJ-1459 Power Network 网络流
  5. anasys hpc集群_这可能是最简单的并行方案,如何基于 AWS ParallelCluster 运行 ANSYS Fluent...
  6. Android内存分配的注意事项
  7. 转:Android应用开发性能优化完全分析
  8. 机器学习——层次聚类(超详细)
  9. 一个大图切成几个小图加载速度更快_谷歌SEO页面速度的重要性
  10. Python高级编专题 - 类的创建与销毁
  11. 我的注电之旅——基础考试篇
  12. 手机连不上电脑WIFI并且一直提示正在获取IP地址
  13. pcr台服服务器连接中断,公主连结台服入坑 pcr台服入坑初始指南
  14. 【资源分享】Undertale(传说之下)简体中文精品整合包
  15. 使用FreeType绘制字体
  16. 2021年煤矿安全检查考试总结及煤矿安全检查在线考试
  17. Windows MRT
  18. 大数据先导实践实验一
  19. python base64 实现_用Python开发GUI实战教程:图片转换素描画工具
  20. 金欣怡《小学语文低年级趣味写话的实践与研究》开题报告

热门文章

  1. 计算机应用基础课程编制标准,计算机应用基础课程标准.doc
  2. python 默认参数_有趣的 Python 特性 3 | 当心默认可变参数这个大猪蹄子。
  3. python将txt转json_Python控制乐高EV3,以及VSCODE环境配置
  4. LeetCode 6039. K 次增加后的最大乘积(优先队列)
  5. LeetCode 1224. 最大相等频率(哈希)
  6. 阿里云 超级码力在线编程大赛初赛 第3场 题目4. 完美字符串
  7. 程序员面试金典 - 面试题 10.05. 稀疏数组搜索(二分查找)
  8. LeetCode 310. 最小高度树(图 聪明的BFS,从外向内包围)
  9. python可变参数函数二阶导数公式_python中函数的可变参数
  10. springboot listener_Springboot 监听redis key的过期事件