滚动视图和OnGestureListener

时间:2013-02-18 11:02:19

标签: android scrollview onfling

这是布局 -

 <ScrollView>

<RelativeLayout>

    <Layout1>
    </Layout1>

    <Layout2>
    </Layout2>

    <Layout3>
    </Layout3>

    <Layout4>
    </Layout4>

    <Layout5>
    </Layout5>

    <Layout6>
    </Layout6>
</RelativeLayout>
</ScrollView>

我已在活动中实施了 onGestureListener
我必须在各个布局(布局1到布局6 )上检测滑动操作 - 向上滑动并向下滑动。由于布局位于滚动视图中,因此未检测到滑动操作( OnFling )。
如何检测scrollview子元素的 onFling ?任何帮助都将受到高度赞赏。

编辑:添加一些代码 -

以下是活动 -

  public class ServiceScreen extends Activity implements OnFocusChangeListener,
    OnTouchListener, OnGestureListener ....

布局监听器 -

RelativeLayout rlCarBrand;
    ....

    rlCarBrand.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return gestureScanner.onTouchEvent(event);
        }
    });

Overriden方法 -

@Override
public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
        float arg3) {
    // TODO Auto-generated method stub
    Log.i("LogMessage", "On Fling");
    return true;
}


@Override
public boolean onDown(MotionEvent arg0) {
    // TODO Auto-generated method stub
    return true;
}

2 个答案:

答案 0 :(得分:1)

尝试扩展ScrollView类并覆盖这些onDown和onFling。 像这样的东西

@Override
public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
    float arg3) {
    super.onFling(arg0,arg1,arg2,arg3);   
    return false;
}

看看是否有效。

指向从正在使用手势事件的scrollview方法返回false。 谷歌更多。我不确定。

答案 1 :(得分:1)

创建一个扩展ScrollView的CustomScrollView类。

有了这个,我们可以改变Scrollview的滚动启用属性。

public class CustomScrollView extends ScrollView {

    boolean bScrollable = false;

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


    public void setScrollingEnabled(boolean enabled) {
        bScrollable = enabled;
    }

    public boolean isScrollable() {
        return bScrollable;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // if we can scroll pass the event to the superclass
            if (bScrollable) {
                return super.onTouchEvent(ev);
            }

            // only continue to handle the touch event if scrolling enabled
            return bScrollable; // mScrollable is always false at this point

        default:
            return super.onTouchEvent(ev);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Don't do anything with intercepted touch events if
        // we are not scrollable
        if (!bScrollable) {
            return false;
        } else {
            return super.onInterceptTouchEvent(ev);
        }
    }

}