問題:
在項目中可能會遇到ScrollView中嵌套WebView的布局,如果WebView中html也是具有列表滑動時者祖,就可能會出現(xiàn)與ScrollView滑動手勢沖突問題眶痰,比如單手指滑動WebView時ScrollView無法滾動恍飘,或者ScrollView攔截了WebView的手勢滑動榨崩;
方案一:多點觸摸
思路:重寫WebView 在事件響應方法中谴垫,判斷是否是多點觸摸(也就是大于2個手指滑動時),
設(shè)置requestDisallowInterceptTouchEvent(true);//多點觸摸蜡饵,大于兩個手指的滑動我自己處理了
public class TouchWebView extends WebView {
publicTouchWebView(Context context) {
super(context);
}
publicTouchWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
publicTouchWebView(Context context, AttributeSet attrs,intdefStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Check is required to prevent crash
if(MotionEventCompat.findPointerIndex(event,0) == -1) {
return super.onTouchEvent(event);
}
if(event.getPointerCount() >=2) {
requestDisallowInterceptTouchEvent(true);//多點觸摸弹渔,大于兩個手指的滑動我自己處理了
}else{
requestDisallowInterceptTouchEvent(false);
}
return super.onTouchEvent(event);
}
@Override
protected voidonOverScrolled(intscrollX,intscrollY,booleanclampedX,booleanclampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if(clampedY){//當滑動到下邊界時,開始
}
requestDisallowInterceptTouchEvent(true);
}
}
方案二:靈機一動的思路溯祸,請高手修正肢专,利用手指滑動的距離來判斷;
思路:通過判斷手指在屏幕上滑動距離焦辅,來控制ScrollView是否滾動以及事件是否需要攔截博杖;這個具體距離是多少可能需要個經(jīng)驗值我測試了一些170應該是個我們項目中能接受的距離,當小于這個距離時筷登,傳遞事件到WebView并且設(shè)置ScrollView禁止滑動剃根,當大于這個距離時,攔截事件前方,設(shè)置ScrollView可以滑動狈醉,這樣就可以一個手指想滑動ScrollView就滑動ScrollView,想滑動WebView就滑動WebView惠险,經(jīng)過測試都比較流暢苗傅;
public class MyScrollView extends ScrollView {
privateGestureDetectormGestureDetector;
View.OnTouchListenermGestureListener;
publicMyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector=newGestureDetector(context,newYScrollDetector());
setFadingEdgeLength(0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev) &&mGestureDetector.onTouchEvent(ev);
}
// Return false if we're scrolling in the x direction
class YScrollDetector extends SimpleOnGestureListener {
@Override
public booleanonScroll(MotionEvent e1, MotionEvent e2,floatdistanceX,floatdistanceY) {
//? ? ? ? ? ? if (Math.abs(distanceY) > Math.abs(distanceX)) {
//? ? ? ? ? ? return true;
//? ? ? ? ? ? }
if(Math.abs(distanceY) >170){
return true;
}
return false;
}
}
}