С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518

Мягкий лонг-клик по кнопке с таймером

10.08.2016, 11:36. Показов 2928. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Гуру, подскажите.

Есть ли ПРОСТОЕ и готовое решение для такого??

Есть:
Обычная Button увеличивает параметр/счетчик на +1.

Хочу:
Чтобы нажав долго на кнопку включится быстрый/ускоренный таймер быстро увеличивающий счетчик. (юзеру 100 раз лень нажимать)
При отпускании кнопки таймер должен остановиться.

...понимаю что надо отловить лонгклик, запустить некий таймер, отловить "отпускание татча", остановить таймер...
но может готовое решение есть???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.08.2016, 11:36
Ответы с готовыми решениями:

Клик по кнопке в элементе listView
Доброго времени суток. Пишу свое первое приложение под андроид. На данный момент получаю листвью, в каждом поле которого отображаются 4...

Клик в соответствии с таймером
zAkS__dBUpU Вот то что я хотел сделать уже пол года. Нужно что бы в программе был таймер, а таймер работает с интервалом в 1 мс. Если в...

QT клик мышкой в заданное время, в соотношении с таймером
Помогите. Нужно сделать таймер с точностью до тысячных. Затем, если в таймере появляется нужное число, то производится клик мышкой. Пример:...

13
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
10.08.2016, 12:01
писал ровно 10 минут, дарю
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
 
public class AwesomeButton extends Button implements View.OnLongClickListener, View.OnTouchListener, View.OnClickListener {
 
    private int count = 0;
    private final long DELAY = 100;
 
    public AwesomeButton(Context context) {
        super(context);
        init();
    }
 
    public AwesomeButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
 
    private void init() {
        setOnClickListener(this);
        setOnLongClickListener(this);
        setOnTouchListener(this);
    }
 
    @Override
    public boolean onLongClick(View view) {
        postDelayed(action, DELAY);
        return false;
    }
 
    @Override
    public boolean onTouch(View view, MotionEvent e) {
        switch (e.getAction()) {
            case MotionEvent.ACTION_CANCEL:
                stopTimer();
                break;
            case MotionEvent.ACTION_UP:
                stopTimer();
                break;
        }
        return false;
    }
 
    private void stopTimer() {
        getHandler().removeCallbacks(action);
    }
 
    @Override
    public void onClick(View view) {
        tickCounter();
    }
 
    private void tickCounter() {
        count++;
        setText(String.valueOf(count));
    }
 
    private final Runnable action = new Runnable() {
        @Override
        public void run() {
            tickCounter();
            postDelayed(action, DELAY);
        }
    };
}
в разметке юзается примерно так
XML
1
2
3
4
    <com.example.mytestapplication.AwesomeButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="PRESS ME" />
счетчик внутри кнопки, но я думаю дописать пару строк чтобы отправлял counter или сделать setter/getter для него - не порблема?
2
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
10.08.2016, 17:20  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
писал ровно 10 минут
Я свой тоже минут 15-20 писал... Хотелось СИСТЕМНОЕ решение... (типа как с анимацией - натравил класс на кнопку и пользуюсь)

Мой вариант чуть и гибче:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    private Timer timer;
    private long timer_begin;
    private boolean timer_runed = false;
 
 
        ((Button) view.findViewById(R.id.bt_chg1)).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                TimerTask task1 = new TimerTask() {
                    @Override
                    public void run() {
                        long time=System.currentTimeMillis();
                        if(timer_begin==-1) timer_begin = time;
 
                        // плавное наращивание скорости... НЕ ПРОВЕРЕНО
                        if(time-timer_begin-5*1000>0) {
                            setValueAddUi(-10);
                        }else if(time-timer_begin-3*1000>0) {
                            setValueAddUi(-5);
                        }else{
                            setValueAddUi(-1);
                        }
                    }
                };
                if(!timer_runed) {
                    timer_begin = -1;
                    timer = new Timer();
                    timer.schedule(task1, 1, 100);
                    timer_runed = true;
                }
                return false;
            }
        });
        ((Button) view.findViewById(R.id.bt_chg1)).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if((motionEvent.getAction() == MotionEvent.ACTION_UP)||(motionEvent.getAction() == MotionEvent.ACTION_CANCEL)) {
                    if (timer_runed){ timer.cancel(); timer = null; timer_runed = false; }
                }
                return false;
            }
        });
(в своих "костылях на скорую руку" мог что-нибудь упустить, что приведет к зависанию в самый нужный момент и отпугнет пользователя)
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
10.08.2016, 17:28
Цитата Сообщение от Tester64 Посмотреть сообщение
Мой вариант чуть и гибче
спасибо, поржал, сферический говнокод в вакуууме

в принципе, я код писал что-бы руку потренировать
я давно уже понял что к тебе в темы лучше не заходить - ничего полезного и нового для себя я из них не вынесу
за сим сливаюсь
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
10.08.2016, 18:30  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
спасибо, поржал, сферический говнокод в вакуууме
Не нравится - не ешь!
Достал уже!!!

У каждого свой стиль кода!
Мой не требует лишних процедур, легко подвязывается под несколько кнопок прямо в onCreate.
Реально чуствуется ускорение, а не тупое включил/выключил.
Сделано КУСКОМ диалога в Preference - в большом классе.
Проверено на убитом китайском устройстве и работает даже когда память устройства перегружена и сран... умная ява+андроид позволяют себе не все команды выполнять.
Потрачено 20 минут и дальше к этой теме не собирался возвращаться! Просто "было бы удобно для юзера еще и...".

За сим... если увидишь тему от меня - просьба игнорировать!
0
90 / 89 / 23
Регистрация: 08.07.2014
Сообщений: 548
12.08.2016, 08:15
Цитата Сообщение от Tester64 Посмотреть сообщение
У каждого свой стиль кода!
Это не "стиль кода", это то, что сказали чуть выше, повторять не стану.
От одного только ((Button) view.findViewById(R.id.bt_chg1)).setOnLo ngClickListener(new View.OnLongClickListener() { ... } волосы на одном месте рвать хочется.
Цитата Сообщение от Tester64 Посмотреть сообщение
if(time-timer_begin-5*1000>0) {
Это адъ.
Цитата Сообщение от Tester64 Посмотреть сообщение
if(!timer_runed) {
Ты не в курсе, как должны выглядеть имена переменных ?
Да и англ. подтянуть не мешало бы. "Рунический таймер", лол
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
12.08.2016, 11:32
Цитата Сообщение от korshun84 Посмотреть сообщение
От одного только ((Button) view.findViewById(R.id.bt_chg1)).setOnLo ngClickListener(new View.OnLongClickListener() { ... } волосы на одном месте рвать хочется.

Раньше тоже так периодически писал, но... как-то вроде мне показалось не совсем правильно.
Сам себя даже не могу объяснить почему.
Чем плох такой стиль?
1
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
12.08.2016, 12:06
fraley, наверное
1 кнопка имеет непонятное имя
2 все обработчики накапливаются в OnCreate раздувая его до нечитаемых размеров и, возможно, снижая изоляцию кода обработчиков от окружения (тела OnCreate)
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
12.08.2016, 13:59  [ТС]
Цитата Сообщение от korshun84 Посмотреть сообщение
Ты не в курсе, как должны выглядеть имена переменных ?
в курсе... Но ява это не мой "родной язык". И я на нем не кодил почти пол года. (в других языках живу)
и мне ТАК УДОБНЕЕ! Читабельнее!
Получился "компактный набор переменных" начинающийся с "timer_" - лекго устранить конфликты если такое имя уже есть. И после перехода в С++ из Delphi/php я боюсь разбрасываться переменными вида doCalculation - "на форсаже" по привычке не слежу за большими буквами...

Цитата Сообщение от korshun84 Посмотреть сообщение
Да и англ. подтянуть не мешало бы. "Рунический таймер", лол
ну ошибся... торопился и поленился залезть в переводчик. Читаю на английском часто, но пишу редко. Логическая цепочка была run=запустить, run+ed=запущено... (у меня такие вещи почти на рефлексах + слепой набор на клаве = миллисекунды до результата)

Цитата Сообщение от korshun84 Посмотреть сообщение
Это адъ.
почему ад??? работает? да! подобные решения часто менять прийдется? нет!
5*1000 осталось со времени "подгонки под дизайн" - глазами быстрее найти 5*, а не считать нолики. Позднее возможно "отполирую" для "коробочного варианта".
Писалось "эволюционным методом": <timer_begin+5*1000 - чой-то не заработало... возможно в знаках ошибся... выпишу в одну строку - так понятнее...

Да и вообще обзывать "говнокодом" ЛЮБОЙ код который не претендует на роль публичного - обидно для любого автора!!!! Или думаете я не знаю что мой код далек до идеального??? ("только негр может называть другого негром")

факт - я по быстрому "нагуглил" как работать с циклическим таймером, обработку отпускания кнопки, вспомнил как работать с текущим временем. Знал что они есть, но не помнил даже названия конструкций. По быстрому (меньше 20 минут) слепил из этого рабочую версию нужного мне кода... Его можно "скопипастить" любому студенту и оно заработает с минимальными изменениями. Код же Паблито фиг поменяешь (попробуй положить туда 3 внешних обработчика без знания интерфейсов)...

А Паблито вообще то так не ответил на мой вопрос! Правильный ответ был - "Такого ГОТОВОГО/СИСТЕМНОГО решения нет и я не встречал в опенсорсах - пиши сам"...

Видели бы вы с каким чужим кодом мне приходилось работать... Даже goto использовали, но не смотря на "нечитабельность" работало раза в 1.5-2 быстрее чем мой "красивый" код написанный по правилам. Я наоборот был восхищен логикой когда разобрался...

Цитата Сообщение от vxg Посмотреть сообщение
1 кнопка имеет непонятное имя
в диалоге 2 кнопки = +1/-1, отвечают за change
И я максимально "обезличил" код перед выкладыванием.

Цитата Сообщение от vxg Посмотреть сообщение
2 все обработчики накапливаются в OnCreate раздувая его до нечитаемых размеров и, возможно, снижая изоляцию кода обработчиков от окружения (тела OnCreate)
Это редкое, частное решение! Для диалога с кодом в 3 страницы. Это самый мощный код который там вообще есть - остальное уровня "подключи вьюв" и добавь к второй строке prefference строку из переменной. Заблудиться тяжело - иначе бы писал бы сразу внешний класс обработки.
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
12.08.2016, 14:06
Цитата Сообщение от vxg Посмотреть сообщение
1 кнопка имеет непонятное имя
2 все обработчики накапливаются в OnCreate раздувая его до нечитаемых размеров и, возможно, снижая изоляцию кода обработчиков от окружения (тела OnCreate)
Я такое использовал в небольших проектах(больше по учебе) с одной двумя кнопками.
Когда стал писать проекты большего размера, стало неудобно.
И собственно наткнувшись сейчас на эту тему, решил для себя уяснить окончательно - что в таком подходе неправильного, кроме удобно-неудобно.
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
12.08.2016, 15:32  [ТС]
Цитата Сообщение от fraley Посмотреть сообщение
что в таком подходе неправильного, кроме удобно-неудобно.
Судя по тому что я встречал в учебниках (пока учился) ничего "неправильного" в этих конструкциях нет! И вполне годится для небольшого кода (когда мини-активити, или "дизайнерский" диалог), да и в больших можно использовать когда код внутри обработок не большой и отдельная функция засорит код.

Вот кусочек из "коллекции"
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    public void YesNo_Classic(Activity context, String mess,
            String yes, final DialogInterface.OnClickListener listener_yes,
            String no, final DialogInterface.OnClickListener listener_no) {
 
        AlertDialog.Builder quitDialog = new AlertDialog.Builder(context);
        quitDialog.setTitle(Html.fromHtml(mess));
 
        quitDialog.setPositiveButton(yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
                if (listener_yes!=null) listener_yes.onClick(null, 0);
            }
        });
        quitDialog.setNegativeButton(no, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
                if (listener_no!=null) listener_no.onClick(null, 0);
            }
        });
 
        quitDialog.show();
    }
 
 
//пример:
    @Override
    public void onBackPressed() {
 
        uni_Dialogs.YesNo_Classic(this, "Выход:\nВы уверены?",
                "Увы да!", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                },
                "Нет", null
        );
    }
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
12.08.2016, 18:49
Tester64, я так понимаю что следующий цикл напутственных статей как сделать побыстрее раскроет нам глаза на то что хардкодить строки в маленьких проектах тоже можно если ну очень маленький проект и мы ну очень торопимся)
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
12.08.2016, 18:52
Цитата Сообщение от Tester64 Посмотреть сообщение
Судя по тому что я встречал в учебниках (пока учился) ничего "неправильного" в этих конструкциях нет!
Так народ же выше в один голос пишет что это плохой подход.
Я лично для себя хотел бы понять почему.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
12.08.2016, 19:12
fraley синтаксически подход верен и решает свою задачу, делать так для диалогов - нормально, делать так для обычных сколько-нибудь развитых в плане кода кнопок - потеря читаемости. Вопрос почти религиозный, решайте для себя индивидуально что лучше. По пальцам в таком подходе может ударить только нарушение изоляции (мы можем случайно залезть в "чужую" финал переменную)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2016, 19:12
Помогаю со студенческими работами здесь

Клик по кнопке
Не могли бы помочь написать скрипт который будет кликать по кнопке браузера как она становится активной. Вот кнопка: &lt;button...

Автоматический клик по кнопке
Скажу сразу, до этого утра с js никогда не работала. На сайте (не моем) есть есть кнопка, вот ее код &lt;button...

Не работает клик по кнопке
Задача зарегистрировать пользователя в бд sql &lt;?php ini_set('display_errors', 'On'); error_reporting(E_ALL); $DBHOST...

Клик по javascript кнопке
Всем привет, при регестрации почтового ящика на mail.ru есть кнопка &quot;Уменя нет мобильного телефона&quot;, после нажатия на нее стоновится...

Клик по кнопке в директиве
есть директива (function(angular) { 'use strict'; angular.module('sglPaperButton', ) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru