CoordinatorLayout 外部有一个overScroll 控件,发生滑动冲突怎么办,希望优先响应CoordinatorLayout 的滑动
时间: 2023-08-06 16:14:45 浏览: 57
发生滑动冲突时,可以通过设置 CoordinatorLayout 的 Behavior 来解决。在滑动事件分发时,会先经过 CoordinatorLayout 的 Behavior 处理,再由子 View 处理。所以,我们可以为 CoordinatorLayout 设置一个 Behavior,在 Behavior 中重写 onInterceptTouchEvent 和 onTouchEvent 方法,来处理滑动冲突。
具体的做法是,在 CoordinatorLayout 的 Behavior 中,先判断是否是横向滑动,如果是,则拦截事件,让 CoordinatorLayout 处理滑动事件;否则,不拦截事件,让子 View 处理滑动事件。代码示例如下:
```java
public class MyBehavior extends CoordinatorLayout.Behavior<View> {
private int mLastX;
private int mLastY;
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = (int) ev.getX();
mLastY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int x = (int) ev.getX();
int y = (int) ev.getY();
int dx = x - mLastX;
int dy = y - mLastY;
if (Math.abs(dx) > Math.abs(dy)) {
// 如果是横向滑动,则拦截事件,让 CoordinatorLayout 处理滑动
return true;
}
break;
}
return super.onInterceptTouchEvent(parent, child, ev);
}
@Override
public boolean onTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = (int) ev.getX();
mLastY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int x = (int) ev.getX();
int y = (int) ev.getY();
int dx = x - mLastX;
int dy = y - mLastY;
if (Math.abs(dx) > Math.abs(dy)) {
// 如果是横向滑动,则让 CoordinatorLayout 处理滑动
parent.onTouchEvent(ev);
return true;
}
break;
}
return super.onTouchEvent(parent, child, ev);
}
}
```
然后,在布局文件中,将要包含 overScroll 控件的父布局设置为 CoordinatorLayout,并设置 MyBehavior。
```xml
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.overscroll.OverScrollLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.example.MyBehavior">
<!-- 此处放置 overScroll 控件和其他子 View -->
</com.example.overscroll.OverScrollLayout>
</android.support.design.widget.CoordinatorLayout>
```
这样,就可以解决 CoordinatorLayout 和 overScroll 控件之间的滑动冲突,优先响应 CoordinatorLayout 的滑动了。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![.zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![.zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)