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

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

Войти
Регистрация
Восстановить пароль
 
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,069
#1

Вспомогательный поток в SurfaceView - Программирование Android

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

Правильно ли использовать дополнительный поток в 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 21:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вспомогательный поток в SurfaceView (Программирование Android):

Работа с SurfaceView - Программирование Android
Отрисовка в SurfaceView никогда не вызывала трудностей, до тех пор, пока не запустил приложение на телефоне с экраном 1920х1080px. Фпс упал...

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

Мерцание в SurfaceView - Программирование Android
Всем привет! Рисую на SurfaceView фон и на нем анимированные объекты. Кадры беру из атласа. Появилось мерцание, причем фон не мерцает а...

Восстановление SurfaceView - Программирование Android
Кто работал с SurfaceView, помогите! Рисую на SurfaceView с помощью onTouchEvent(), без потока, все замечательно рисует, сворачиваю...

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

SurfaceView + onKeyDown - Программирование Android
Проблемка очень простая - не реагирует на onKeyDown в классе, наследующем SurfaceView. Исправьте мою криворукость, пожалуйста, подскажите,...

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

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

Для Вашей задачи вполне хватает обычного таймера! Нажали - засекли! Отжали - засекли разницу - обработали.
1
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,069
18.05.2014, 22:25  [ТС] #3
Цитата Сообщение от Tester64 Посмотреть сообщение
Для Вашей задачи вполне хватает обычного таймера! Нажали - засекли! Отжали - засекли разницу - обработали.
а подробней можно?
как надо обрабатывать долгое нажатие с помощью таймера и как создавать слушатель?
Я просто как раз осваиваюсь в данный момент с таймерами, слушателями.
Они пока что для меня тёмный лес
0
Tester64
396 / 357 / 43
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2014, 02:05
Привет! Вот еще темы с ответами:

Обработка касаний в SurfaceView - Программирование Android
Всем привет! Для обработки касаний в surfaceview определяю OnTouchEvent () но касания не обрабатываются. Контролирую через Log.d(). В чем...

Camera без SurfaceView - Программирование Android
Здравствуйте. Можно ли сделать снимок с помощью класса Camera без предварительного просмотра? Например Camera.open() и потом сразу...

Простейший пример SurfaceView - Программирование Android
Здравствуйте. Напишите пожалуйста простейшую программу рисующую точку на экране с помощью SurfaceView.

SurfaceView&Canvas - Программирование Android
Подскажите, как реализовать отображение, например, карандашика, когда рисуешь на Canvas в SurfaceView. В какую сторону копать, чтобы такое...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
19.05.2014, 02:05
Ответ Создать тему
Опции темы

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