powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / SurfaceView
20 сообщений из 45, страница 2 из 2
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
20 сообщений из 45, страница 2 из 2
Форумы / Android [игнор отключен] [закрыт для гостей] / SurfaceView
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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