powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / SurfaceView
45 сообщений из 45, показаны все 2 страниц
SurfaceView
    #38905549
Здравствуйте! Начинаю разбираться с SurfaceView. Нашёл этот пример в интернете, но при сворачивании программы вылетает ошибка.
Помогите её миновать.
...
Рейтинг: 0 / 0
SurfaceView
    #38905561
...
Рейтинг: 0 / 0
SurfaceView
    #38907087
Во всех примерах прилагается такой код. Господа давайте его усовершенствуем и выложим сюда.
...
Рейтинг: 0 / 0
SurfaceView
    #38907091
...
Рейтинг: 0 / 0
SurfaceView
    #38907167
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нам, как будто делать нечего больше сидеть и запускать какой то код и ловить, что за за ошибка там выскакивает.


новичкам, сперва хотя бы, научится логи смотреть.
...
Рейтинг: 0 / 0
SurfaceView
    #38907639
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновЗдравствуйте! Начинаю разбираться с SurfaceView. Нашёл этот пример в интернете, но при сворачивании программы вылетает ошибка.
Помогите её миновать.
Обычно к таким сообщениям текст ошибки и стек выкладывают.
...
Рейтинг: 0 / 0
SurfaceView
    #38909302
Здравствуйте! Выкладываю текст ошибки и стек.

Текст ошибки:
В приложении "SurfaceView" произошла ошибка.

Стек:
03-19 10:27:22.280: E/AndroidRuntime(6014): FATAL EXCEPTION: Thread-526
03-19 10:27:22.280: E/AndroidRuntime(6014): java.lang.NullPointerException
03-19 10:27:22.280: E/AndroidRuntime(6014): at com.example.surfaceview.GameView.onDraw(GameView.java:94)
03-19 10:27:22.280: E/AndroidRuntime(6014): at com.example.surfaceview.GameLoopThread.run(GameLoopThread.java:26)
...
Рейтинг: 0 / 0
SurfaceView
    #38909303
Выкладываю снова, потомучто выше ссылка уже неактивна
http://zalil-slil.rusfolder.net/files/upload/?session=20177020b2a5a84aa7731255aa0a18a4
...
Рейтинг: 0 / 0
SurfaceView
    #38910310
Пожалуйста, помогите очень надо.
...
Рейтинг: 0 / 0
SurfaceView
    #38910501
wamaco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновПожалуйста, помогите очень надо.
читайте про потоки, до просветления!
...
Рейтинг: 0 / 0
SurfaceView
    #38910587
Я читал про потоки в данном вопросе я не смог понять в чём причина ошибки.
В чём причина нежелания мне помочь? Если файл не хотите качать давайте я сюда выложу исходники

activity_main.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/qwe"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >

        <SurfaceView
            android:id="@+id/surfaceView1"
            android:layout_width="600dp"
            android:layout_height="600dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
    </RelativeLayout>

</LinearLayout>



GameLoopThread
Код: 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.
package com.example.surfaceview;

import android.annotation.SuppressLint;
import android.graphics.Canvas;

public class GameLoopThread extends Thread {

	private GameView view;
	private boolean running = false;

	public GameLoopThread(GameView view) {
		this.view = view;
	}

	public void setRunning(boolean run) {
		running = run;
	}

	@SuppressLint("WrongCall")
	public void run() {
		while (running) {
			Canvas c = null;
			try {
				c = view.surfaceHolder.lockCanvas();
				synchronized (view.surfaceHolder) {
					view.onDraw(c);
				}
			} finally {
				if (c != null) {
					view.surfaceHolder.unlockCanvasAndPost(c);
				}
			}
		}
	}
	
}



GameView
Код: 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.
package com.example.surfaceview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameView extends SurfaceView {

    private Bitmap bmp;
	private GameLoopThread gameLoopThread;
    private int x = 0;  
    private int xSpeed = 1;
    Context context;
    
    SurfaceHolder surfaceHolder;
    SurfaceView surfaceView1;
    
	public GameView(Context context, SurfaceView surfaceView1) {
		super(context);
		
		this.context = context;
		this.surfaceView1 = surfaceView1;
		init();
	}

	public GameView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		init();
	}

	public GameView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		this.context = context;
		init();
	}
	
    public void init() {
	    surfaceView1.setZOrderOnTop(true); 
	    surfaceHolder = surfaceView1.getHolder();
	    surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
	    
	    gameLoopThread = new GameLoopThread(this);
	    
		surfaceHolder.addCallback(new SurfaceHolder.Callback() {
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {
				boolean retry = true;
				gameLoopThread.setRunning(false);
				while (retry) {
					try {
						gameLoopThread.join();
						retry = false;
					} catch (InterruptedException e) {
					}
				}
			}

			@Override
			public void surfaceCreated(SurfaceHolder holder) {
				gameLoopThread.setRunning(true);
				gameLoopThread.start();
			}

			@Override
			public void surfaceChanged(SurfaceHolder holder, int format,
					int width, int height) {
			}
		});
	    
	    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
	}

    @Override
	protected void onDraw(Canvas canvas) {
		if (x == canvas.getWidth() - bmp.getWidth()) {
			xSpeed = -1;
		}
		if (x == 0) {
			xSpeed = 1;
		}
		x = x + xSpeed;
		canvas.drawColor(Color.BLACK);
		canvas.drawBitmap(bmp, x, 10, null);
	}

}



MainActivity
Код: 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.
package com.example.surfaceview;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;

public class MainActivity extends Activity {

	GameView gameview;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);
		
		SurfaceView surfaceView1 = (SurfaceView) findViewById(R.id.surfaceView1);
		gameview = new GameView(this, surfaceView1);
	}

	@Override
	protected void onResume() {
		super.onResume();
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
...
Рейтинг: 0 / 0
SurfaceView
    #38914359
Здравствуйте!
По прежнему не решил свою проблемку.
Помогите, пожалуйста, или пример дайте
...
Рейтинг: 0 / 0
SurfaceView
    #38914376
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример таки отличается от приведенного кода... В какой именно строке ошибка?
...
Рейтинг: 0 / 0
SurfaceView
    #38914634
at com.example.surfaceview.GameView.onDraw(GameView.java:85)
at com.example.surfaceview.GameLoopThread.run(GameLoopThread.java:26)
...
Рейтинг: 0 / 0
SurfaceView
    #38914636
GameView в 94 строке просто я менял код и поэтому лог другой
я кстати выше написал в каких строках ошибки
...
Рейтинг: 0 / 0
SurfaceView
    #38914639
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновat com.example.surfaceview.GameView.onDraw(GameView.java:85)
at com.example.surfaceview.GameLoopThread.run(GameLoopThread.java:26)
Это что, шутка? Или не умеешь код подсвечивать?
ВолодяХаритонов
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
protected void onDraw(Canvas canvas) {
		if (x == canvas.getWidth() - bmp.getWidth()) {
			xSpeed = -1;
		}
		if (x == 0) {
			xSpeed = 1;
		}
		x = x + xSpeed;
		canvas.drawColor(Color.BLACK);
		canvas.drawBitmap(bmp, x, 10, null);
	}
...
Рейтинг: 0 / 0
SurfaceView
    #38914820
Не умею код подсвечивать, извините
...
Рейтинг: 0 / 0
SurfaceView
    #38914848
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновНе умею код подсвечивать, извините
В указанную строку я просто добавил ">>>" вначале и "<<<" в конце. Это в факе по форуму описано.
http://www.sql.ru/faq/faq_topic.aspx?fid=202
...
Рейтинг: 0 / 0
SurfaceView
    #38915157
Ну извините буду знать.
Давайте вернёмся к моему вопросу
...
Рейтинг: 0 / 0
SurfaceView
    #38915226
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется, кто то что-то, откуда-то загуглил вставил
теперь жаждет пока "само собой" решится.
...
Рейтинг: 0 / 0
SurfaceView
    #38915257
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновДавайте вернёмся к моему вопросу
wadmanВ какой именно строке ошибка?
...
Рейтинг: 0 / 0
SurfaceView
    #38915383
Ошибки в этих двух строках:
at com.example.surfaceview.GameView.onDraw(GameView.java:82)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Override
	protected void onDraw(Canvas canvas) {
		if (x == canvas.getWidth() - bmp.getWidth()) {
			xSpeed = -1;
		}
		if (x == 0) {
			xSpeed = 1;
		}
		x = x + xSpeed;
		canvas.drawColor(Color.BLACK);
		canvas.drawBitmap(bmp, x, 10, null);
	}


at com.example.surfaceview.GameLoopThread.run(GameLoopThread.java:26)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@SuppressLint("WrongCall")
	public void run() {
		while (running) {
			Canvas c = null;
			try {
				c = view.surfaceHolder.lockCanvas();
				synchronized (view.surfaceHolder) {
					view.onDraw(c);
				}
			} finally {
				if (c != null) {
					view.surfaceHolder.unlockCanvasAndPost(c);
				}
			}
		}
	}
...
Рейтинг: 0 / 0
SurfaceView
    #38915473
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему там не используется getHolder()?
...
Рейтинг: 0 / 0
SurfaceView
    #38915845
getHolder() используется в процедуре init()
Код: java
1.
2.
3.
4.
public void init() {
	    surfaceView1.setZOrderOnTop(true); 
	    surfaceHolder = surfaceView1.getHolder();
	    surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
...
Рейтинг: 0 / 0
SurfaceView
    #38916038
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки придется тебе научиться пользоваться отладкой. У меня пример из 17394608 работает.

Смотри, где там null. Может битмап не грузится...
...
Рейтинг: 0 / 0
SurfaceView
    #38916190
Этот пример у меня тоже работает.
Там при создании такой код:
Код: java
1.
2.
3.
4.
5.
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new GameView(this));
}


а мне надо, чтоб создание было таким образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);
		
		SurfaceView surfaceView1 = (SurfaceView) findViewById(R.id.surfaceView1);
		gameview = new GameView(this, surfaceView1);
	}


Потому что, на активити будет несколько SurfaceView. Вот а такой пример работающий я не могу найти в инете, и решить сам не могу. Поэтому сюда и пишу уж который день...
...
Рейтинг: 0 / 0
SurfaceView
    #38916196
Битмап грузится и анимация есть. Ошибки вылетает при сворачивании программы.
Вот я ещё раз выкладываю ссылку на архив с программой. wadman, посмотрите пожалуйста архив.
...
Рейтинг: 0 / 0
SurfaceView
    #38916197
...
Рейтинг: 0 / 0
SurfaceView
    #38916206
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритонов, зачем несколько? Почему одного не хватает?

П.С. Задача вообще в чем?
...
Рейтинг: 0 / 0
SurfaceView
    #38916217
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновОшибки вылетает при сворачивании программы.
Тогда стоит почитать про цикл жизни приложения и активити. Какие методы при каких действиях вызываются.

В данном случае происходит обращение к "убитому" объекту.
...
Рейтинг: 0 / 0
SurfaceView
    #38916218
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SurfaceView
    #38916237
Я это уже понял а что мне нужно писать в OnPause например и в OnResume ??
Если я заново запускаю поток в OnResume, то вылетает ошибка, что поток уже запущен.
Запустите проект сами всё увидите.

Ну хорошо, например даже один SurfaceView, но мне нужно ещё и кнопки разместить в приложении, а в примере это не представляется возможным. Разве только вручную их отрисовывать?!!
...
Рейтинг: 0 / 0
SurfaceView
    #38916293
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновЕсли я заново запускаю поток в OnResume, то вылетает ошибка, что поток уже запущен.
В паузе поток нужно уничтожать, в резюме - создавать.

ВолодяХаритоновРазве только вручную их отрисовывать?!!
У меня стойкое ощущение, что пропущены самые азы при начале разработки под андроид...
Но вообще да, при разработки игр отдается предпочтение ручной прорисовке интерфейса. Либо использование готовых инструментов типа libgdx, andEngine и т.п.
...
Рейтинг: 0 / 0
SurfaceView
    #38916320
wadmanВолодяХаритоновЕсли я заново запускаю поток в OnResume, то вылетает ошибка, что поток уже запущен.
В паузе поток нужно уничтожать, в резюме - создавать.
Я читал что поток нельзя уничтожить, как бы он сам должен завершиться. А запускается поток в программе 1 раз иначе ошибка java.lang.IllegalThreadStateException: Thread already started.

Так ли это?
...
Рейтинг: 0 / 0
SurfaceView
    #38916360
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВолодяХаритоновТак ли это?
В целом да. Потоку нужно сообщить, что он уже больше не нужен.
...
Рейтинг: 0 / 0
SurfaceView
    #38916382
Даже если я сообщаю потоку в onPause или onDestroy с помощью метода setRunning который прописан в потоке GameLoopThread, то всё равно в onResume ошибка вываливается, что поток уже создан.
Можете мне с этим помочь?
...
Рейтинг: 0 / 0
SurfaceView
    #38916400
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо running нужно использовать встроенные методы: interrupt() для прерывания и для проверки isInterrupted(). Вместо прямого вызова прямого вызова onDraw() следует использовать draw(), чтоб система сама решала, когда требуется обновление.
...
Рейтинг: 0 / 0
SurfaceView
    #38916553
Спасибо, буду думать
...
Рейтинг: 0 / 0
SurfaceView
    #38918346
В общем сделал изменения. Работает без ошибок, но долго восстанавливается. Взять любую игру запустить свернуть и восстановить и восстановится раза в 4-5 быстрее.
А этот код как-то долго восстанавливает из свёрнутого состояния...
Выкладываю код.
wadman, можете с этим мне помочь?
...
Рейтинг: 0 / 0
SurfaceView
    #38918347
activity_main.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/qwe"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >

        <SurfaceView
            android:id="@+id/surfaceView1"
            android:layout_width="600dp"
            android:layout_height="600dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
    </RelativeLayout>

</LinearLayout>

...
Рейтинг: 0 / 0
SurfaceView
    #38918349
MainActivity
Код: 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.
package com.example.surfaceview;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;

public class MainActivity extends Activity {

	GameView gameview;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);
		
		SurfaceView surfaceView1 = (SurfaceView) findViewById(R.id.surfaceView1);
		gameview = new GameView(this, surfaceView1);
	}

	@Override
	 protected void onPause() {
	  super.onPause();
	 }

	 @Override
	 protected void onResume() {
	  super.onResume();
	 }

	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

...
Рейтинг: 0 / 0
SurfaceView
    #38918350
GameView
Код: 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.
package com.example.surfaceview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameView extends SurfaceView {

    private Bitmap bmp;
	public GameLoopThread gameLoopThread;
    private int x = 0;  
    private int xSpeed = 1;
    Context context;
    
    SurfaceHolder surfaceHolder;
    SurfaceView surfaceView1;
    
	public GameView(Context context, SurfaceView surfaceView1) {
		super(context);
		
		this.context = context;
		this.surfaceView1 = surfaceView1;
		init();
	}

	public GameView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		init();
	}

	public GameView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		this.context = context;
		init();
	}
	
    public void init() {
	    surfaceView1.setZOrderOnTop(true); 
	    surfaceHolder = surfaceView1.getHolder();
	    surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
	    
	    gameLoopThread = new GameLoopThread(this);
	    
		surfaceHolder.addCallback(new SurfaceHolder.Callback() {
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {
				gameLoopThread.terminateSurface();
			}

			@Override
			public void surfaceCreated(SurfaceHolder holder) {
				gameLoopThread.restartSurface(); 
			}

			@Override
			public void surfaceChanged(SurfaceHolder holder, int format,
					int width, int height) {
			}
		});
	    
	    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
	}

    @Override
	protected void onDraw(Canvas canvas) {
    	draw(canvas);
	}
    
    public void draw(Canvas canvas) {
    	if (x == canvas.getWidth() - bmp.getWidth()) {
			xSpeed = -1;
		}
		if (x == 0) {
			xSpeed = 1;
		}
		x = x + xSpeed;
		canvas.drawColor(Color.BLACK);
		canvas.drawBitmap(bmp, x, 10, null);
    }

}

...
Рейтинг: 0 / 0
SurfaceView
    #38918351
GameLoopThread
Код: 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.
package com.example.surfaceview;

import android.graphics.Canvas;

class GameLoopThread implements Runnable {
	private GameView view;
	private Canvas c;
	volatile Thread t;

	public GameLoopThread(GameView view) {
		this.view = view;
		t = new Thread(this);
		t.start();
	}

	public void terminateSurface() {
		this.t.interrupt();
	}

	public void restartSurface() {
		if (t.getState() == Thread.State.TERMINATED) {
			t = new Thread(this);
			t.start();
		}
	}

	@Override
	public void run() {
		while (!Thread.currentThread().isInterrupted()) {
			try {
				c = view.surfaceHolder.lockCanvas();
				if (c != null) {
					synchronized (view.surfaceHolder) {
						view.draw(c);
					}
				}
			} finally {
				if (c != null) {
					view.surfaceHolder.unlockCanvasAndPost(c);
				}
			}
		}
	}
}



Модератор: Просьба пользоваться спойлером.
...
Рейтинг: 0 / 0
SurfaceView
    #38918391
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно могу посмотреть, но все таки предпочитаю давать удочку, а не рыбу. :)

Есть logcat и класс , для вывода в его лог. Принято с ним работать примерно в таком стиле:
Код: 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.
package ru.wadman.surfacetest;

import android.graphics.Canvas;
import android.util.Log;

/**
 * Created by wadman on 25.03.2015.
 */
public class GameManager extends Thread {

    private static final String LOG_TAG = "GameManager";

    static final long FPS = 10;

    private GameView view;

    private boolean running = false;

    public GameManager(GameView view)
    {
        this.view = view;
        Log.d(LOG_TAG, "Create new");
    }

    public void setRunning(boolean run)
    {
        running = run;
    }

    @Override
    public void run()
    {
        Log.d(LOG_TAG, "Start run");
        long ticksPS = 1000 / FPS;
        long startTime;
        long sleepTime;
        while (running) {
            Canvas c = null;
            startTime = System.currentTimeMillis();
            try {
                c = view.getHolder().lockCanvas();
                synchronized (view.getHolder()) {
                    //view.onDraw(c);
                    view.draw(c);
                }
            } finally {
                if (c != null) {
                    view.getHolder().unlockCanvasAndPost(c);
                }
            }
            sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
            try {
                if (sleepTime > 0)
                    sleep(sleepTime);
                else
                    sleep(10);
            } catch (Exception e) {}
        }
        Log.d(LOG_TAG, "Stop run");
    }
}



Далее все это затем ловится встроенными средствами (Студия точно выводит, эклипс тоже должен) либо утилитой из сдк Android Device Monitor (запускается батником monitor.bat из папки tools).

Расставляя таким образом контрольные точки ты сможешь самостоятельно локализовать проблему и задать конкретный вопрос.
...
Рейтинг: 0 / 0
SurfaceView
    #38918396
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще стоит обращать внимание вот на такие строки в логкате, если андроид 4.1 и выше:

10-27 07:41:56.800: I/Choreographer(437): Skipped 190 frames! The application may be doing too much work on its main thread.

Это сам андроид ругается на тормоза основного потока.
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / Android [игнор отключен] [закрыт для гостей] / SurfaceView
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]