簡體   English   中英

在Android中正確處理onTouch和onClick事件

[英]Handling onTouch and onClick events properly in android

我正在使用以下代碼在屏幕上拖動視圖

   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;
        }
    });
}

它可以正常工作,但有時在我舉起手指時會自動觸發喀噠聲。如何改善?

在代碼末尾,您總是返回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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM