1

我有一个onClickListener和一个onFling(使用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 阻止 onFling),但没有找到合适的答案。

4

1 回答 1

0

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

如果MotionEvent' 的坐标属于Button' 的 rect 并且紧随ACTION_DOWN其后,这是一次点击,ACTION_UP应该被路由到手势检测器。ButtonACTION_MOVE

UPD这是一个解释该技术的答案https://stackoverflow.com/a/3834952/375929

于 2013-08-08T18:04:55.273 回答