【问题标题】:OnLongPress increase timeOnLongPress 增加时间
【发布时间】:2013-06-25 12:48:56
【问题描述】:

我有 imageView。我使用平移,捏图像视图。有时我需要删除 imageView。所以,我使用 OnLongClickListener 来删除图像。当我使用长按我的 imageView 删除。但是当我使用 OnTouchListener 进行平移时,捏住 imageView OnLongPress 激活并且我的 imageView 从视图中移除。如何解决?

代码:

    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;
       }
       });

      }

   });

【问题讨论】:

  • 您可以在点击激活计时器时添加计时器,并在需要的时间执行您想要的操作
  • 怎么样?能给点代码吗?

标签: android android-imageview ontouchlistener onlongclicklistener


【解决方案1】:

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

您可以在下面看到我仍在使用延迟 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;    
}

【讨论】:

  • 你可以在你的 onTouch 监听器中使用它。不要像在顶部那样使用标准的 longpress 侦听器。你已经得到了motionevent并查看只是相应地处理响应
  • 我增加了 3 秒的时间。但是 imageView 突然消失了。为什么?
  • 你能帮忙增加时间吗?
  • 当我移动 imageView 时,Lonpress 也被触发并且图像从视图中移除。
  • 不...我没有更改我的代码中的任何内容..但它不起作用
【解决方案2】:

试试下面的代码:-

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

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

},1000);
}

1000 是您可以根据需要增加的时间..

【讨论】:

  • 如果您有解决方案,请投票并接受作为解决方案。
  • 我对这种方法的问题是它并没有真正延长长按阈值,而只是设置了从点击发生到运行可运行文件的延迟。它只是在点击和运行之间增加了 1 秒的延迟。
  • 见下文,您只需要在用户抬起手指时取消回调即可。否则,这将始终在单击后运行 1000 毫秒。
【解决方案3】:

onTouch 总是为您的视图调用,因为这是将事件分派到视图的初始状态。当您long press 您的视图时,它仍然调用onTouch first 并且由于您在onTouchreturn true(这意味着您已经消费了此事件并且不应进一步分派)您将无法获得 onLongPress叫。有什么诀窍是returning false in onTouch

【讨论】:

    【解决方案4】:

    我知道不久前选择了一个答案,但对于任何正在寻找解决方案以实际延长长按时间的人来说,解决方案是在 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);
        }
    

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 2010-10-31
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多