解決NestedScrollView中,在子View上滑動不觸發滾動事件,卻觸發點擊事件
為了實現上滑懸停的TabView,使用了CoordinatorLayout,每一個Tab里都是一個NestedScrollView。
2. 問題布局
在如圖所選的區域滑動(RelativeLayout),只會觸發圖片的點擊事件,不會觸發CoordinatorLayout的滑動事件使Tab上方的布局展開或者收起。而在其它區域(LinearLayout)滑動則會正常滾動
3. 截圖
分析
1. 事件分發機制
遇到滑動衝突的問題,第一反應自然是Android的事件分發機制。
先來複習下:從源碼ViewGroup來分析一個L控制項的事件傳遞過程,引用自《Android深入透析》之Android事件分發機制。
可是因為子布局(RelativeLayout)中需要完成點擊事件,所以倘若父布局(LinearLayout)攔截了觸摸事件之後,子布局上滑動事件的確能正確相應了,但是點擊操作就無法實現了。
2. 面向Stackoverflow編程
在嘗試了事件攔截,自定義view等一系列嘗試之後,我決定想谷爹求助。
最後我找到了這個:Scroll doesn』t work in NestedScrollView when try to scroll from views with click events。也就是說,不能滾動的原因是你滾動布局內的布局長度不夠。
讓我們來複現一下:
注意紅箭頭處的間隙,可以看到LinearLayout的長度是沒有撐滿屏幕的。
3. 解決辦法
用setMinimumHeight給NestedScrollView內的子布局設置最小高度,這裡最好通過代碼計算出這個高度的值。
DisplayMetrics displaymetrics = new DisplayMetrics();
getBaseActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHeight = displaymetrics.heightPixels;
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (getBaseActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
view.setMinimumHeight(screenHeight - actionBarHeight);
總結
Google大法好!Stackoverflow大法好!
ps:原文鏈接解決NestedScrollView中,在子View上滑動不觸發滾動事件,卻觸發點擊事件 - Journey的博客 - 博客頻道 - CSDN.NET
推薦閱讀:
TAG:Android開發 |