Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
27 / 41 / 13
Регистрация: 15.05.2013
Сообщений: 1,313
1

Вспомогательный поток в SurfaceView

18.05.2014, 21:46. Показов 2121. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Правильно ли использовать дополнительный поток в SurfaceView?
Т.е. допустим для обработки долгого касания экрана, удержания.
В 42-й и 46-й строке вызывается дополнительный поток для обработки долгого нажатия и перемещения обьекта.
И надо ли как-то закрывать новый поток, созданный в строках 57-87?
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public class MainActivity extends Activity 
{
    MySurface surface;
    int left = -20;
    int right = 20;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        
        surface = new MySurface(this);
        
        setContentView(surface);
    }
 
////////////////////////////////////////////////////////////////////////////Surface
    public class MySurface extends SurfaceView 
            implements SurfaceHolder.Callback,OnTouchListener
    {
        MyThread thread = null;
        SurfaceHolder holder;
        private static final String TAG = "test";
 
        MySurface(Context context)
        {
            super(context);
 
            holder = getHolder();
            holder.addCallback(this);
            thread = new MyThread(holder);
            setOnTouchListener(this);
        }
        
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            if (event.getAction() == MotionEvent.ACTION_DOWN)
            {
                down = true;
                if (event.getX() < getWidth() / 2)
                {
                    threadLeft(left);
                }
                else if(event.getX() > getWidth()/2)
                {
                    threadRight(right);
                }
            }
            if (event.getAction() == MotionEvent.ACTION_UP) 
            {
                down = false;
            }
            return true;
        }
        
        //поток для обработки удержания кнопки
        public void threadLeft(final int direction){
            new Thread(new Runnable(){
                    public void run()
                    {
                        while (down)
                        {
                            if(bat.getX()>5)
                                bat.move(direction);
                                try{
                                    Thread.sleep(50);
                                }catch(Exception e){}
                            }
                    }}).start();
        }
        
        public void threadRight(final int direction){
            new Thread(new Runnable(){
                    public void run()
                    {
                        //Paint p=new Paint();
                        //p.getTextBounds(mbat,0,mbat.length(),rect);
                        while (down)
                        {
                            if(bat.getX()<getWidth()-123)
                                bat.move(direction);
                            try{
                                Thread.sleep(50);
                            }catch(Exception e){}
                            }
                    }}).start();
        }
  }
 
///////////////////////////////////////////Thread
public class MyThread extends Thread{
    public void run(){...}
}
...
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2014, 21:46
Ответы с готовыми решениями:

Вспомогательный алгоритм
Описать функцию, добавляющую к целому положительному числу слева цифру D (D лежит в диапазоне 0–9)....

Вспомогательный сайт
Два сайта - основной и вспомогательный со сходным (рерайтинг) контентом. Вспомогательный -...

Вспомогательный алгоритм БИТ
В соревнования по прыжкам в длину участвуют n спортсменов. Каждый имеет 3 попытки. Все результаты...

Вспомогательный класс DataManager
ASP NET MVC 3, я на 4 , у него просто получилось, у меня эта ошибка книжка лучше но видео просто...

3
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
18.05.2014, 22:02 2
Теоретически для этого второй поток ВООБЩЕ не нужен (я смог сделать и без него - своя вариация мультитатча)

Поток нужен для длительных операций МЕШАЮЩИХ основному (графическому) потоку и подвешивающие его. Например Вы тянете палец, а в потоке просчитываются взаимозависимости десяти обьектов по отношению к вашему пальцу. А потом на долю секунды перехватываете основной поток для отрисовки результата...

Для Вашей задачи вполне хватает обычного таймера! Нажали - засекли! Отжали - засекли разницу - обработали.
1
27 / 41 / 13
Регистрация: 15.05.2013
Сообщений: 1,313
18.05.2014, 22:25  [ТС] 3
Цитата Сообщение от Tester64 Посмотреть сообщение
Для Вашей задачи вполне хватает обычного таймера! Нажали - засекли! Отжали - засекли разницу - обработали.
а подробней можно?
как надо обрабатывать долгое нажатие с помощью таймера и как создавать слушатель?
Я просто как раз осваиваюсь в данный момент с таймерами, слушателями.
Они пока что для меня тёмный лес
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
19.05.2014, 02:05 4
При нажатии
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
a = System.currentTimeMillis();// запоминаем время
        private Timer timer_test1 = new Timer();
        timer_test1.schedule(new TimerTask() {
            @Override
            public void run() {
b = System.currentTimeMillis();// запоминаем время
                // проверка на Ваши секунды.   
if (b-a = 1000) {
    // ваши действия
}
 
            }
        }, 0, 100);
Как-то так... При отжатии timer_test1 остановите
(писал почти без хелпа - могут быть мелкие ошибки)
1
19.05.2014, 02:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2014, 02:05
Помогаю со студенческими работами здесь

Вспомогательный универсальный метод
Добрый день Имеется кусок кода: _countryDB = dbName.Countries.FirstOrDefault(x =&gt; x.Name ==...

Вспомогательный флаг переноса (AF)
Доброго всем дня. Буду краток. Требуется Сегодня вдруг с удивлением обнаружил что нет условного...

Вспомогательный алгоритм функция
сравнить кол-во цифр в 2-х числах.(алгоритм функции)

Мерцание в SurfaceView
Всем привет! Рисую на SurfaceView фон и на нем анимированные объекты. Кадры беру из атласа....

SurfaceView не отображается
Учусь программировать по книге П. Дейтел, Х. Дейтел &quot;Android для программистов. Создаём...

Ошибка в SurfaceView
есть игра. отрисовка идет через SurfaceView и поток привязанный к нему. ошибка возникает в...


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

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