Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

getKeypadStateについて

初書き込みになります。
iアプリで画像のスライドショー機能作成にて
getKeypadStateを使い、無限ループの制御をしようと考えているのですが、
どうも上手くキー情報が取れないので御教授願います。


【一応キー取得可能なパターン】
private boolean StateFlg = false;    //再生状態フラグ
〜〜中略〜〜
public void paint(Graphics g)
{
    super.g = g;
    if(this.StateFlg)
    {
        int i=0;
        /** アニメーション実施 **/
        while (this.StateFlg)
        {
            AnimeList[i];
            g.lock();
            setDrawImage(AnimeList[i]);    ←ここで描画データを設定してます
            g.unlock(true);
            i++;
            /** スリープ制御 **/
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            /** ループ判定(1キー押下時にループを止める) **/
            key = MyCanvas.getInstance().getKeypadState();
            if ((1<<Display.KEY_1   &key)!=0){
                this.StateFlg = false;
            }
        }
    }
    else
    {
        /** アニメーション未実施 **/
        g.lock();
        setDrawImage(AnimeList[0]);    ←ここで描画データを初期化してます
        g.unlock(true);
    }

    /**
     * Method keyReleased.<br>
     * @see com.nttdocomo.ui.KeyListener#keyReleased(com.nttdocomo.ui.Panel, int)
     */
    public void keyReleased(Panel arg0, int key)
    {
        switch (key) {
            //決定ボタンが離された場合
            case Display.KEY_SELECT://セレクトキー
                this.StateFlg = true;
                break;
        }
        MyCanvas.getInstance().repaint(); ←ここでセレクトキー実施時にループを開始します。
    }
}

最初この様に記述しました。
この方法ではキーの取得は上手くいったのですが、paintを抜けた後にMyCanvasクラスにて描画をする構造の為
paintの内部でループさせているこの状況では、1キーを押して終了処理を行った時だけ画面が更新されるという結果になりました。
そこでループメソッドとpaintメソッドを分けるように改造しました。

【キー取得不可能なパターン】
private boolean StateFlg = false;    //再生状態フラグ
int i=0;
〜〜前略〜〜
    private void drawAnimation()
    {
        if(this.StateFlg)
        {
            /** アニメーション実施 **/
            while (this.StateFlg)
            {
                MyCanvas.getInstance().repaint();
                i++;
                /** スリープ制御 **/
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                /** ループ判定(1キー押下時にループを止める) **/
                key = MyCanvas.getInstance().getKeypadState();
                if ((1<<Display.KEY_1   &key)!=0){
                    this.StateFlg = false;
                }
            }
        }
        else
        {
            /** アニメーション停止 **/
            MyCanvas.getInstance().repaint();
        }
    }
    public void paint(Graphics g)
    {
        super.g = g;
        g.lock();
        setDrawImage(AnimeList[i]);    ←ここで描画データを設定してます
        g.unlock(true);
    }
    /**
     * Method keyReleased.<br>
     * @see com.nttdocomo.ui.KeyListener#keyReleased(com.nttdocomo.ui.Panel, int)
     */
    public void keyReleased(Panel arg0, int key)
    {
        switch (key) {
            //決定ボタンが離された場合
            case Display.KEY_SELECT://セレクトキー
                this.StateFlg = true;
                break;
        }
        drawAnimation(); ←ここでセレクトキー実施時にループを開始します。
    }
}

上記のように改造した後に動作チェックをしました。
セレクトキー押下後に正常にスライドショー(画像の連続描写)が始まるようにはなったのですが、
今度はdrawAnimation()実行後、キーを受け付けなくなりました。(getKeypadState()にて返り値が0固定になります)

ループ制御の部分以外は正常に動作しております。
getKeypadState()の使い方に誤りがあると思うのですが、何が悪いのか、お分かりになる方はいらっしゃいますでしょうか?
修正前はキーの状態取得は正常にできていました。
何故構造的に同じルーチン(描画部分を外に出しただけ)でキーの取得ができなくなってしまったのでしょうか?
またループのルーチンについて、こうした方がすっきりするよというような意見がありましたら御教授願います。

0

回答

89390

閲覧

0件の回答

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。