4

我有图像视图。我使用平移,捏图像视图。有时我需要删除 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;
       }
       });

      }

   });
4

4 回答 4

10

您可以使用处理程序来执行此操作,但如果用户将手指从屏幕上移开,您需要记住取消处理程序。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;    
}
于 2013-06-25T13:26:28.850 回答
4

试试下面的代码: -

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

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

},1000);
}

1000 是您可以随心所欲地增加的时间。

于 2013-06-25T13:11:50.753 回答
0

onTouch总是为您的视图调用,因为这是将事件分派到视图的初始状态。当您long press的视图仍然调用时onTouch first,并且由于您return true进入onTouch(这意味着您已经使用了此事件并且不应该进一步分派它),您将不会调用 onLongPress。诀窍returning false在于onTouch

于 2013-06-25T13:22:15.660 回答
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);
    }
于 2017-07-28T17:07:27.747 回答