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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

上图是一个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() {
} @Override
protected 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;
} @Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
//假设是新的按下事件。则对mBottomFlag又一次初始化
mBottomFlag = false;
//假设已经不要这次事件。则传出取消的信号,这里的作用不大
if (mBottomFlag)
event.setAction(MotionEvent.ACTION_CANCEL);
return super.dispatchTouchEvent(event);
} @Override
public boolean onTouchEvent(MotionEvent event) {
boolean result = super.onTouchEvent(event);
//假设是须要拦截,则再拦截,这种方法会在onScrollChanged方法之后再调用一次
if (!mBottomFlag)
getParent().requestDisallowInterceptTouchEvent(true);
return result;
} @Override
protected 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嵌套ViewPager出现的滑动冲突问题

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

  2. ScrollView嵌套recyclerView出现的滑动问题

    记得以前在解决scrollView与ListView嵌套问题时,那个时候是自定义了listView去测量listView高度,今天项目中刚 好碰到了要用recycerView,同样也是嵌套在scrol ...

  3. android ScrollView嵌套EditText

    editext.setOnTouchListener(new OnTouchListener() {                        @Override            publi ...

  4. ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法(转)

    ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法 分类: android应用开发2013-12-19 09:40 1045人阅读 评论(3) 收藏 举报 AndroidS ...

  5. Android滑动冲突解决方法

    叙述 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了. 关于滑动冲突 滑动冲突分类 ...

  6. android scrollview嵌套listview计算高度的问题

    ScrollView中只能放一个控件,一般都放LinearLayout,orientation属性值为vertical.在LinearLayout中放需要呈现的内容.ListView也在其中,List ...

  7. (转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

    ViewPager,ScrollView 嵌套ViewPager滑动冲突解决 本篇主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌 ...

  8. 解决ScrollView嵌套RecyclerView的显示及滑动问题

        项目中时常需要实现在ScrollView中嵌入一个或多个RecyclerView.这一做法通常会导致如下几个问题 页面滑动卡顿 ScrollView高度显示不正常 RecyclerView内容 ...

  9. Android 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题

    最近做的项目中遇到了ScrollView嵌套RecyclerView,刚写完功能测试,直接卡出翔了,后来通过网上查找资料和 自己的实践,找出了两种方法解决这个问题. 首先来个最简单的方法: recyc ...

随机推荐

  1. [Android Security] 反编译常用工具

    copy : https://down.52pojie.cn/Tools/Disassemblers/

  2. C#零基础入门03:打老鼠初级

    一:在源码管理器中打开VS 注意,下文这样的打开方式是在 TFS 的源码服务器中打开解决方案.如果我们使用 SVN,则直接在硬盘上打开解决方案就可以了. 打开VS: 然后按上图中的步骤1和2(双击2处 ...

  3. MongoDB单机, 主从, 分布式部署

    MongoDB是最易用的NoSQL,比较适合取代MySQL做一些存储,不过不是强一致性的.本文介绍一下MongoDB各种部署方式,并分享一些感受.前两部分“单机部署”和“主从部署”是“分片部署”的基础 ...

  4. [Link]Hive资料整理

    Hive SQL的编译过程 Hive学习分享 IBM Hive

  5. emouse思·睿—评论与观点整理之四

    虽说我主要做的硬件,平时的兴趣爱好比较关注移动互联网,混迹于虎嗅.爱范儿.雷锋网.36Kr.cnBeta.瘾科技.i黑马.TechWeb等这类科技以及创业媒体,遗憾的是系统的去写的并不多,好在还算充分 ...

  6. [转]vue Element UI走马灯组件重写

    https://blog.csdn.net/u013750989/article/details/82885482 1.element ui走马灯组件 -- carousel分析一波源代码:carou ...

  7. 在Asp.Net中使用jQueryEasyUI(转)

    最近做一个小工具,列表显示页面准备使用jQuery的UI框架,因为之前知道有jQWidgets这个框架,所以直接就下载下来使用了,jQWidgets的功能很强大,Demo和文档也非常详细,但使用后发现 ...

  8. [leetcode]Minimum Path Sum @ Python

    原题地址:https://oj.leetcode.com/problems/minimum-path-sum/ 题意: Given a m x n grid filled with non-negat ...

  9. 论述Android通过HttpURLConnection与HttpClient联网代理网关设置

    Android联网主要使用HttpURLConneciton和HttpClient进行联网,在手机联网的时候,我们优先选择wifi网络,其次在选择移动网络,这里所述移动网络主要指cmwap. 大家都知 ...

  10. 【ElasticSearch】ElasticSearch-SQL插件

    ElasticSearch-SQL插件 image2017-10-27_11-10-53.png (1067×738) elastic SQL_百度搜索 Druid SQL 解析器的解析过程 - be ...