带onClick和onLongClick的Android onTouch

我有一个自定义视图,就像一个button。 我想在用户按下时更改背景,当用户将手指移动到外部或将其释放时,将背景恢复为原始,并且还要处理onClick / onLongClick事件。 问题是,onTouch要求我为ACTION_DOWN返回true,否则不会向我发送ACTION_UP事件。 但是,如果我返回true onClick侦听器将无法正常工作。

我以为我通过在onTouch中返回false并注册onClick来解决它 – 它以某种方式工作,但有点反对文档。 我刚刚收到用户告诉我的消息,他不能长按button,所以我想知道这里有什么问题。

部分当前代码:

 public boolean onTouch(View v, MotionEvent evt) { switch (evt.getAction()) { case MotionEvent.ACTION_DOWN: { setSelection(true); // it just change the background break; } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_OUTSIDE: { setSelection(false); // it just change the background break; } } return false; } public void onClick(View v) { // some other code here } public boolean onLongClick(View view) { // just showing a Toast here return false; } // somewhere else in code setOnTouchListener(this); setOnClickListener(this); setOnLongClickListener(this); 

我如何让他们一起正常工作?

提前致谢

  • GridView上下移动该列上的列
  • 无论如何从视图对象中删除onTouchListener?
  • 用触摸事件移动imageview
  • Android系统上的“touchmove”事件:Transformer Prime
  • 触摸设备上的jQuery拖放(iPad,Android)
  • 在视图的Ontouch方法中单击触摸检测
  • Android onTouchEvent坐标跳过
  • 为什么我总是从onTouchEvent获取ACTION_DOWN
  • onClickonLongClick实际上是从View.onTouchEvent

    如果您重写View.onTouchEvent或通过setOnTouchListener设置一些特定的setOnTouchListener ,则必须注意这一点。

    所以你的代码应该是这样的:

     public boolean onTouch(View v,MotionEvent evt)
     {
       //发送点击/长按事件,
       //您必须将事件传递给它的默认callbackView.onTouchEvent
       boolean defaultResult = v.onTouchEvent(evt);
    
      开关(evt.getAction())
       {
        大小写MotionEvent.ACTION_DOWN:
         {
          为setSelection(真);  //只是改变背景
          打破;
         }
        大小写MotionEvent.ACTION_CANCEL:
        大小写MotionEvent.ACTION_UP:
        案例MotionEvent.ACTION_OUTSIDE:
         {
          为setSelection(假);  //只是改变背景
          打破;
         }
        默认:
          返回defaultResult;
       }
    
       //如果你到达这里,你已经消耗了这个事件
      返回true;
     }