在android中正确处理onTouch和onClick事件

时间:2015-03-11 13:56:26

标签: java android eclipse

我正在使用以下代码在屏幕上拖动视图

   tweatBtn.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            float currX,currY;

            int action = event.getAction();
            switch (action ) {
                case MotionEvent.ACTION_DOWN:
                {
                    mPrevX = event.getRawX();
                    mPrevY = event.getRawY();

                    btnPrevX = tweatBtn.getX();
                    btnPrevY = tweatBtn.getY();

                    break;
                }

                case MotionEvent.ACTION_MOVE:
                {
                    Display display = getActivity().getWindowManager().getDefaultDisplay();
                    int width  = display.getWidth() + 80;  // deprecated
                    int height = display.getHeight();  // deprecated

                    currX = event.getRawX();
                    currY = event.getRawY();
                    if(tweatBtn.getY() > 80 && tweatBtn.getX() > 0 && tweatBtn.getX() < width)
                    {
                        tweatBtn.setX(btnPrevX + currX - mPrevX);
                        tweatBtn.setY(btnPrevY + currY - mPrevY);
                    }
                    else
                    {
                        if((btnPrevY + currY - mPrevY) > 70 && (btnPrevX + currX - mPrevX) > -10 && tweatBtn.getX() < (width - 10))
                        {
                            tweatBtn.setX(btnPrevX + currX - mPrevX);
                            tweatBtn.setY(btnPrevY + currY - mPrevY);
                        }
                    }
                    break;
                }

                case MotionEvent.ACTION_CANCEL:
                    break;

                case MotionEvent.ACTION_UP:
                    break;
            }
            return false;
        }
    });
}

它工作正常,但有时当我抬起手指时它会自动触发点击。我怎么能改善?

1 个答案:

答案 0 :(得分:3)

您将在代码末尾始终返回false。这意味着您设置的touchListener不处理触摸。因为如果它,View会将任何正常触摸视为点击。你应该做的是return True,拖动视图时,你应该return False

 boolean dragged = false;
 ViewConfiguration viewConfiguration = ViewConfiguration.get(getContext());
 int minTouchSlop = viewConfiguration.getScaledTouchSlop();

 .....

 public boolean onTouch(View v, MotionEvent event)
    {
        float currX,currY;

        int action = event.getAction();
        switch (action ) {
            case MotionEvent.ACTION_DOWN:
            {
                mPrevX = event.getRawX();
                mPrevY = event.getRawY();

                btnPrevX = tweatBtn.getX();
                btnPrevY = tweatBtn.getY();

                dragged = false; // global dragged variable

                break;
            }

            case MotionEvent.ACTION_MOVE:
            {
                Display display = getActivity().getWindowManager().getDefaultDisplay();
                int width  = display.getWidth() + 80;  // deprecated
                int height = display.getHeight();  // deprecated

                currX = event.getRawX();
                currY = event.getRawY();

                if(Math.abs(currX-mPrevX) > minTouchSlop || Math.abs(currY-mPrevY) > minTouchSlop)
                     dragged = true; // differntiate btw drag or click


                if(tweatBtn.getY() > 80 && tweatBtn.getX() > 0 && tweatBtn.getX() < width)
                {
                    tweatBtn.setX(btnPrevX + currX - mPrevX);
                    tweatBtn.setY(btnPrevY + currY - mPrevY);
                }
                else
                {
                    if((btnPrevY + currY - mPrevY) > 70 && (btnPrevX + currX - mPrevX) > -10 && tweatBtn.getX() < (width - 10))
                    {
                        tweatBtn.setX(btnPrevX + currX - mPrevX);
                        tweatBtn.setY(btnPrevY + currY - mPrevY);
                    }
                }
                break;
            }

            case MotionEvent.ACTION_CANCEL:
                break;

            case MotionEvent.ACTION_UP:
                break;
        }
        return dragged;
    }