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

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

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

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

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

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

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

...понимаю что надо отловить лонгклик, запустить некий таймер, отловить "отпускание татча", остановить таймер...
но может готовое решение есть???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2016, 11:36
Ответы с готовыми решениями:

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

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

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

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

13
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
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 для него - не порблема?
2
420 / 357 / 47
Регистрация: 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
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
10.08.2016, 17:28 4
Цитата Сообщение от Tester64 Посмотреть сообщение
Мой вариант чуть и гибче
спасибо, поржал, сферический говнокод в вакуууме

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

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

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

Раньше тоже так периодически писал, но... как-то вроде мне показалось не совсем правильно.
Сам себя даже не могу объяснить почему.
Чем плох такой стиль?
1
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,410
12.08.2016, 12:06 8
fraley, наверное
1 кнопка имеет непонятное имя
2 все обработчики накапливаются в OnCreate раздувая его до нечитаемых размеров и, возможно, снижая изоляцию кода обработчиков от окружения (тела OnCreate)
1
420 / 357 / 47
Регистрация: 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
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
12.08.2016, 14:06 10
Цитата Сообщение от vxg Посмотреть сообщение
1 кнопка имеет непонятное имя
2 все обработчики накапливаются в OnCreate раздувая его до нечитаемых размеров и, возможно, снижая изоляцию кода обработчиков от окружения (тела OnCreate)
Я такое использовал в небольших проектах(больше по учебе) с одной двумя кнопками.
Когда стал писать проекты большего размера, стало неудобно.
И собственно наткнувшись сейчас на эту тему, решил для себя уяснить окончательно - что в таком подходе неправильного, кроме удобно-неудобно.
0
420 / 357 / 47
Регистрация: 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
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,410
12.08.2016, 18:49 12
Tester64, я так понимаю что следующий цикл напутственных статей как сделать побыстрее раскроет нам глаза на то что хардкодить строки в маленьких проектах тоже можно если ну очень маленький проект и мы ну очень торопимся)
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
12.08.2016, 18:52 13
Цитата Сообщение от Tester64 Посмотреть сообщение
Судя по тому что я встречал в учебниках (пока учился) ничего "неправильного" в этих конструкциях нет!
Так народ же выше в один голос пишет что это плохой подход.
Я лично для себя хотел бы понять почему.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,410
12.08.2016, 19:12 14
fraley синтаксически подход верен и решает свою задачу, делать так для диалогов - нормально, делать так для обычных сколько-нибудь развитых в плане кода кнопок - потеря читаемости. Вопрос почти религиозный, решайте для себя индивидуально что лучше. По пальцам в таком подходе может ударить только нарушение изоляции (мы можем случайно залезть в "чужую" финал переменную)
1
12.08.2016, 19:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2016, 19:12
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru