3

アプリケーションを開始したときは、すべて問題ありません。しかし、次のアクティビティに移動してSurfaceViewに戻ると、次のようになりblackます。デバッグすると、実行中のキャンバスに描画する必要のある線が表示されますが、何も表示されません。
これが私のコードです:

public class DrawView extends SurfaceView implements Runnable
{

    Thread thread = null;
    SurfaceHolder holder;
    Bitmap background;
    Canvas canvas;
    Matrix matrixUP = new Matrix();
    Matrix matrixDOWN = new Matrix();
    boolean ok = false;

    public DrawView(Context context) 
    {
        super(context);
        holder = getHolder();
    }

    public void run() 
    {
        while(ok)
        {
            if(!holder.getSurface().isValid())
            {
                continue;
            }
            watch_hand = Bitmap.createScaledBitmap(watch_hand, width/4, height/6, false);
            watch_hand_down = Bitmap.createScaledBitmap(watch_hand_down, width/4, height/6, false);
            background = BitmapFactory.decodeResource(getResources(), R.drawable.needles);
            background = Bitmap.createScaledBitmap(background, width, height/2+20, false);
            canvas = holder.lockCanvas();
            matrixUP.setTranslate(CENTER_X - watch_hand.getWidth()/2, height/4 - watch_hand.getHeight() - 40);
            matrixUP.preRotate((float) degreUP , watch_hand.getWidth()/2 , watch_hand.getHeight()-10);

            matrixDOWN.setTranslate(CENTER_X - watch_hand_down.getWidth()/2, height/2 - watch_hand_down.getHeight() - 20);
            matrixDOWN.preRotate((float) degreDOWN , watch_hand_down.getWidth()/2 , 10);

            canvas.drawARGB(255, 255, 255, 255);
            canvas.drawBitmap(background, 0, 0, null);
            canvas.drawBitmap(watch_hand, matrixUP, null);
            canvas.drawBitmap(watch_hand_down, matrixDOWN, null);
            holder.unlockCanvasAndPost(canvas);
        }           
    }

    public void pause()
    {
        ok = false;
        while(true)
        {
            try
            {
                thread.join();
            }catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            break;
        }
        thread = null;
    }

    public void resume()
    {
        ok = true;
        thread = new Thread(this);
        thread.start();
    }           
}

ご覧のとおり、私は再開および一時停止機能を使用しています。それらはonCreateから呼び出されます。なぜそれが起こっているのですか、どうすればこれを修正できますか?

ありがとう!

4

2 に答える 2

1

答えは、他のアクティビティにどのように変更するかによって異なります。

基本的に、アクティビティが一時停止、停止、または破棄されたときに、サーフェスの現在の状態を保存する方法を考える必要があります。

たとえば、アクティビティで onSaveInstanceState をオーバーロードして、degreUP と degreDOWN を保存できます (現在のコード スニペットでは定義されていません)。onRestoreInstanceState でそれらを復元します。インスタンス状態の保存を使用した Android アクティビティ状態の保存を参照してください。

于 2012-04-23T09:29:59.603 に答える
0

サーフェス ビューが存在するアクティビティの onResume() および onPause() メソッドから、サーフェス ビュー (この場合は DrawView) の resume() および pause() メソッドを呼び出します。あなたは onCreate() から呼び出していると言いました。

これで問題は解決するはずです。

于 2012-04-23T12:23:22.000 に答える