這幾天工作中遇到不少滑動沖突問題夫凸,記錄下來衰抑,分享一下匙监。
主要有兩種情況:
-
ScrollView嵌套ListView
這種情況的應用場景不多,一般應用的話也多用于展示揽趾,重新計算下ListView的高度就ok
先上圖:
頂層布局是一個ScrollView,里面包含一個Edittext台汇,一個Listview,一個Button
正常情況下ScrollView不會攔截掉ListView的點擊事件,不過當Edittext中的內(nèi)容比較多苟呐,直到屏幕展示不開出現(xiàn)滾動條時痒芝,ScrollView就會攔截掉ListView的點擊事件,使Listview沒辦法正常工作
這種情況下Listview的滑動事件會被攔截掉
解決方案:判斷點擊位置牵素,按位置來確定誰來執(zhí)行點擊事件
解決滑動沖突問題一般有兩種解決方式:
外部攔截法和內(nèi)部攔截法
先來看外部攔截法
外部攔截也就是說從父控件中處理是否攔截點擊事件
上代碼
非完整代碼
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處理
內(nèi)部攔截法:
在內(nèi)部view中通過requestDisallowInterceptTouchEvent()方法來干涉父控件是否攔截點擊事件
代碼邏輯一樣的就不上代碼了闷哆,重寫Listview的onTouchEvent方法
如果點擊位置在Listview內(nèi)就調(diào)用requestDisallowInterceptTouchEvent(true)
-
ScrollView嵌套可以橫向滑動的Webview(和Viewpager嵌套Listview)一樣的
這個就比較簡單了腰奋,判斷滑動房間,外部攔截就重寫父空間的onIntercepterTouchEvent 內(nèi)部攔截就重寫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);