【问题标题】:onTouchListener and onClickListener on single widget单个小部件上的 onTouchListener 和 onClickListener
【发布时间】:2016-05-19 10:46:04
【问题描述】:
    @Override public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //movement
                initialX = params.x;
                initialY = params.y;
                initialTouchX = event.getRawX();
                initialTouchY = event.getRawY();
                return false;

            case MotionEvent.ACTION_UP:
                return false;

            case MotionEvent.ACTION_MOVE:
                //movement
                params.x = initialX + (int) (event.getRawX() - initialTouchX);
                params.y = initialY + (int) (event.getRawY() - initialTouchY);

                SharedPreferences.Editor pos = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
                pos.putInt("x",params.x);
                pos.putInt("y",params.y);
                pos.commit();

                windowManager.updateViewLayout(chatHead, params);
                return true;
        }
        return false;
    }
});

chatHead.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(), "Short Press", Toast.LENGTH_SHORT).show();
    }
});

chatHead.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        Toast.makeText(getApplicationContext(), "Long Press", Toast.LENGTH_SHORT).show();
        return true;
    }
});

这是我的 onTouch 方法。我将 onTouchListener、onClickListener 和 onLongClickListener 设置为单个图像视图。代码似乎工作正常,但是当我只移动图像很短的时间时,短按或长按也会运行。我该如何解决这个问题?

【问题讨论】:

    标签: android ontouch


    【解决方案1】:

    首先,您只需要使用 onTouchListener 并在某些条件的帮助下检测 onClick 和 onLongClick

    • 对于MotionEvent.ACTION_UP上的onClick放置条件

      if(initialTouchX == event.getRawX() && initialTouchY == event.getRawY()){
           //on Click Detected
      }
      
    • 对于 OnLongPress 试试这个

      setOnTouchListener(new View.OnTouchListener() {
           public boolean onTouch(View v, MotionEvent event) {
      
              int action = MotionEventCompat.getActionMasked(event);
      
      
              switch (event.getAction()) {
                  case MotionEvent.ACTION_DOWN:
                      longClick = false;
                      x1 = event.getX();
                      break;
      
                  case MotionEvent.ACTION_MOVE:
                      if (event.getEventTime() - event.getDownTime() > 500 && Math.abs(event.getX() - x1) < MIN_DISTANCE) {
                          longClick = true;
                      }
                      break;
      
                  case MotionEvent.ACTION_UP:
                              if (longClick) {
                                  Toast.makeText(activity, "Long preess", Toast.LENGTH_SHORT).show();
                              } 
              }
              return true;
          }
      });
      

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多