滑動沖突小記

這幾天工作中遇到不少滑動沖突問題,記錄下來,分享一下。

主要有兩種情況:

  1. ScrollView嵌套ListView

    這種情況的應用場景不多,一般應用的話也多用于展示,重新計算下ListView的高度就ok

    先上圖:

    頂層布局是一個ScrollView,里面包含一個Edittext,一個Listview,一個Button

    正常情況下ScrollView不會攔截掉ListView的點擊事件,不過當Edittext中的內容比較多,直到屏幕展示不開出現(xiàn)滾動條時,ScrollView就會攔截掉ListView的點擊事件,使Listview沒辦法正常工作

這種情況下Listview的滑動事件會被攔截掉
    
解決方案:判斷點擊位置,按位置來確定誰來執(zhí)行點擊事件

解決滑動沖突問題一般有兩種解決方式:
外部攔截法和內部攔截法

先來看外部攔截法
外部攔截也就是說從父控件中處理是否攔截點擊事件

上代碼

    非完整代碼
    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方法,系統(tǒng)提供的方法有時候也會出現(xiàn)亂碼,可以這么處理

    mWebView.getSettings().setDefaultTextEncodingName("UTF-8");
    mWebView.loadData(mHtmlStr, "text/html; charset=UTF-8", null);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容