【问题标题】:onTouch, onLongClick together in AndroidonTouch, onLongClick 在 Android 中一起使用
【发布时间】:2012-06-12 09:20:38
【问题描述】:

我正在动态地将 ImageViews 添加到父布局,并在添加的图像上使用 onTouch 执行放大/缩小操作。

我想删除带有onLongPress 的添加视图。

img.setOnLongClickListener(longClickAction);
img.setOnTouchListener(touchAction); 
 

长按:

OnLongClickListener longClickAction = new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        parentLayout.removeView((ImageView)v);
        return false;
    }
};

触摸:

OnTouchListener touchAction = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ImageView i = (ImageView)v;

        // Perform zoom operation onTouch of ImageView
        zoom(i, event);
        return true; 
    }
};

为什么只有 onTouch 事件起作用?

我怎样才能让它们都工作?

我应该怎么做才能删除添加的视图?

【问题讨论】:

  • @Siddhesh 关注我的below answer,问题就解决了。

标签: android event-handling touch-event onlongclicklistener ontouch


【解决方案1】:

onTouch 总是为您的视图调用,因为这是将事件分派到视图的初始状态。当你长按你的视图时,它仍然首先调用onTouch,因为你在onTouch中返回true(这意味着你已经消费了这个事件,它不应该被进一步调度)你不会得到onLongPress叫。诀窍是在onTouch 中返回false

【讨论】:

  • 但是onTouchonLongPress 都会被调用。如果onLongPress 的意思是不打电话给onTouch 呢?
  • @LuisA.Florit:你找到解决方案了吗?我也遇到了同样的问题,onTouch 和 onLongPress 都同时被调用..
【解决方案2】:

正如@asenovm 所讨论的那样onTouch() 总是被调用,因为它是将事件分派到视图的初始状态, 但是如果我们返回值 falseonTouch() 然后两者都会像魅力一样工作,问题就会得到解决。

编辑:我给用户的建议是,不要同时实现 OnLongClickListener() 和 OnTouch(),而是尝试在 双击 事件中使用 OnLongClickListener() 的功能.

您可以通过以下方式实现双击:

int i = 0;
btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    i++;
    Handler handler = new Handler();
    Runnable r = new Runnable() {

        @Override
        public void run() {
            i = 0;
        }
    };

    if (i == 1) {
        //Single click
        handler.postDelayed(r, 250);
    } else if (i == 2) {
        //Double click
        i = 0;
        ShowDailog();
    }


  }
});

【讨论】:

    【解决方案3】:

    试试这个,它对我来说很好。

    boolean isMoving= false;
    
    yourView.setOnTouchListener(new View.OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                isMoving = true;
                Log.i("isMoving:", "true");
            }
            if(event.getAction()==MotionEvent.ACTION_UP){
                isMoving=false;
                Log.i("isMoving:","false");
            }
            return false;
        }
    });
    yourView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            if(!isMoving){
                //do onlongclick event here
            }
            return true;
        }
    });;
    

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      如果您需要手指保持静止,那么在 Kotlin 中最简单的方法就是这样

      onCreateView 中:

      view.setOnTouchListener(this)
      view.setOnClickListener(this)
      view.setOnLongClickListener {
          if (! isFingerMoving) {
              Toast.makeText(activity, "Long click detected", Toast.LENGTH_LONG).show()
              //do something
          }
          false
      }
      

      onTouch 中:

      fun onTouch(v: View?, event: MotionEvent): Boolean {
          when (event.actionMasked) {
              MotionEvent.ACTION_DOWN -> {
                  isFingerMoving = false
                  lastTouchX = event.getX(0)
                  lastTouchY = event.getY(0)
                  ...
              }
              
              MotionEvent.ACTION_MOVE -> {
                  val deltaX = (x - lastTouchX) * event.xPrecision
                  val deltaY = (y - lastTouchY) * event.yPrecision
                  if ((deltaX.absoluteValue > 0.1) || (deltaY.absoluteValue > 0.1)) 
                      isFingerMoving = true            
                  ...                 
              }
          }
          return false
      }
      

      【讨论】:

        【解决方案6】:

        你不能通过 setOnLongClickListener 和 setOnTouchListener 一起实现 因为当您在 onTouch 方法中返回 true 时,它​​假定您处理所有触摸事件,您可以通过延迟后实现长点击并在超时后调用方法,但您需要检查是否仍在按下或触发动作 可能这个代码快照对你有帮助

         mBinding.iv2.setOnTouchListener(object : View.OnTouchListener {
        
                var stillPress = false
                override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean {
                    if(motionEvent?.action == MotionEvent.ACTION_DOWN){
                         stillPress = true
                        Handler(Looper.getMainLooper()).postDelayed({
                            if(stillPress)
                                zoomImageFromThumb(view!!,R.drawable.ic_baseline_adb_24)
                        },1000)
                    }
        
                    if(motionEvent?.action == MotionEvent.ACTION_UP){
                        stillPress = false
                        mBinding.expandedImage.performClick()
                    }
                    return true
        
                }
            })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-22
          相关资源
          最近更新 更多