Can't handle both click and touch events simultaneously

后端 未结 12 2068
时光说笑
时光说笑 2020-12-01 03:45

I am trying to handle touch events and click events on a button. I do the following:

button.setOnClickListener(clickListener);
button.setOnTouchListener(touc         


        
12条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-01 04:08

    ## Exact working solution for both click action and touch listener(dragging) ##
    
    private int initialX;
    private int initialY;
    private float initialTouchX;
    private float initialTouchY;
    private float CLICK_ACTION_THRESHOLD = 0.5f;
    private float startX;
    private float startY;
    
     @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (view.getId()) {
            case R.id.chat_head_profile_iv:
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        //remember the initial position.
                        initialX = params.x;
                        initialY = params.y;
                        startX = event.getX();
                        startY = event.getY();
                        //get the touch location
                        initialTouchX = event.getRawX();
                        initialTouchY = event.getRawY();
                        return true;
                    case MotionEvent.ACTION_UP:
                        float endX = event.getX();
                        float endY = event.getY();
                        if (shouldClickActionWork(startX, endX, startY, endY)) {
                            openScreen();// WE HAVE A CLICK!!
                        }
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        //Calculate the X and Y coordinates of the view.
                        params.x = initialX + (int) (event.getRawX() - initialTouchX);
                        params.y = initialY + (int) (event.getRawY() - initialTouchY);
    
                        //Update the layout with new X & Y coordinate
                        mWindowManager.updateViewLayout(mChatHeadView, params);
                        return true;
                }
                break;
        }
        return true;
    }
    
    private boolean shouldClickActionWork(float startX, float endX, float startY, float endY) {
        float differenceX = Math.abs(startX - endX);
        float differenceY = Math.abs(startY - endY);
        if ((CLICK_ACTION_THRESHOLD > differenceX) && (CLICK_ACTION_THRESHOLD > differenceY))
            return true;
        else
            return false;
    }
    

提交回复
热议问题