【发布时间】:2017-05-10 16:17:01
【问题描述】:
我有一个自定义listview,其中的项目是滚动水平。我想对 listview 项目执行单点触摸和长按 5 秒。这个怎么做。如何将 listview 项目的 longpress 时间间隔增加到 5 秒。
【问题讨论】:
标签: android long-press
我有一个自定义listview,其中的项目是滚动水平。我想对 listview 项目执行单点触摸和长按 5 秒。这个怎么做。如何将 listview 项目的 longpress 时间间隔增加到 5 秒。
【问题讨论】:
标签: android long-press
你可以setOnItemLongClickListener,然后你可以将你触摸的视图设置为OnTouchListener,你可以记录ACTION_DOWN的时间和ACTION_UP的时间,这样你就可以计算时间是否超过5秒在ACTION_DOWN 和ACTION_UP 之间。
【讨论】:
1.2.3.4.5 然后释放。
您无法更改延迟。它在 android 框架中是硬连线的。几天前我也遇到了同样的问题。
您可以手动使用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;
}
});
【讨论】:
这更准确地复制了 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);
}
【讨论】:
onLongPress(MotionEvent) 方法在哪里?我在ViewPager 中找不到它。您是指View.OnLongClickListener 中的onLongClick(View view) 吗?
onTouchEvent/ACTION_DOWN 中启动 postDelayed 来更简单地完成。在那里,没有必要减去 getLongPressTimeout。不需要onLongPress。
这是我的实现:(你不需要释放来拍摄动作)
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);
}
【讨论】: