我有imageView。我使用平底锅,捏捏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;
}
});
}
});
答案 0 :(得分:9)
您可以使用处理程序执行此操作,但是如果用户将手指从屏幕上移开,则需要记住取消处理程序。 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;
}
答案 1 :(得分:4)
尝试以下代码: -
imageView.setOnClickListener(new View.OnClickListener()
Handler handle = new Handler();
handle.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setVisibility(View.GONE);
},1000);
}
1000是您可以随意增加的时间..
答案 2 :(得分:0)
onTouch
,因为这是将事件分派给视图的初始状态。在long press
您的观看后,这仍然会调用onTouch
first
,因为return true
中的onTouch
(这意味着您已经消费了此事件,而且不应该进一步发送)你不会被称为LongPress。问题的关键是returning false
onTouch
答案 3 :(得分:0)
我知道答案是刚才选择的,但是对于那些正在寻找实际延长长按时间的解决方案的人来说,解决方案是在onKeyUp()中使用布尔来防止你的runnable中的代码执行。这样,单个KeyUp事件不会导致重置,而不仅仅是延迟runnable。我使用了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);
}