我有一个自定义的列表视图,其中项目是水平滚动的。我想要对listview
项进行单点触控和长按5秒钟。如何做到这一点?如何将listview
项的长按
时间间隔增加到5秒钟。
我有一个自定义的列表视图,其中项目是水平滚动的。我想要对listview
项进行单点触控和长按5秒钟。如何做到这一点?如何将listview
项的长按
时间间隔增加到5秒钟。
这个功能更准确地复制了onLongPress,因为它在执行之前不等待用户松开手指。它是专门为ViewPager编写的,但应该可以应用类似的逻辑。
// long press duration in milliseconds
public static final int LONG_PRESS_DURATION = 2000;
private boolean mIsTouching = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == event.ACTION_DOWN) {
mIsTouching = true;
} else if (event.getAction() == event.ACTION_UP) {
mIsTouching = false;
}
return super.onTouchEvent(event);
}
@Override
public void onLongPress(MotionEvent event) {
// subtracts the system set timeout since that time has already occured at this point
int duration = LONG_PRESS_DURATION - getLongPressTimeout();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (mIsTouching) {
do something...
}
}
}, duration > 0 ? duration : 0);
}
Handler longTouchHandler= new Handler();
static final int longduration=10000;//10000ms press duration
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == event.ACTION_DOWN) {
longTouchHandler.postDelayed(new Runnable() {
@Override
public void run() {
Log.w("Longpress","longpressed");
}
}, longduration);
return true;
}
else if (event.getAction() == event.ACTION_UP) {
longTouchHandler.removeCallbacksAndMessages(null);
Log.w("Longpress","cancelled");
}
return super.onTouchEvent(event);
}
setOnItemLongClickListener
,然后你可以设置视图的触摸事件为 OnTouchListener
,你可以记录 ACTION_DOWN
和 ACTION_UP
的时间,这样你就可以计算出 ACTION_DOWN
和 ACTION_UP
之间是否超过了5秒。setOnTouchListener
来解决这个问题。private long then;
private int longClickDur= 5000; //5 seconds
//you can use any view you want
ImageView imageView = (ImageView) findViewById(R.id.longclick_view);
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
then = (long) System.currentTimeMillis();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if ((System.currentTimeMillis() - then) > longClickDuration) {
/* Long click behaviour will go here*/
Toast.makeText(context, "yay, long click", Toast.LENGTH.SHORT);
return false;
} else {
/* LONG CLICK FAILED*/
Toast.makeText(context, "TRY AGAIN", Toast.LENGTH.SHORT);
return false;
}
}
return true;
}
});
onTouchEvent
/ACTION_DOWN 中启动 postDelayed 更简单地完成此操作。在那里,不需要减去 getLongPressTimeout。不需要onLongPress
。 - ToolmakerSteve