GeilivableGY

Android中处理OnClick和OnTouch方法冲突的解决方案

目前想到的最好的解决方法,大家有更好的欢迎告知。

问题:在一个view中有一个按钮,要求可以通过点按移动这个按钮,同时单纯的点击而不移动这个按钮的话可以跳转到新的Activity。

遇到的困难:按钮的移动好实现,通过OnTouch的MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE以及MotionEvent.ACTION_UP可以实现,但是如果同时实现OnTouch和OnClick方法,会导致冲突。关于这方面的理论网上回答的很好,下面我写出我的解决方法。

按钮移动示例代码如下(转自网友):

public boolean onTouch(View v, MotionEvent event) {
        int action=event.getAction();
        Log.i("@@@@@@", "Touch:"+action);


        switch(action){
            case MotionEvent.ACTION_DOWN:
                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();

                break;
            /**
             * layout(l,t,r,b)
             * l  Left position, relative to parent
             t  Top position, relative to parent
             r  Right position, relative to parent
             b  Bottom position, relative to parent
             * */
            case MotionEvent.ACTION_MOVE:


                int dx = (int)event.getRawX() - lastX;
                int dy = (int)event.getRawY() - lastY;

                move(v, dx, dy);
                breakcase MotionEvent.ACTION_UP:
               

                break;
        }
        return false;
    }

    private void move(View v, int dx, int dy){
        int left = v.getLeft() + dx;
        int top = v.getTop() + dy;
        int right = v.getRight() + dx;
        int bottom = v.getBottom() + dy;
        if(left < 0){
            left = 0;
            right = left + v.getWidth();
        }
        if(right > screenWidth){
            right = screenWidth;
            left = right - v.getWidth();
        }
        if(top < 0){
            top = 0;
            bottom = top + v.getHeight();
        }
        if(bottom > screenHeight){
            bottom = screenHeight;
            top = bottom - v.getHeight();
        }
        v.layout(left, top, right, bottom);
        Log.i("@@@@@@", "position��" + left + ", " + top + ", " + right + ", " + bottom);
    }    

解决问题的核心方法是:

不要为这个按钮提供OnClick的方法,也就是不添加OnClickListener,OnClick的方法调用在OnTouch方法中实现。

具体描述:

添加一个boolean的全局变量初始化为false(表示按钮不移动),一旦触发了OnTouch中的MotionEvent.ACTION_MOVE,那么就表示按钮发生了移动,不触发点击动作,待触发了MotionEvent.ACTION_UP,就不发生动作并且把这个全局变量变为初始化的false;反之,如果没有移动,那么就触发点击动作。

posted on 2015-09-02 03:00  GeilivableGY  阅读(2317)  评论(0编辑  收藏  举报

导航