Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
#1

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

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

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

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

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

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

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

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

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

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

Клик по кнопке
Не могли бы помочь написать скрипт который будет кликать по кнопке браузера как...

Не работает клик по кнопке
Не получается запустить даже самый простой код Вот это ХАМЛ код <Window...

13
Pablito
2713 / 2159 / 732
Регистрация: 12.05.2014
Сообщений: 7,532
Завершенные тесты: 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 / 46
Регистрация: 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
2713 / 2159 / 732
Регистрация: 12.05.2014
Сообщений: 7,532
Завершенные тесты: 1
10.08.2016, 17:28 #4
Цитата Сообщение от Tester64 Посмотреть сообщение
Мой вариант чуть и гибче
спасибо, поржал, сферический говнокод в вакуууме

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

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

За сим... если увидишь тему от меня - просьба игнорировать!
0
korshun84
86 / 86 / 22
Регистрация: 08.07.2014
Сообщений: 506
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
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
12.08.2016, 11:32 #7
Цитата Сообщение от korshun84 Посмотреть сообщение
От одного только ((Button) view.findViewById(R.id.bt_chg1)).setOnLongClickListener(new View.OnLongClickListener() { ... } волосы на одном месте рвать хочется.

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

Правый клик по кнопке
Создал диалоговое приложение (MFC), в нем кнопка. Хотел сделать обработчик на...

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

Клик по кнопке JavaScript
Кликаю по кнопке программно таким кодом: &lt;script type=&quot;text/javascript&quot;&gt; ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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