Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

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

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

Гуру, подскажите.

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

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

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

...понимаю что надо отловить лонгклик, запустить некий таймер, отловить "отпускание татча", остановить таймер...
но может готовое решение есть???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2016, 11:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Мягкий лонг-клик по кнопке с таймером (Программирование Android):

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

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

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

Многоразовый клик по кнопке - jQuery
Изобрел своеобразный велосипед, который подгружает мне контент вместе с кнопкой. Суть такова: нажимаем на кнопку - очищается все содержимое...

Клик мышки на кнопке - JavaScript
Добрый день! Подскажите плз как сделать нажатие левой кнопки мышки автоматически по определенной кнопке через каждые 4 сек. Инетересует...

Клик по кнопке JavaScript - JavaScript
Кликаю по кнопке программно таким кодом: <script type="text/javascript"> document.getElementById("my_form").submit(); </script> ...

13
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
10.08.2016, 12:01 #2
писал ровно 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 для него - не порблема?
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.08.2016, 17:20  [ТС] #3
Цитата Сообщение от Паблито Посмотреть сообщение
писал ровно 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
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
10.08.2016, 17:28 #4
Цитата Сообщение от Tester64 Посмотреть сообщение
Мой вариант чуть и гибче
спасибо, поржал, сферический говнокод в вакуууме

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

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

За сим... если увидишь тему от меня - просьба игнорировать!
0
korshun84
21 / 76 / 17
Регистрация: 08.07.2014
Сообщений: 406
12.08.2016, 08:15 #6
Цитата Сообщение от Tester64 Посмотреть сообщение
У каждого свой стиль кода!
Это не "стиль кода", это то, что сказали чуть выше, повторять не стану.
От одного только ((Button) view.findViewById(R.id.bt_chg1)).setOnLongClickListener(new View.OnLongClickListener() { ... } волосы на одном месте рвать хочется.
Цитата Сообщение от Tester64 Посмотреть сообщение
if(time-timer_begin-5*1000>0) {
Это адъ.
Цитата Сообщение от Tester64 Посмотреть сообщение
if(!timer_runed) {
Ты не в курсе, как должны выглядеть имена переменных ?
Да и англ. подтянуть не мешало бы. "Рунический таймер", лол
0
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 322
12.08.2016, 11:32 #7
Цитата Сообщение от korshun84 Посмотреть сообщение
От одного только ((Button) view.findViewById(R.id.bt_chg1)).setOnLongClickListener(new View.OnLongClickListener() { ... } волосы на одном месте рвать хочется.

Раньше тоже так периодически писал, но... как-то вроде мне показалось не совсем правильно.
Сам себя даже не могу объяснить почему.
Чем плох такой стиль?
1
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
12.08.2016, 12:06 #8
fraley, наверное
1 кнопка имеет непонятное имя
2 все обработчики накапливаются в OnCreate раздувая его до нечитаемых размеров и, возможно, снижая изоляцию кода обработчиков от окружения (тела OnCreate)
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
12.08.2016, 13:59  [ТС] #9
Цитата Сообщение от 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
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 322
12.08.2016, 14:06 #10
Цитата Сообщение от vxg Посмотреть сообщение
1 кнопка имеет непонятное имя
2 все обработчики накапливаются в OnCreate раздувая его до нечитаемых размеров и, возможно, снижая изоляцию кода обработчиков от окружения (тела OnCreate)
Я такое использовал в небольших проектах(больше по учебе) с одной двумя кнопками.
Когда стал писать проекты большего размера, стало неудобно.
И собственно наткнувшись сейчас на эту тему, решил для себя уяснить окончательно - что в таком подходе неправильного, кроме удобно-неудобно.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
12.08.2016, 15:32  [ТС] #11
Цитата Сообщение от 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
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
12.08.2016, 18:49 #12
Tester64, я так понимаю что следующий цикл напутственных статей как сделать побыстрее раскроет нам глаза на то что хардкодить строки в маленьких проектах тоже можно если ну очень маленький проект и мы ну очень торопимся)
0
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 322
12.08.2016, 18:52 #13
Цитата Сообщение от Tester64 Посмотреть сообщение
Судя по тому что я встречал в учебниках (пока учился) ничего "неправильного" в этих конструкциях нет!
Так народ же выше в один голос пишет что это плохой подход.
Я лично для себя хотел бы понять почему.
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
12.08.2016, 19:12 #14
fraley синтаксически подход верен и решает свою задачу, делать так для диалогов - нормально, делать так для обычных сколько-нибудь развитых в плане кода кнопок - потеря читаемости. Вопрос почти религиозный, решайте для себя индивидуально что лучше. По пальцам в таком подходе может ударить только нарушение изоляции (мы можем случайно залезть в "чужую" финал переменную)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2016, 19:12
Привет! Вот еще темы с ответами:

Не срабатывает клик по кнопке - C#
У меня есть pictureBox2 и button1 при наведении на pictureBox2 поверх его появляется button1 и при клике на него должен открыться диалог,...

Клик по кнопке в браузере - Delphi WinAPI
День добрый! Подскажите возможно ли программно нажать на ссылку или кнопку к примеру в браузере Internet Explorer (или любом другом)?

Не работает клик по кнопке - C# WPF
Не получается запустить даже самый простой код Вот это ХАМЛ код &lt;Window x:Class=&quot;WpfApplication1.MainWindow&quot; ...

Клик по кнопке (WebBrowser) - Delphi
Кнопка : &lt;input type=&quot;hidden&quot; name=&quot;item&quot; value=&quot;1&quot;&gt; &lt;input type=&quot;submit&quot; value=&quot;Купить&quot; style=&quot;height: 30px; margin-top:10px;&quot;&gt; ...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
12.08.2016, 19:12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru