美文网首页
滑动冲突小记

滑动冲突小记

作者: BJChaney | 来源:发表于2016-09-09 17:35 被阅读31次

这几天工作中遇到不少滑动冲突问题,记录下来,分享一下。

主要有两种情况:

  1. ScrollView嵌套ListView

    这种情况的应用场景不多,一般应用的话也多用于展示,重新计算下ListView的高度就ok

    先上图:

    顶层布局是一个ScrollView,里面包含一个Edittext,一个Listview,一个Button

    正常情况下ScrollView不会拦截掉ListView的点击事件,不过当Edittext中的内容比较多,直到屏幕展示不开出现滚动条时,ScrollView就会拦截掉ListView的点击事件,使Listview没办法正常工作

这种情况下Listview的滑动事件会被拦截掉
    
解决方案:判断点击位置,按位置来确定谁来执行点击事件

解决滑动冲突问题一般有两种解决方式:
外部拦截法和内部拦截法

先来看外部拦截法
外部拦截也就是说从父控件中处理是否拦截点击事件

上代码

    非完整代码
    public class MyScrollView extends ScrollView {
        private ListView mListView;
          private float mLeft;
           private float mRight;
           private float mTop;
           private float mBpttom;
           private float mRawX;
           private float mRawY;
        
           @Override
           public boolean onInterceptTouchEvent(MotionEvent ev) {
               switch (ev.getAction()){
                   case MotionEvent.ACTION_DOWN:
                       int[] location = new int[2];
                       mListView.getLocationInWindow(location);
                       mLeft = location[0];
                       mTop = location[1];
                       mRight = mLeft + getWidth();
                       mBpttom = mTop + getHeight();
                       mRawX = ev.getRawX();
                       mRawY = ev.getRawY();
                       if(mRawX>mLeft && mRawX<mRight 
                       && mRawY>mTop && mRawY<mBpttom){
                           return false;
                       }
                       return true;
                   case MotionEvent.ACTION_MOVE:
        
                       break;
                   case MotionEvent.ACTION_UP:
        
                       break;
               }
        
               return super.onInterceptTouchEvent(ev);
           }
        }

简单说一下,获取Listview在屏幕中的位置,判断点击的坐标是否在Listview中,如果是就直接不去拦截点击事件,让Listview处理

内部拦截法:

在内部view中通过requestDisallowInterceptTouchEvent()方法来干涉父控件是否拦截点击事件

代码逻辑一样的就不上代码了,重写Listview的onTouchEvent方法

如果点击位置在Listview内就调用requestDisallowInterceptTouchEvent(true)

  1. ScrollView嵌套可以横向滑动的Webview(和Viewpager嵌套Listview)一样的

这个就比较简单了,判断滑动房间,外部拦截就重写父空间的onIntercepterTouchEvent 内部拦截就重写view空间的onTouchEvent方法,直接上代码

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                mRawX = ev.getRawX();
                mRawY = ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                float moveX = ev.getRawX();
                float moveY = ev.getRawY();
                float differX = Math.abs(moveX - mRawX);
                float differY = Math.abs(moveY - mRawY);
                if(differX>differY){
                    return false;
                }else
                    return true;
            case MotionEvent.ACTION_UP:

                break;
        }

        return super.onInterceptTouchEvent(ev);
    }

计算移动距离的绝对值,判断在哪个方向上移动距离长,然后处理事件

顺便提一下,Webview的loadData方法,系统提供的方法有时候也会出现乱码,可以这么处理

    mWebView.getSettings().setDefaultTextEncodingName("UTF-8");
    mWebView.loadData(mHtmlStr, "text/html; charset=UTF-8", null);

相关文章

  • 滑动冲突小记

    这几天工作中遇到不少滑动冲突问题,记录下来,分享一下。 主要有两种情况: ScrollView嵌套ListView...

  • Android View 事件体系笔记 (三):View滑动冲突

    一、View 滑动冲突背景 1.1 View 滑动冲突常见场景 场景1 —— 外部和内部横竖滑动交错冲突 场景2 ...

  • View的事件体系(五)View滑动冲突的解决方案

    一.滑动冲突产生的原因 在界面中,只要内外两层同时可以滑动,这个时候就会产生滑动冲突。 二.常见的滑动冲突场景 外...

  • 滑动冲突及其解决办法

    滑动冲突产生的愿因 在界面中只要内外两层同时可以滑动,这个时候就会产生滑动冲突。 滑动冲突产生的场景 场景1 --...

  • Android View的事件体系(五) View的滑动冲突

    滑动冲突时如何产生的呢?在界面中只要内外两层同时可以滑动,这个时候就会产生滑动冲突. 常见的滑动冲突场景 1 外部...

  • 滑动事件冲突

    滑动事件冲突 一般分三种: 滑动方向一致导致的冲突 滑动方向不一致导致的冲突 滑动方向的各种叠加导致的冲突 解决方...

  • View的滑动冲突

    前言:滑动冲突是如何产生的呢?其实在界面中只要内外两层同时可以滑动,这个时候就会产生滑动冲突。如何解决滑动冲突呢?...

  • Android滑动事件冲突解决方法

    1.Android滑动事件冲突解决办法 滑动事件的冲突包括两种情形: 不同方向的滑动冲突:比如ScrollView...

  • ScrollView 嵌套 RecyclerVeiw, 轻松解决

    滑动冲突 在开发android中, 滑动冲突是一常见的事件冲突。列如:在scrollView中嵌套listView...

  • Android View | View 的滑动冲突

    滑动冲突在实际项目中十分常见,解决滑动冲突的核心是结合事件的分发机制,了解事件的分发可参考这里。 常见的滑动冲突场...

网友评论

      本文标题:滑动冲突小记

      本文链接:https://www.haomeiwen.com/subject/uxaeettx.html