質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.05%

  • Java

    11778questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    5722questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3092questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

アニメーション 一時停止 再開

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 144

S.I

score 28

アプリ作成中です。
画面左側はアニメーションが動く。
画面右側は操作・問題画面。計6つ(上・下・左・右・スタート・やり直し)のボタンで操作する。

<実現したいこと>
(X == -2 && Y ==1)の位置へ到達したらアニメーションを一時停止する。その際、表示されたダイアログの「OK」ボタンを押したら一時停止した位置からアニメーションを再開する

<試してみたこと>
①(X == -2 && Y ==1)の位置へ到達したら

if(x == -2 && y == 1){
                ReplayFlag = false;
            }

と記述し、アニメーションを一時停止させた

②表示されたダイアログの「OK」ボタンを押したら

dl.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ReplayFlag = true;
                    animationReplay();

と記述し、アニメーションを再開させようとしたが、一時停止した位置からではなく初期位置からのアニメーションになってしまった

public class MainActivity extends AppCompatActivity implements Animator.AnimatorListener{
    final static float TRANSLATE_X = 240.0f;    // 1回の操作でX軸方向にいくつ動かすか
    final static float TRANSLATE_Y = 245.0f;    // 1回の操作でY軸方向にいくつ動かすか

    // 盤面上の開始座標を初期値として設定する
    private int x = 0;
    private int y = 0;
    private String text;
    private ArrayList<Integer> History;   // 履歴を格納するリスト
    private boolean ReplayFlag;         // 再生中であることを示すフラグ
    private int ReplayCount;            // 再生経過のカウンター


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn1 = (Button) findViewById(R.id.button1);  // うえ
        Button btn2 = (Button) findViewById(R.id.button2);  // した
        Button btn3 = (Button) findViewById(R.id.button3);  // ひだり
        Button btn4 = (Button) findViewById(R.id.button4);  // みぎ
        Button btn5 = (Button) findViewById(R.id.button5);  // やりなおし
        Button btn6 = (Button) findViewById(R.id.button6);  // スタート

        text = "";
        final TextView result = (TextView) findViewById(R.id.result);
        result.setText("");

        // 初期値をセット
        History = new ArrayList<>();
        ReplayFlag = false;
        ReplayCount = 0;


        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 「うえ」を押したときの処理
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#98fb98>↑</font>";
                result.setText(Html.fromHtml(text));
                History.add(0); // 0は上を意味する
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 「した」を押したときの処理
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#fffacd>↓</font>";
                result.setText(Html.fromHtml(text));
                History.add(1); // 1は下を意味する
            }
        });
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 「ひだり」を押したときの処理
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#ffc0cb>←</font>";
                result.setText(Html.fromHtml(text));
                History.add(2); // 2は左を意味する
            }
        });
        btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 「みぎ」を押したときの処理
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#afeeee>→</font>";
                result.setText(Html.fromHtml(text));
                History.add(3); // 3は右を意味する
            }
        });
        btn5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                x = 0;
                y = 0;
                animationImageReset();
                History.clear();

                text = "";
                TextView result = (TextView) findViewById(R.id.result);
                result.setText("");

                imageReset();
            }
        });
        btn6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // isEmpty()でリストが空っぽではない(1手以上の記録がある)か調べる
                if (!History.isEmpty()) {
                    // 猫を最初の位置に戻す
                    x = 0;
                    y = 0;
                    animationImageReset();

                    ReplayFlag = true;  // 再生中にする
                    animationReplay();     // 再生する(ここでは1手目だけ、以後はonAnimationEndに任せる)

            }
        });
    }

    private void imageReset(){
        ImageView imageView = (ImageView) findViewById(R.id.imageView);
        imageView.setVisibility(View.INVISIBLE);
    }

    private void animationImageView(String property, float start, float end) {
        ImageView imageView = (ImageView) findViewById(R.id.MyCat);
        ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, property, start, end);
        animator.setDuration(1000);
        animator.addListener(this);
        animator.start();
    }

    private void animationImageReset() {
        final ImageView MyCat = (ImageView) findViewById(R.id.MyCat);
        ObjectAnimator.ofFloat(MyCat, "translationX", 0.0f, 0.0f).start();
        ObjectAnimator.ofFloat(MyCat, "translationY", 0.0f, 0.0f).start();
    }

    private void Reset(){
        x = 0;
        y = 0;
        animationImageReset();
        History.clear();

        text = "";
        TextView result = (TextView) findViewById(R.id.result);
        result.setText("");

        imageReset();
    }

    private void encountDog() {
        if (x == -2 && y == 1) {
            AlertDialog.Builder dl = new AlertDialog.Builder(MainActivity.this);
            dl.setTitle("エサを手に入れた!!");
            dl.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ReplayFlag = true;
                    animationReplay();
                    ImageView imageView = (ImageView) findViewById(R.id.imageView);
                    imageView.setVisibility(View.VISIBLE);
                }
            });
            dl.show();
        }
    }
    private void animationReplay() {
        if (ReplayFlag) {
            int dir = History.get(ReplayCount); // リストから取り出し

            switch (dir) {
                case 0:  // 0は上を意味する
                    upAnimation();
                    break;
                case 1:  // 1は下を意味する
                    downAnimation();
                    break;
                case 2:  // 2は左を意味する
                    leftAnimation();
                    break;
                case 3:  // 3は右を意味する
                    rightAnimation();
                    break;
            }

            ReplayCount++;  // カウンターを増やす

            // 再生終了したらフラグをクリアする
            if (ReplayCount == History.size()) {
                ReplayFlag = false;
                ReplayCount = 0;
            }
            if(x == -2 && y == 1){
                ReplayFlag = false;
            }
        }
    }
    @Override
    public void onAnimationStart(Animator animation) {
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        // アニメーションが終了するとここが実行される
        if (ReplayFlag) {
            animationReplay();    // 再生する
        }
    }

    @Override
    public void onAnimationCancel(Animator animation) {
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
    }

    private void upAnimation(){
        // 「うえ」を押したときの処理
        if (y > 0) {
            float start = TRANSLATE_Y * y;
            float end = start - TRANSLATE_Y;
            animationImageView("translationY", start, end);
            y--;
            encountDog();
        }
    }
    private void downAnimation(){
        // 「した」を押したときの処理
        if (y < 3) {
            float start = TRANSLATE_Y * y;
            float end = start + TRANSLATE_Y;
            animationImageView("translationY", start, end);
            y++;
            encountDog();
        }
    }
    private void leftAnimation(){
        // 「ひだり」を押したときの処理
        if (x > -3) {
            float start = TRANSLATE_X * x;
            float end = start - TRANSLATE_X;
            animationImageView("translationX", start, end);
            x--;
            encountDog();
        }
    }
    private void rightAnimation(){
        // 「みぎ」を押したときの処理
        if (x < 0) {
            float start = TRANSLATE_X * x;
            float end = start + TRANSLATE_X;
            animationImageView("translationX", start, end);
            x++;
            encountDog();
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • keicha_hrs

    2017/12/18 23:16 編集

    このプログラム、いろいろおかしくなっていませんか?これでは質問内容以前に不具合だらけです。Android Studioを再インストールしたという質問がありましたが、以前のソースも紛失してしまった?

    キャンセル

  • S.I

    2017/12/19 01:21

    すみません自己解決できました。ご迷惑おかけしました!

    キャンセル

回答 1

check解決した方法

+1

プログラム訂正により自己解決しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    11778questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    5722questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3092questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。