4

我有imageView。我使用平底锅,捏imageView。有时我需要删除imageView。所以,我使用OnLongClickListener来移除图像。当我长时间点击我的imageView删除。但是,当我使用OnTouchListener进行平移时,捏住imageView OnLongPress激活并将我的imageView从视图中移除。如何解决这个问题?OnLongPress增加时间

代码:

imageView.setOnLongClickListener(new OnLongClickListener(){ 

    @Override 
    public boolean onLongClick(View v) { 
     // TODO Auto-generated method stub 
            imageView.setVisibility(View.GONE); 

     return true; 
     } 

    }); 



    imageView.setOnTouchListener(new View.OnTouchListener() { 
     final Handler handler = new Handler(); 
    Runnable mLongPressed = new Runnable() { 
     public void run() { 
      Log.i("", "Long press!"); 
     } 
    }; 



    @Override 
     public boolean onTouch(View v,MotionEvent event) { 
     // TODO Auto-generated method stub 

    if(event.getAction() == MotionEvent.ACTION_DOWN) 
     handler.postDelayed(mLongPressed, 1000); 
    if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() ==  MotionEvent.ACTION_UP)) 
     handler.removeCallbacks(mLongPressed); 



    layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams(); 

     switch(event.getAction()) 
     { 
    case MotionEvent.ACTION_DOWN : 
     { 
      parms = (RelativeLayout.LayoutParams) imageView.getLayoutParams(); 


     dx = event.getRawX() - parms.leftMargin; 
     dy = event.getRawY() - parms.topMargin; 


     } 
    break; 
     case MotionEvent.ACTION_MOVE : 
     { 
     x = event.getRawX(); 
     y = event.getRawY(); 
     parms.leftMargin = (int) (x-dx); 
     parms.topMargin = (int) (y - dy); 
              imageView.setLayoutParams(parms); 

    } 
    break; 
    case MotionEvent.ACTION_UP : 
    { 

     } 
     break; 
    } 
    return false; 
     } 
     }); 

     } 

    }); 
+0

你可以添加计时器,当你点击激活计时器,并执行任何你想要的操作时间 –

+0

如何?你能给一些代码吗? – user2474320

回答

9

您可以使用处理程序来执行此操作,但是如果用户将手指从屏幕上移开,您需要记住取消处理程序。 Yogesh并不完全错误,但上述方法只是在onClick和执行runnable之间增加了1000 ms的延迟。这意味着如果用户抬起手指,则可运行的程序仍将运行。这不是一个真正的longpress。

下面你可以看到,我现在还在用处理器与1000毫秒的延迟(你可以设置任何你想要的话),但如果用户提起他们的手指向上或移动删除回调。如果您想摆脱移动触发器,只需删除该部分通话。但要影响长时间按压,您需要考虑电梯,以确保用户始终握住手指。

final Handler handler = new Handler(); 
Runnable mLongPressed = new Runnable() { 
    public void run() { 
     Log.i("", "Long press!"); 
    } 
}; 

@Override 
public boolean onTouchEvent(MotionEvent event, View v){ 
    if(event.getAction() == MotionEvent.ACTION_DOWN) 
     handler.postDelayed(mLongPressed, 1000); 
    if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() ==  MotionEvent.ACTION_UP)) 
     handler.removeCallbacks(mLongPressed); 
     return false;  
} 
+0

放置此代码的位置? – user2474320

+0

你可以在你的onTouch监听器中使用它。不要使用标准的longpress列表器,就像你在顶部一样。你已经获得了动作事件并且只是简单地看到了响应 – Rarw

+0

CAn你检查我的编辑问题吗?添加是否正确? – user2474320

4

试试下面的代码: -

imageView.setOnClickListener(new View.OnClickListener() 
    Handler handle = new Handler(); 
      handle.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
    imageView.setVisibility(View.GONE); 

},1000); 
} 

1000是时间,因为你想,你可以增加..

+0

好的。我会试着.. – user2474320

+0

如果你有解决方案,请选择它并接受为解决方案。 –

+0

这种方法存在的问题是,它并没有真正扩展longpress阈值,而是设置了从点击发生时到运行runnable时的延迟时间。它只是在点击和跑步之间增加1秒的延迟。 – Rarw

0

onTouch,因为这总是要求你的看法是将事件分配给视图的初始状态。当你long press你的看法仍然叫onTouchfirst,因为你return trueonTouch(这意味着你已经消耗了这个事件,它不应该进一步调度),你不会得到onLongPress调用。窍门是returning falseonTouch

0

我知道的答案被选为前一段时间,但任何人谁是寻找一个解决方案,实际上延长了长按时间,解决办法是使用的onkeyup()布尔以防止你的代码在你的可运行从执行。这样一个KeyUp事件不会导致重置,而不仅仅是延迟可运行。我使用了keyevents,但该解决方案也适用于触摸事件。

private static final int longPressMilli = 3000; 
    boolean allowReset = true; 

Runnable mLongPressed = new Runnable() { 
     @Override 
     public void run() { 
      if(allowReset) { 
       sendResetIntent(); 
       Log.d(TAG, "Trip Reset!"); 
       allowReset = false; 
      } 
     } 

    }; 


@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     //System.out.println("" + keyCode); 
     if(GlobalBooleans.getReverseCamera()) return true; 

      switch (keyCode) { 

       case KeyEvent.KEYCODE_F6: 
        allowReset = true; //reset to true if u need to able to reset multiple times without navigating away from the page 
        pressHandler.postDelayed(mLongPressed, longPressMilli); 

        break; 
       default: 
        break; 
      } 
     // } 
     return true; 
    } 

@Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 

     switch (keyCode) { 
      case KeyEvent.KEYCODE_F6: 
       allowReset = false; 
       break; 
     } 


     return super.onKeyUp(keyCode, event); 
    }