1

次の構造の簡単なゲームを書きます。メインの xml レイアウトにはユーザー ビューがあります。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menuRL"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.sokolovlev.UFOtest03.MenuView
            android:id="@+id/menuView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

</RelativeLayout>

このビューには 2 つのファイルがあります。最初はユーザー MenuView です。

package com.sokolovlev.UFOtest03;

import android.content.Context;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MenuView extends SurfaceView implements SurfaceHolder.Callback
{
    private SurfaceHolder mSurfaceHolder; //Draw surface

    public static MenuManager mMenuManager; //Draw manager

    public MenuView(Context context, AttributeSet attrs)
    {
        super(context, attrs);

        // Surface events registration
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);

        mMenuManager = new MenuManager(mSurfaceHolder, context);
    }

    @Override

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    {
        mMenuManager.initPositions(height, width);
    }

    @SuppressWarnings("static-access")
    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
    mMenuManager.setRunning(true);
        try 
        {
            mMenuManager.start();
        } 
        catch (Exception e) { }
    }

    @SuppressWarnings("static-access")
    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        boolean retry = true;
        mMenuManager.setRunning(false);
        while (retry) 
        {
            try 
            {
                mMenuManager.join(); 
        retry = false;
            } 
            catch (InterruptedException e) { }
        }
    }
}

2 番目のファイルは、この描画マネージャーです。

package com.sokolovlev.UFOtest03;

import ...

public class MenuManager extends Thread
{
    private SurfaceHolder mSurfaceHolder;
    private static boolean mRunning;

    private int _screenHeight;
    private int _screenWidth;

    private ...

    Context c;

    private ...

    public MenuManager(SurfaceHolder surfaceHolder, Context context)
    {
        mSurfaceHolder = surfaceHolder;
        mRunning = false;
        c = context;

        ...
    }

    public static void setRunning(boolean running)
    {
        mRunning = running;
    }
    @Override
    public void run()
    {

        while (mRunning)
        {
            Canvas canvas = null;
            try
            {
                // подготовка Canvas-а
                canvas = mSurfaceHolder.lockCanvas(); 
                canvas.drawRGB(0, 0, 0);

                synchronized (mSurfaceHolder)
                {
                    //All drawing
                }
            }
            catch (Exception e) { }
            finally
            {
                if (canvas != null)
                {
                    mSurfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}

すべてがうまくいきます!(ステップ№1)しかし、中央のボタンを押すか、着信があるか、タスクマネージャーを呼び出し(ステップ№2)、アプリに戻ると、描画がなく、黒い画面しかありません(ステップ№3) . しかし、次のステップ 2 に進み、アプリで実行すると、すべてが機能することがわかります。 ここに画像の説明を入力

私の図面にそのような影響を与えるリロードがある場所がわかりません! 助けてください!

4

1 に答える 1

0

この問題を解決するには、設定を保存してサーフェスを再起動する必要があります。次に、設定を読み込みます。(LunarLander の例を参照)

于 2012-07-28T08:06:15.580 に答える