Android 解决ScrollView与父视图滑动冲突问题

本文详细介绍了如何解决Android中ScrollView作为子组件与可滑动父视图之间的滑动冲突问题。通过自定义ScrollView,监听子组件滑动靠岸,以及在子组件滑动完成后将事件传递给父组件,实现滑动行为的正确处理。同时,文章还讨论了初始状态优化和避免父组件不必要的拦截情况。
摘要由CSDN通过智能技术生成

最近在解决一个比较棘手的问题,就是ScrollView与父视图之间滑动冲突的问题。

这里所说的滑动冲突,是指包裹ScrollView的父视图本身就是一个可以滑动的组件,比如说ScrollView嵌套ScrollView的情况(当然,这在实际应用中是没有意义的,因为ScrollView只能包含一个子组件,这里只是举一个栗子)。


问题定义

说要解决这样一个问题,肯定会有点摸不到头脑,但我们可以用分解法,来“大事化小”。

遇到这种滑动事件冲突的嵌套首先要明白一个孰先孰后的问题,就是先让父组件滑动还是先让子组件滑动。按照一般的场景,我们一般会选择让子组件先滑动,因为这样会比较好处理一点。

那么问题就来了,为了先让子组件滑动,我们需要做哪些事情呢?

  1. 监听子组件滑动到顶部
  2. 监听子组件滑动到底部
  3. 在子组件滑动完成后将滑动事件传递回父组件
  4. 可能的卡顿及优化

好了,根据这几个问题,让我们一个个来解决他们。

解决步骤

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();
    }

    /**
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值