使用GestureDetector和可点击的RelativeLayout

时间:2016-02-08 17:02:15

标签: android relativelayout gesture

我在使用GestureDetector和同时点击RelativeLayout时遇到问题。当我的RelativeLayout无法点击时,应用程序可以完美识别每个手势,但是当我将布局设置为可点击时,应用程序不会识别手势。 有没有办法同时使用两者?

1 个答案:

答案 0 :(得分:0)

不幸的是,onClick()& onTouch()在一起使用时无法正常运行。 我使用onTouch来解决点击问题。 我不确定如何使用手势检测器。 我将分享我的代码..没有手势检测器它工作正常。如果它不起作用,请告诉我。

初始化您的听众:

GestureDetector gdt;
View.OnTouchListener touchListener;
private void initializeListener()
{
    gdt =  new GestureDetector(mContext,new GestureListener());
    touchListener = new View.OnTouchListener() {
        float startX;
        float startY;
        float CLICK_ACTION_THRESHOLD = 5;
        //Uses the touched coordinates recorded through MOTION_DOWN & MOTION_UP to detect whether the action performed was a click
        private boolean isAClick(float startX, float endX, float startY, float endY) {
            if(isLoadingView)
                return false;

            float differenceX = Math.abs(startX - endX);
            float differenceY = Math.abs(startY - endY);
            return !(differenceX > CLICK_ACTION_THRESHOLD || differenceY > CLICK_ACTION_THRESHOLD);
        }
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startX = event.getX();
                    startY = event.getY();
                    break;
                case MotionEvent.ACTION_UP: {
                    float endX = event.getX();
                    float endY = event.getY();

                    if (isAClick(startX, endX, startY, endY))
                    {
                        switch (v.getId())
                        {
                            case R.id.view_id:
                            break

                        }
                    }
                }
                break;
            }
            gdt.onTouchEvent(event);
            return true;
        }
    };
}

向视图添加侦听器:

private void addTouchListenerToView(View v) {
    v.setOnTouchListener(touchListener);
}

示例手势监听器类:

private class GestureListener extends GestureDetector.SimpleOnGestureListener {
    private final int SWIPE_MIN_DISTANCE = 153;
    private final int SWIPE_THRESHOLD_VELOCITY = 20;

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
        {
            return false; // Right to left
        }
        else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE ) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
        {
            return false; // Left to right
        }

        if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE)// && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)
        {
            return false; // Bottom to top
        }
        else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE)// && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)
        {
            return false; // Top to bottom
        }

        return true;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                            float distanceY) {
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE*10 ) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
        {
            return false; // Right to left
        }
        else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE*10 ) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
        {
            return false; // Left to right
        }
        return true;
    }
}