前言
如题所述,我使用的架构是ViewPager+Fragment+WebView进行开发的,由于WebView的html页面代码是第三方的,这里不好放出来,所以只能放一个大致的架构图,如图所示,ViewPager包含了两个fragment,可以左右滑动的,左边Fragment的WebView顶部包含了一个banner,这种情况下就会引起banner与ViewPager的滑动冲突。这个问题已经有人有解决方案了,见Viewpager与webview滑动冲突的解决方案,但是这个解决方案需要前端配合,有点麻烦,所以我自己想了个解决方案
问题点
- WebView虽然是继承自AbsoluteLayout的但是却不能获取到它的子View
- 我的这个WebView是一个音乐展示页面,所以上滑会加载更多
- 如何获得banner的高度
解决方案
由于问题点1的存在,无法使用获取子View方式来获取到banner,只能通过获取banner的那一段区域,然后通过WebView的onTouchListener设置requestDisallowInterceptTouchEvent()来进行解决,代码如下:
mWebView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//Rect用于描述WebView的在整个界面坐标,它的left,top,bottom,right四个属性就是描述一个View相对于参照物(如父布局的)的距离Rect rect = new Rect();//v即是mWebView,getLocalVisibleRect(rect),是把WebView的相对于父布局的坐标描述出来并放入Rect中v.getLocalVisibleRect(rect);switch (event.getAction()) {case MotionEvent.ACTION_DOWN://rect.top == 0表示滑动到顶部if (rect.top == 0 && event.getY() >= 0 && event.getY() < dpToPx(162)) {mWebView.requestDisallowInterceptTouchEvent(true);} else {mWebView.requestDisallowInterceptTouchEvent(false);}break;}return false;}
});int dpToPx(int dp) {float scale = getResources().getDisplayMetrics().density;return (int) (dp * scale + 0.5f);
}
复制代码
这里没有直接使用event.getY()或者是event.getRawY()是因为问题点2的存在,因为滑过了banner之后会出现这两个值还是处于有效的阶段,必须要添加banner处于显示状态的条件。这个地方使用的getLocalVisibleRect方法,关于这个方法我是参照的这个地方,getGlobalVisibleRect和getLocalVisibleRect,直接看最后的结论即可。
最后一个问题点3是关于如何获取banner高度的问题,有两种方式,第一种是直接找前端问, 但是我问的前端不是很靠谱,给的是错的。另一种,自己算,我用的是Android Monitor,AndroidStudio 2.3.3之后好像就没了,只能在SDK目录/tools/monitor打开了,然后截图工具Dump View Hierarchy for UI Automator找到banner对应的View,计算高度