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

标签 java android eclipse

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

   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 会将任何正常的触摸视为点击。你应该做的是当 View 被拖动时返回True,否则你应该返回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;
    }

关于java - 在android中正确处理onTouch和onClick事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988528/

相关文章:

java - 如何更改 android.support.v7.widget.Toolbar 上的文本?

java - 使用带有 Eclipse IDE 的 Google map API 在 Java 中连接被拒绝错误,而相同的 URL 在浏览器中给我结果

java - 如何从 Java 程序发送 HTTP POST 请求?

android - 在对话框中更改标题文本的颜色和字体

java - Mongo 模板在 Spring.Mongodb 中按日期间隔聚合

java - 交叉算法实现

java - Maven 冲突依赖 kafka-stream-test-utils 和 kafka-streams

java - 使用 SQLite 创建表时出错

java - 类文件 javax/faces/webapp/FacesServlet 中的非 native 或抽象方法中缺少代码属性编译错误

java - 在SQL优化中,我们是否应该总是使用LIMIT来防止系统下载大量数据?或者还有其他更好的解决方案吗?