onClickListener不允许使用onFling触发器

时间:2013-08-08 15:34:22

标签: android onclicklistener onfling

我同时拥有onClickListeneronFling(使用GestureDetector)。

如果我点击按钮,onClickListener将会触发。

如果我扔在屏幕的主体上,那么onFling会发射。

但是,如果我从按钮开始投掷,则不会发射。

布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <Button
            android:id="@+id/myButton"
            android:layout_margin="50dp"
            android:layout_height="100dp"
            android:layout_width="match_parent"
            android:text="Button"/>
</LinearLayout>

代码如下:

public class myLayout extends Activity implements GestureDetector.OnGestureListener {
    private GestureDetector gDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayout);

        gDetector = new GestureDetector(getBaseContext(), this);
        findViewById(R.id.myButton).setOnClickListener(button_OnClickListener);
    }

    final View.OnClickListener button_OnClickListener = new View.OnClickListener() {
        public void onClick(final View buttonView) {
            Toast.makeText(getApplicationContext(), "button pressed", Toast.LENGTH_LONG).show();
        }
    };

    @Override
    public boolean onDown(MotionEvent motionEvent) {
        return true;
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {
    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {
    }

    @Override
    public boolean onFling(MotionEvent start, MotionEvent finish, float v, float v2) {
        if (start.getRawY() < finish.getRawY()) {
            Toast.makeText(getApplicationContext(), "Fling detected", Toast.LENGTH_LONG).show();
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        Log.i("Touch", "onTouchEvent");
        return gDetector.onTouchEvent(me);
    }
}

如何让onFling先运行?

我已查看其他帖子(例如onClick blocking onFling)但未找到合适的答案。

1 个答案:

答案 0 :(得分:0)

您应该尝试使用onInterceptTouchEvent()(或者,dispatchTouchEvent(),此时我不确定哪个更适合Button的父母(或更高级别的东西)在层次结构中)决定是否将触摸路由到按钮或手势检测器。

如果MotionEvent的坐标属于Button的矩形而ACTION_DOWN后面紧跟ACTION_UP,则只需点击一下即可将其路由到{ {1}},但是如果您收到Button并且移动继续到您知道滑动的程度 - 它应该由手势检测器处理。

UPD 以下是解释技术https://stackoverflow.com/a/3834952/375929

的答案