1

非常にばかげた質問のようですが、本当に助けが必要です。背景の透明なグラデーション画像を描画し、その上にいくつかのオブジェクトを描画するタスクを作成しています。問題は、この画像を一度描画したいのですが、他のオブジェクトいくつかのアニメーションを実行するために複数回描画されます

コードは次のとおりです。これは私が一度実行したいコードです。ブール変数 = false を作成し、それを true に設定しました

public void drawLockLayer(Graphics g) {
        try {
            lock = Image.createImage(Paths.lock);
            g.drawImage(lock, 0, 0, LGBMainMidlet.width, LGBMainMidlet.height);
            System.out.println("After Draw Image");
            drawOnce = true;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

他のコードは次のとおりです

public void paint(Graphics g, Rectangle rect) {

        synchronized (g) {
            if (drawOnce == false) {
                drawLockLayer(g);
            }
        }
        pos = (int) ((System.currentTimeMillis() % 2700) / 300);

        int i = 0;

        g.setColor(bgColor);
        g.fillRoundRect(startX, startY, width, height, 20, 20);


        g.setColor(fgColor);
        g.setFont(font);
        g.drawString(loadMsg, startX + (spacing / 4), startY + (spacing / 4));

        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                int thickness = 6;
                if (i == pos) {
                    thickness = 14;
                } else if (i == pos - 1) {
                    thickness = 10;
                }
                g.fillRect((startX + x * spacing - (thickness / 2)) + (width / 3), (startY + y * spacing - (thickness / 2)) + (height / 3), thickness, thickness);
                i++;
            }
        }


    }

メソッドに入りますが、背景画像を描画しません。私がやりたいのは、画像の描画が終了するまでグラフィックスオブジェクトをロックしてから、他のコードを続行することです

誰でも助けてください

4

2 に答える 2

2

コードに関するいくつかの問題:

  • グラフィックスでの同期は一般的に悪い考えです
  • paint は 1 つのスレッドからのみ呼び出されることになっています。そうではなく、実際に同期する必要がありますか?レクトはどこから来たのですか?
  • メンテナンスを容易にするために、paint() で drawOnce を true に設定する必要があります。
于 2012-06-28T14:16:10.713 に答える
-1

ペイントを呼び出す前に、drawOnce を false に設定する必要があります。

あなたのコードは GameCanvas に基づいているようです。以下のアプローチについてどう思いますか?

    class MainCanvas は GameCanvas を拡張します {

    // rect は属性です

    プライベートボイド updateScreen() {
        drawOnce = false;
        ペイント (getGraphics(), rect);
    }

    public void start() {
        新しい DataThread().start();
        new AnimationThread().start();
    }

    class DataThread extends Thread {
        public void run() {
            while (/*IO処理は行われていません*/) {
                // データを保存
                updateScreen();
            }
        }
    }

    class AnimationThread extends Thread {
        public void run() {
            while (/*IO処理は行われていません*/) {
                // 少し寝る
                updateScreen();
            }
        }
    }

    // drawLockLayer および paint(Graphics, Rectangle) メソッド

    } // MainCanvas クラスの終わり

于 2012-06-28T16:44:33.113 に答える