在ScrollView项上设置onClickListener会禁用滚动效果

时间:2014-05-22 07:18:56

标签: android scrollview onclicklistener ontouchlistener

我有自定义的scrollview,我正在应用touchListener,因为我想在屏幕上上下拖动它。在这个scrollview中,我有一些附加了clickListener的子项。

我的问题是,当试图点击这些项目时,它不会发生任何事情。我想问题是触摸监听器以某种方式干扰了点击监听器,但我不知道该怎么办。

这是我的自定义滚动视图:

public class ObservableScrollView extends ScrollView {
private Callbacks mCallbacks;
private boolean enableScrolling = true;

public boolean isEnableScrolling() {
    return enableScrolling;
}

public void setEnableScrolling(boolean enableScrolling) {
    this.enableScrolling = enableScrolling;
}

public ObservableScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);
    if (mCallbacks != null) {
        mCallbacks.onScrollChanged(t);
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if(isEnableScrolling() && mCallbacks!=null){
        return super.onTouchEvent(ev);
    }
    else{
        return false;
    }
}


@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)
{
    //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance;
    super.onOverScrolled( scrollX,  scrollY,  clampedX,  clampedY);
}

@Override
public int computeVerticalScrollRange() {
    return super.computeVerticalScrollRange();
}

public void setCallbacks(Callbacks listener) {
    mCallbacks = listener;
}

public static interface Callbacks {
    public void onScrollChanged(int scrollY);

    public void onDownMotionEvent();

    public void onUpOrCancelMotionEvent();
}

}

同样在我的活动中,我为这个滚动视图添加了一个触摸监听器,因为正如我所说,我需要向上/向下移动滚动视图。

您能否告诉我如何触发点击监听器并保持触控效果? 谢谢!

1 个答案:

答案 0 :(得分:2)

我记得,它是一系列事件。

首先触发onTouch,通过onTouch监听器。

如果任何侦听器返回true,则表示触摸已处理,并且不会发送onClick。

如果所有侦听器都返回false,那么系统会认为onTouch没有被处理,当点击完成时,onClick将被触发。

您可能想要检查自触摸开始以来用户滚动了多少,如果滚动量很小,则返回false。