最近在解决一个比较棘手的问题,就是ScrollView与父视图之间滑动冲突的问题。
这里所说的滑动冲突,是指包裹ScrollView的父视图本身就是一个可以滑动的组件,比如说ScrollView嵌套ScrollView的情况(当然,这在实际应用中是没有意义的,因为ScrollView只能包含一个子组件,这里只是举一个栗子)。
问题定义
说要解决这样一个问题,肯定会有点摸不到头脑,但我们可以用分解法,来“大事化小”。
遇到这种滑动事件冲突的嵌套首先要明白一个孰先孰后的问题,就是先让父组件滑动还是先让子组件滑动。按照一般的场景,我们一般会选择让子组件先滑动,因为这样会比较好处理一点。
那么问题就来了,为了先让子组件滑动,我们需要做哪些事情呢?
- 监听子组件滑动到顶部
- 监听子组件滑动到底部
- 在子组件滑动完成后将滑动事件传递回父组件
- 可能的卡顿及优化
好了,根据这几个问题,让我们一个个来解决他们。
解决步骤
1. 子组件滑动到顶部与底部的监听
其实上面的问题1和问题2是可以合并为一个监听子组件滑动靠岸的问题,因为无论是靠顶部还是靠底部其实都是滑动已经完成的信号。
这里我们需要自定义一个自己的ScrollView:
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;
/**
* Created by lemondoor on 15/8/8.
*/
public class MyScrollView extends ScrollView {
private View contentView; //ScrollView包含的子组件
private OnBorderListener onBorderListener;
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/* 在滑动发生时监听滑动靠岸 */
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
doOnBorderListener();
}
/**