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

SurfaceView не отображается - Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
ВАндрейВ
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 10
30.04.2013, 20:26     SurfaceView не отображается #1
Учусь программировать по книге П. Дейтел, Х. Дейтел "Android для программистов. Создаём приложения". Делаю уже 5 приложение, но это не работает так как надо. Я себя сверял с листингами много раз, разницы не заметил. Читал разные статьи про SurfaceView и понял, что вроде бы всё нормально и структура нигде не нарушена. Тем не менее не отображается картинка игры и не срабатывает событие по двойному клику на экране (распознаётся как два одиночных клика). Помогите найти ошибку пожалуйста:
activity_main.xml
Java
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<com.example.cannongame.CannonView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/cannonView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white" />
CannonGame.java - Activity
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
package com.example.cannongame;
 
import android.app.Activity;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
 
public class CannonGame extends Activity
{
    private GestureDetector gestureDetector;
    private CannonView cannonView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        cannonView = (CannonView) findViewById(R.id.cannonView);
        gestureDetector = new GestureDetector(this, gestureListener);
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        
        cannonView.stopGame();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        
        cannonView.releaseResources();
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        
        int action = event.getAction();
        
        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE)
            cannonView.alignCannon(event);
        
        Log.e("activity", "Было одиночное касание");
        
        return super.onTouchEvent(event);
    }
    
    SimpleOnGestureListener gestureListener = new SimpleOnGestureListener()
    {
        @Override
        public boolean onDoubleTap(MotionEvent e)
        {
            cannonView.fireCannonball(e);
            Log.e("activity", "Было двойное касание");
            return true;
        }
    };
}
CannonView.java
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
package com.example.cannongame;
 
import java.util.HashMap;
import java.util.Map;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.media.AudioManager;
import android.media.SoundPool;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
 
public class CannonView extends SurfaceView implements SurfaceHolder.Callback {
    
    private CannonThread cannonThread; // контроль цикла игры
    private Activity activity; // отображение диалогового окна Game Over в потоке GUI
    private boolean dialogIsDisplayed = false;
    
    public static final int TARGET_PIECES = 7; // секции мишени
    public static final int MISS_PENALTY = 2; // секунды, вычитаемые в случае промаха
    public static final int HIT_REWARD = 3; // секунды, добавляемый при попадании
    
    // переменные, используемые для цикла игры и отслеживания статистики
    private boolean gameOver; // Игра завершена?
    private double timeLeft; // оставшееся время в секундах
    private int shotsFired; // количество выстрелов пользователя
    private double totalElapsedTime; // количество прошедших секунд
    
    // переменные, используемые при определении блока и мишени
    private Line blocker; // начальная и конечная точка блока
    private int blockerDistance; // расстояние до блока слева
    private int blockerBeginning; // расстояние до блока сверху
    private int blockerEnd; // расстояние до нижнего края блока сверху
    private int initialBlockerVelocity; // множитель начальной скорости блока
    private float blockerVelocity; //  множитель скорости блока во время игры
    private Line target; // начальная и конечная точка мишени
    private int targetDistance; // расстояние до мишени слева
    private int targetBeginning; // расстояние до мишени сверху
    private double pieceLength; // длина секции мишени
    private int targetEnd; // расстояние сверху до нижнего края мишени
    private int initialTargetVelocity; // множитель начальной скорости мишени
    private float targetVelocity; // множитель скорости мишени во время игры
    
    private int lineWidth; // ширина мишени и блока
    private boolean[] hitStates; // попадание во все секции мишени?
    private int targetPiecesHit; // количество поражённых секций мишени (из 7)
    
    // переменные для пушки и пушечного ядра
    private Point cannonball; // изображение ядра в левом верхнем углу
    private int cannonBallVelocityX; // скорось ядра по горизонтали
    private int cannonBallVelocityY; // скорость ядра по вертикали
    private boolean cannonballOnScreen; // ядро на эране?
    private int cannonballRadius; // радиус ядра
    private int cannonballSpeed; // скорость ядря
    private int cannonBaseRadius; // радиус основания пушки
    private int cannonLength; // длина ствола пушки
    private Point barrelEnd; // конец ствола пушки
    private int screenWidth; // ширина экрана
    private int screenHeight; // высота экрана
    
    // константы и переменные, используемые для управления звуком
    private static final int TARGET_SOUND_ID = 0; // мишень
    private static final int CANNON_SOUND_ID = 1; // пушка
    private static final int BLOCKER_SOUND_ID = 2; // блок
    private SoundPool soundPool; // звуковые эффекты
    private Map<Integer, Integer> soundMap; // отображение ID на SoundPool
    
    // переменные Paint, используемые для рисования на экране
    private Paint textPaint; // Paint, используемая для рисования текста
    private Paint cannonballPaint; // Paint, используемая для рисования ядра
    private Paint cannonPaint; // Paint, используемая для рисования пушки
    private Paint blockerPaint; // Paint, используемая для рисования блока
    private Paint targetPaint; // Paint, используемая для рисования мишени
    private Paint backgroundPaint; // Paint, используемая для чистки области рисования
    
    // общедоступный конструктор
    public CannonView(Context context, AttributeSet attrs)
    {
        super(context, attrs); // вызов конструктора super
        activity = (Activity) context;
        
        // регистрация слушателя SurfaceHolder.Callback
        getHolder().addCallback(this);
        
        // инициализация линий и точек, представляющий элементы игры
        blocker = new Line(); // создание блока в виде линии
        target = new Line(); // создание мишени в виде линии
        cannonball = new Point(); // создания ядра в виде точки
        
        // инициализация hitStates в виде булевского массива
        hitStates = new boolean[TARGET_PIECES];
        
        // инициализация SoundPool, используемого для воспрлоизведения трёх звуковых эффектов
        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        
        // создание карты звуков и педварительная загрузка звуков
        soundMap = new HashMap<Integer, Integer>(); // создание нового HashMap
        soundMap.put(TARGET_SOUND_ID, soundPool.load(context, R.raw.target_hit, 1));
        soundMap.put(CANNON_SOUND_ID, soundPool.load(context, R.raw.cannon_fire, 1));
        soundMap.put(BLOCKER_SOUND_ID, soundPool.load(context, R.raw.blocker_hit, 1));
        
        // конструирует Paints для рисования текста, ядра, пушки, блока, мишени;
        // все они конфигурируются с помощью метода onSizeChanged
        textPaint = new Paint(); // текст
        cannonPaint = new Paint(); // пушка
        cannonballPaint = new Paint(); // ядро
        blockerPaint = new Paint(); // блок
        targetPaint = new Paint(); // мишени
        backgroundPaint = new Paint(); // фон
        
        dialogIsDisplayed = false;
        Log.e("Prg", "CannonView создан");
    }
    
    // вызывается при изменении разверов вида, а также при первом добавлении в иерархию видов
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);
        
        screenWidth = w; // хранение значения ширины
        screenHeight = h; // хранение значения высоты
        cannonBaseRadius = h / 18; // радиус основания пушки, равный 1/18 от высоты экрана
        cannonLength = w/8; // длина пушки равна 1/8 от ширины экрана
        cannonballRadius = w/36; // радиус ядра равен 1/36 ширины экрана
        cannonballSpeed = w*3/8; // множитель скорости ядра
        lineWidth = w/24; // ширина мишени и блока равны 1/24 от ширины экрана
        
        // конфигурирование переменных экземпляра, связанных с блоком
        blockerDistance = w * 5 / 8; // зазор слева от блока равен 5/8 ширины экрана
        blockerBeginning = h/8; // зазор сверху от блока равен 1/8 от высоты экрана
        blockerEnd = h*3/8; // зазор сверху от блока равен 3/8 от высоты экрана
        initialBlockerVelocity = h /2; // начальный множитель скорости блока
        blocker.start = new Point(blockerDistance, blockerBeginning);
        blocker.end = new Point(blockerDistance, blockerEnd);
        
        
        // конфигурирование переменных экземпляра, связанных с мишенью
        targetDistance = w*7/8; // зазор слева от мишени равен 7/8 от ширины экрана
        targetBeginning = h/8; // зазор сверху от мишени равен 1/8 от высоты экрана
        targetEnd = h*7/8; // зазор сверху равен 7/8 от высоты экрана
        pieceLength = (targetEnd-targetBeginning)/TARGET_PIECES;
        initialTargetVelocity = -h/4; // множитель начальной скорости мишени
        target.start = new Point(targetDistance, targetBeginning);
        target.end = new Point(targetDistance, targetEnd);
        
        // конечная точка ствола пушки (изначально направлен по горизонтали)
        barrelEnd = new Point(cannonLength, h/2);
        
        // конфигурирование объектов Paint для рисования элементов игры
        textPaint.setTextSize(w/20); // размер текста равен 1/20 от ширины экрана
        textPaint.setAntiAlias(true); // сглаживание текста
        cannonPaint.setStrokeWidth(lineWidth*1.5f); // настройка толщины линии
        blockerPaint.setStrokeWidth(lineWidth); // настройка толщины линии
        targetPaint.setStrokeWidth(lineWidth); // настройка толщины линии
        backgroundPaint.setColor(Color.WHITE); // настройка фонового цвета
        
        newGame(); //  первоначальная настройка и запуск новой игры
        Log.e("Prg", "Размеры были изменены");
    }
    
    // переустановка всех элементов экрана и запуск новой игры
    public void newGame()
    {
        // присваивание каждому элементу массива hitStates значения false -- востановление секций мишени
        for (int i = 0; i < TARGET_PIECES; i++)
            hitStates[i] = false;
        
        targetPiecesHit = 0; // нет попадений в секции мишени
        blockerVelocity = initialBlockerVelocity; // настройка начальной скорости
        targetVelocity = initialTargetVelocity; // настройка начальной скорости
        
        timeLeft = 10; // начало обратного отсчёта 10 секунд
        cannonballOnScreen = false; // ядро не отображается на экране
        shotsFired = 0; // установка начального числа выстрелов
        totalElapsedTime = 0.0; // обнуление времени игры
        blocker.start.set(blockerDistance, blockerBeginning);
        blocker.end.set(blockerDistance, blockerEnd);
        target.start.set(targetDistance, targetBeginning);
        target.end.set(targetDistance, targetEnd);
        
        if (gameOver)
        {
            gameOver = false; // игра не завершена
            cannonThread = new CannonThread(getHolder());
            cannonThread.start();
            Log.e("Prg", "Началась новая игра");
        }
    }
    
    // вызывается повторно с помощью CannonThread для обновления элементов игры
    private void updatePositions(double elapsedTimeMS)
    {
        double interval = elapsedTimeMS / 1000.0; // преобразованиеи в секунды
        
        if (cannonballOnScreen) // был ли текущий выстрел
        {
            // обновление положения ядра
            cannonball.x += interval * cannonBallVelocityX;
            cannonball.y += interval * cannonBallVelocityY;
            
            // проверка столкновения с блоком
            if(cannonball.x + cannonballRadius > blockerDistance &&
               cannonball.x - cannonballRadius < blockerDistance &&
               cannonball.y + cannonballRadius > blocker.start.y &&
               cannonball.y - cannonballRadius < blocker.end.y)
            {
                cannonBallVelocityX *= -1; // реверсирование направления полёта ядра
                timeLeft -= MISS_PENALTY; // штраф для пользователя
                
                // воспроизведение звука блока
                soundPool.play(soundMap.get(BLOCKER_SOUND_ID), 1, 1, 1, 0, 1f);
            }
            
            // проверка столкновений с левой и правой стенками
            else if (cannonball.x + cannonballRadius > screenWidth ||
                    cannonball.x - cannonballRadius < 0)
                cannonballOnScreen = false; // удаление изображения ядра с экрана
            
            // проверка столкновений с верхней и нижней стенками
            else if (cannonball.y + cannonballRadius > screenHeight ||
                    cannonball.y - cannonballRadius < 0)
                cannonballOnScreen = false; // скрытие изображения ядра
            
            // проверка столкновения ядра с мишенью
            else if (cannonball.x + cannonballRadius > targetDistance &&
                    cannonball.x - cannonballRadius < targetDistance &&
                    cannonball.y + cannonballRadius > target.start.y &&
                    cannonball.y - cannonballRadius < target.end.y)
            {
                // определение номера секции мишени (0 сверху)
                int section = (int) ((cannonball.y - target.start.y) / pieceLength);
                
                // проверка попадания в секцию мишени
                if ((section >= 0 && section < TARGET_PIECES) && !hitStates[section])
                {
                    hitStates[section] = true; // попадание в секцию
                    cannonballOnScreen = false; // удаление ядра
                    timeLeft += HIT_REWARD; // добавление дополнительного времени
                    
                    // воспроизведение звука столкновения с мишенью
                    soundPool.play(soundMap.get(TARGET_SOUND_ID), 1, 1, 1, 0, 1f);
                    
                    // если были попадания во все секции мишени
                    if (++targetPiecesHit == TARGET_PIECES)
                    {
                        cannonThread.setRunning(false);
                        showGameOverDialog(R.string.win); // показать диалоговое окно выигрыша
                        gameOver = true; // игра завершена
                    }
                }
            }
 
            
        }
        
        // обновление позиции блока
        double blockerUpdate = interval * blockerVelocity;
        blocker.start.y += blockerUpdate;
        blocker.end.y += blockerUpdate;
        
        // обновление позиции мишени
        double targetUpdate = interval * targetVelocity;
        target.start.y += targetUpdate;
        target.end.y += targetUpdate;
        
        // при попадании в верхнюю или нижнюю часть блока реверсировать направление движения
        if (blocker.start.y < 0 || blocker.end.y > screenHeight)
            blockerVelocity *= -1;
        
        // при попадании в верхнюю или нижнюю часть мишени реверсировать направление движения
        if (target.start.y < 0 || target.end.y > screenHeight)
            targetVelocity *= -1;
        
        timeLeft -= interval; // вычитание из оставшегося времени
        
        // если показания таймера равны нулю
        if (timeLeft <= 0)
        {
            timeLeft = 0.0;
            gameOver = true; // игра завершена
            cannonThread.setRunning(false);
            showGameOverDialog(R.string.lose); // диалоговое окно проигрыша
        }
        Log.e("Prg", "Позиции обновлены");
    }
    
    // выстрел из пушки
    public void fireCannonball(MotionEvent event)
    {
        if (cannonballOnScreen) return;
        
        double angle = alignCannon(event);
        
        cannonball.x = cannonballRadius;
        cannonball.y = screenHeight / 2;
        
        cannonBallVelocityX = (int) (cannonballSpeed * Math.sin(angle));
        cannonBallVelocityY = (int) (cannonballSpeed * Math.cos(angle));
        cannonballOnScreen = true;
        shotsFired++;
        
        soundPool.play(soundMap.get(CANNON_SOUND_ID),  1, 1, 1, 0, 1f);
        Log.e("Prg", "Произведён выстрел");
    }
    
    public double alignCannon(MotionEvent event)
    {
        Point touchPoint = new Point((int) event.getX(), (int) event.getY());
        
        double centerMinusY = (screenHeight / 2 - touchPoint.y);
        
        double angle = 0;
        
        if (centerMinusY != 0)
            angle = Math.atan((double) touchPoint.x / centerMinusY);
        
        if (touchPoint.y > screenHeight / 2)
        {
            angle += Math.PI;
        }
        
        barrelEnd.x = (int) (cannonLength * Math.sin(angle));
        barrelEnd.y = (int) (-cannonLength * Math.cos(angle) + (screenHeight / 2));
        Log.e("Prg", "Пушка направлена");
        return angle;
    }
    
    public void drawGameElements(Canvas canvas)
    {
        canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), backgroundPaint);
        canvas.drawText(getResources().getString(R.string.time_remaining_format, timeLeft), 30, 50, textPaint);
        
        if (cannonballOnScreen)
            canvas.drawCircle(cannonball.x, cannonball.y, cannonballRadius, cannonballPaint);
        
        canvas.drawLine(0, screenHeight / 2, barrelEnd.x, barrelEnd.y, cannonPaint);
        
        canvas.drawCircle(0, (int) screenHeight / 2, (int) cannonBaseRadius, cannonPaint);
        
        canvas.drawLine(blocker.start.x, blocker.start.y, blocker.end.x, blocker.end.y, blockerPaint);
        
        Point currentPoint = new Point();
        
        currentPoint.x = target.start.x;
        currentPoint.y = target.start.y;
        
        for(int i = 1; i <= TARGET_PIECES; i++)
        {
            if(!hitStates[i-1])
                targetPaint.setColor(Color.YELLOW);
            else
                targetPaint.setColor(Color.BLUE);
            
            canvas.drawLine(currentPoint.x, currentPoint.y, target.end.x, (int) (currentPoint.y - pieceLength), targetPaint);
            
        }
        
        currentPoint.y += pieceLength;
        Log.e("prg", "Функция drawGameElements отработала");
    }
    
    private void showGameOverDialog(int messageId)
    {
        final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder((getContext()));
        dialogBuilder.setTitle(getResources().getString(messageId));
        dialogBuilder.setCancelable(false);
        
        dialogBuilder.setMessage(getResources().getString(R.string.results_format, shotsFired, totalElapsedTime));
        
        dialogBuilder.setPositiveButton(R.string.reset_game, new DialogInterface.OnClickListener() {
            
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialogIsDisplayed = false;
                newGame();
            }
        });
        
        activity.runOnUiThread(
            new Runnable() {
                public void run()
                {
                    dialogIsDisplayed = true;
                    dialogBuilder.show();
                }
            }
        );
    }
    
    public void stopGame()
    {
        if (cannonThread != null)
            cannonThread.setRunning(false);
    }
    
    public void releaseResources()
    {
        soundPool.release();
        soundPool = null;
    }
 
    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        cannonThread = new CannonThread(holder);
        cannonThread.setRunning(true);
        cannonThread.start();
        Log.e("Prg", "Повехность создана");
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        cannonThread.setRunning(false);
        
        while(retry)
        {
            try
            {
                cannonThread.join();
                retry = false;
                Log.e("Prg", "Поток уничтожен");
            }
            catch (InterruptedException e)
            {
                
            }
        }
    }
    
    private class CannonThread extends Thread
    {
        private SurfaceHolder surfaceHolder;
        private boolean threadIsRunning = true;
        
        public CannonThread(SurfaceHolder holder)
        {
            surfaceHolder = holder;
            setName("CannonThread");
        }
        
        public void setRunning(boolean running)
        {
            threadIsRunning = running;
        }
        
        @Override
        public void run()
        {
            Canvas canvas;
            long previousFrameTime = System.currentTimeMillis();
            
            while (threadIsRunning)
            {
                canvas = null;
                try
                {
                    canvas = surfaceHolder.lockCanvas();
                    
                    synchronized(surfaceHolder)
                    {
                        long currentTime = System.currentTimeMillis();
                        
                        double elapsedTimeMs = currentTime - previousFrameTime;
                        
                        totalElapsedTime += elapsedTimeMs / 1000.0;
                        updatePositions(elapsedTimeMs);
                        drawGameElements(canvas);
                        previousFrameTime = currentTime;
                        Log.e("Prg", "Данные меняются");
                    }
                }
                finally
                {
                    if (canvas != null)
                        surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}
Есть ещё класс line.java, но нет смысла его выкладывать, т. к. он нормально работает.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.04.2013, 20:37     SurfaceView не отображается #2
Цитата Сообщение от ВАндрейВ Посмотреть сообщение
не менее не отображается картинка игры
нужно дебагать, очень много кода нагородили...
Цитата Сообщение от ВАндрейВ Посмотреть сообщение
не срабатывает событие по двойному клику на экране
у вас gestureDetector негде не используется.
ВАндрейВ
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 10
30.04.2013, 20:41  [ТС]     SurfaceView не отображается #3
Где его ещё использовать? Я как понял он нужен только для задания обработчика который есть в CannonGame.java
Мне среда разработки тоже самое написала.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.04.2013, 20:43     SurfaceView не отображается #4
Цитата Сообщение от ВАндрейВ Посмотреть сообщение
Где его ещё использовать?
вы негде не использовали. в onTouchEvent используют(ивенты ему передают).
ВАндрейВ
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 10
30.04.2013, 20:49  [ТС]     SurfaceView не отображается #5
Я сверил себя с листингом из книги, там ничего такого нет.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.04.2013, 20:52     SurfaceView не отображается #6
Цитата Сообщение от ВАндрейВ Посмотреть сообщение
Я сверил себя с листингом из книги
а голова на плечах вам для чего?
может там дальше еще есть листинги на которых показано как использовать GestureDetector?
а текст вы читаете или только листинги?
ВАндрейВ
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 10
30.04.2013, 20:55  [ТС]     SurfaceView не отображается #7
Я читал текст и стать про GestureDetector в интернете читал и всё равно не понимаю.

Добавлено через 58 секунд
Мне нужнее понять по каким причинам SurfaceView может не отображаться....
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.04.2013, 21:00     SurfaceView не отображается #8
Цитата Сообщение от ВАндрейВ Посмотреть сообщение
Я читал текст и стать про GestureDetector в интернете читал и всё равно не понимаю.
значит плохо читали. вы должны передавать ему ивенты вызывая метод
Java
1
gestureDetector.onTouchEvent(event);
и основываясь на этих ивентах он делает вывод об двойном клике.


Цитата Сообщение от ВАндрейВ Посмотреть сообщение
Мне нужнее понять по каким причинам SurfaceView может не отображаться....
сложно так сразу сказать, кода много, нужно запускать, смотреть, дебагать...
ВАндрейВ
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 10
30.04.2013, 21:04  [ТС]     SurfaceView не отображается #9
Действительно, у меня в методе @Override public boolean onTouchEvent(MotionEvent event) написано return super.onTouchEvent(event), а должно быть return gestureDetector.onTouchEvent(event); Спасибо! Ещё одна проблема всё равно остаётся нерешенной. Помогите с ней.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.04.2013, 21:05     SurfaceView не отображается #10
Цитата Сообщение от ВАндрейВ Посмотреть сообщение
Ещё одна проблема всё равно остаётся нерешенной. Помогите с ней.
если выложите проект, могу взглянуть.
ВАндрейВ
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 10
30.04.2013, 21:12  [ТС]     SurfaceView не отображается #11
Вот проект: CannonGame.zip Спасибо, что возьмётесь помочь
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.04.2013, 21:24     SurfaceView не отображается #12
убрал
XML
1
android:background="@android:color/white"
и все заработало.
ВАндрейВ
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 10
30.04.2013, 21:27  [ТС]     SurfaceView не отображается #13
Действительно. Картинка появилась. Но всё равно работает не так как в примере. Это я думаю сам поразбираюсь. Но почему
XML
1
android:background="@android:color/white"
всё портило?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2013, 21:36     SurfaceView не отображается
Еще ссылки по теме:

Воспроизведение видео в SurfaceView Android
Android Вспомогательный поток в SurfaceView
Android Работа с SurfaceView
Узнать фон SurfaceView Android
Восстановление SurfaceView Android

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

Или воспользуйтесь поиском по форуму:
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.04.2013, 21:36     SurfaceView не отображается #14
Цитата Сообщение от ВАндрейВ Посмотреть сообщение
Но почему
android:background="@android:color/white"
всё портило?
не знаю, видимо нельзя так делать.
SurfaceView уникальный по способу отрисовки и, видимо, фон тоже нужно рисовать как остальное или можно попробовать задать в родительском View.
Yandex
Объявления
30.04.2013, 21:36     SurfaceView не отображается
Ответ Создать тему
Опции темы

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