У меня есть custom listview
, в котором элементы прокручиваются горизонтально. Я хочу выполнить одиночное касание и долгое нажатие для элементов в течение 5 секунд для listview
элементов. Как это сделать. Как увеличить longpress
интервал времени для listview
элементов до 5 секунд.
android: как увеличить время нажатия для элементов списка в Android?
Ответы (4)
Это более точно воспроизводит 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);
}
person
Denver AK
schedule
04.07.2017
Где
onLongPress(MotionEvent)
метод? Не могу найти в ViewPager
. Вы имеете в виду onLongClick(View view)
в View.OnLongClickListener
?
- person Tim Kist; 05.10.2017
Спасибо. Сработало для меня, хотя мне пришлось удалить getLongPressTimeout () из вашего решения.
- person TomV; 13.11.2017
Это можно сделать проще, запустив postDelayed в
onTouchEvent
/ ACTION_DOWN. Здесь нет необходимости вычитать getLongPressTimeout. Не нужен onLongPress
.
- person ToolmakerSteve; 06.10.2018
Вы можете setOnItemLongClickListener
, затем вы можете установить вид, которым вы касаетесь OnTouchListener
, вы можете записывать время, когда ACTION_DOWN
, и время ACTION_UP
, чтобы вы могли вычислить, если время между ACTION_DOWN
и ACTION_UP
больше 5 секунд.
person
juemuren4449
schedule
26.12.2016
ИМО, это было бы неестественным вариантом использования, потому что мы обычно ждем всплывающего окна или каких-либо изменений, прежде чем отпустить палец, пользователь обычно не считает
1.2.3.4.5
, а затем отпускает.
- person Enzokie; 26.12.2016
Чтобы прояснить комментарий Энзоки: если вы ждете, пока ACTION_UP вычислит время, пользователь не сможет узнать, достаточно ли долго он удерживал его. Вместо этого действие должно запускаться с задержкой после ACTION_DOWN, если палец все еще касается. См. Ответ Денвера.
- person ToolmakerSteve; 06.10.2018
Вы не можете изменить задержку. Он встроен в структуру 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;
}
});
person
Amit Bhandari
schedule
26.12.2016
Я сделал то же самое, но в этом случае горизонтальная прокрутка списка не происходит ....
- person Manish Kumar; 26.12.2016
Это та же проблема, которую Энзоки упомянул в ответе juemuren: это не дает ПОЛЬЗОВАТЕЛЮ никакой обратной связи относительно того, когда они удерживали касание достаточно долго. См. Ответ Денвера для лучшего подхода.
- person ToolmakerSteve; 06.10.2018
это долгий щелчок, а не долгое нажатие
- person tosh17; 14.01.2020
Вот моя реализация: (Вам не нужно отпускать, чтобы снять действие)
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);
}
person
Levente Gulyás
schedule
19.05.2021