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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

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

Android Studio

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

Q&A

解決済

2回答

1221閲覧

条件分岐で横移動するアニメーションをつけたい

y-mo

総合スコア1

Java

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

Android Studio

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

0グッド

0クリップ

投稿2021/08/17 04:38

編集2021/08/17 05:28
コード ```### 前提・実現したいこと androidstudioでゲームを作成しています。 選択肢が正解していたら横移動し、不正解だと別画面に移動するというようなプログラムを書きたいと考えています。 また、アニメーションの動きとして、xに400→前回の座標を取得+400で横移動をしようとしているのですが、他にも方法があれば教えていただきたいです。 ### 発生している問題・エラーメッセージ エラーは特に出ていないのですが、エミュレータで動かそうとするとアプリが落ちてしまいます。 ### 該当のソースコード ```Java package test.com.game; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Spinner; import android.widget.Button; import android.widget.ImageView; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.animation.PropertyValuesHolder; import android.animation.Animator; import android.animation.ObjectAnimator; public abstract class PleyActivity extends AppCompatActivity implements Animator.AnimatorListener{ TypedArray typedArray; Drawable drawable; ImageView blankImage; int i = 0; public void anime() { typedArray = getResources().obtainTypedArray(R.array.anime); blankImage = findViewById(R.id.blankImage); drawable = typedArray.getDrawable(i); blankImage.setImageDrawable(drawable); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pley); Button button = findViewById(R.id.button); i = 0; anime(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { setAnimetion(); // レイアウトからSpinnerを取得 Spinner item; item = findViewById(R.id.spinner); // 選択したアイテムを取得 String selected1 = (String) item.getSelectedItem(); String str1 = "選択肢1"; String str2 = "選択肢2"; String str3 = "選択肢3"; if (str1.equals(selected1)) { setAnimetion(); } else { Intent intent = new Intent(PleyActivity.this, OverActivity.class); startActivity(intent); System.exit(0); } item = findViewById(R.id.spinner2); String selected2 = (String) item.getSelectedItem(); if (str2.equals(selected2)) { setAnimetion(); } else { Intent intent = new Intent(PleyActivity.this, OverActivity.class); startActivity(intent); System.exit(0); } item = findViewById(R.id.spinner3); String selected3 = (String) item.getSelectedItem(); if (str3.equals(selected3)) { setAnimetion(); /*Intent intent = new Intent(PleyActivity.this, GoolActivity.class); startActivity(intent);*/ } else { Intent intent = new Intent(PleyActivity.this, OverActivity.class); startActivity(intent); } } }); } private void setAnimetion () { ImageView po = findViewById(R.id.blankImage); int[] location = new int[2]; po.getLocationInWindow(location); po.getWidth();//Viewの幅取得 int yoko = location[0]; // X座標 // PropertyValuesHolderを使ってX軸方向移動範囲のpropertyを保持 PropertyValuesHolder vhX = PropertyValuesHolder.ofFloat( "translationX", yoko + 400.0f); // ObjectAnimatorにセットする ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder( blankImage, vhX); // 再生時間を設定 3000msec=3sec objectAnimator.setDuration(3000); objectAnimator.addListener(this); // アニメーションを開始する objectAnimator.start(); } @Override public void onAnimationStart(Animator animation) { Log.d("debug","onAnimationStart()"); } @Override public void onAnimationEnd(Animator animation) { Log.d("debug","onAnimationEnd()"); } @Override public void onAnimationCancel(Animator animation) { Log.d("debug","onAnimationCancel()"); } @Override public void onAnimationRepeat(Animator animation) { Log.d("debug","onAnimationRepeat()"); } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

言語 Java Android Studio 4.1.1

初心者なうえ独学で勉強し始めたばかりのため、かなりあべこべな内容になっていると思います。
その他必要な情報等あれば教えていただけると幸いです。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y-mo

2021/08/17 04:42

アニメーションの動きを見るため一部コメントアウトしている場所があります
K_3578

2021/08/17 04:43

とりあえずソースコードはMarkDownのcode機能で提示しましょう。 このままだとインデントが消えていて読みづらくなります。 MarkDownについてはこの質問を参考に質問を編集してみてください。 https://teratail.com/questions/238564
y-mo

2021/08/17 04:52

アドバイスありがとうございます!編集し直しました。
m.ts10806

2021/08/17 05:21 編集

タイトルの示す範囲が広すぎるので調整されたほうが良いかと。質問タグの単語並べてるだけなので内容がありません。
y-mo

2021/08/17 05:28

アドバイスありがとうございます! 確かにアバウトでしたね、修正させていただきました。
jimbe

2021/08/17 11:16

レイアウトの pley.xml はどのような感じなのでしょう。
guest

回答2

0

ベストアンサー

本当は"質問への追記・修正の依頼" で状態を確認してからの方が良いかもですが、
ダメもとで可能性を提示させてください。

エラーは特に出ていないのですが、エミュレータで動かそうとするとアプリが落ちてしまいます。

上記の原因ですが、ぱっと見2つほど気になりました。

  1. abstract class でActivity が宣言されている
  2. AndroidManifest.xml にPleyActivity の記載が抜けている

もし1が原因なら、abstract の記述を消して、様子を見たいです。

もし2が原因なら、AndroidManifest.xml に下記のような追記をして様子を見たいです。

xml

1<activity 2 android:name=".PleyActivity" 3 android:exported="false" />

ちゃんとした回答でなくてすいませんでした。

android:name の指定はPleyActivity のフォルダー階層によって調整がいるかもです。
android:exported の指定は、アプリ内でのみ使うと仮定していれてみました。
詳細はAndroidアプリのセキュア設計・セキュアコーディングガイド をご覧ください。

投稿2021/08/17 12:21

tshion

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/08/17 13:30

Activity が abstract だと java.lang.InstantiationException が発生しました。 コードを見ていたのですが abstract は見逃していました。 「Pley て Play の間違いかな」とは思ったのですが ^^;
tshion

2021/08/17 14:39

"abstract" って罠ですよね ビルドは通るけど、あれなんかおかしいってなるのでw "Pley" は自分もスペルミスだと思いましたが、 余計な混乱を生みそうだったので、ひとまずこのままとしましたw
y-mo

2021/08/18 05:42

abstractを修正することによって解決することができました!tshionさんありがとうございました!(pleyは普通に間違えました……。)
guest

0

tshion さんの回答で決まりな感じですので、調査で弄ったコードをご提示させて頂きます。

java

1package test.com.game; 2 3import androidx.appcompat.app.AppCompatActivity; 4import android.content.Intent; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.*; 8import android.widget.*; 9import android.content.res.TypedArray; 10import android.graphics.drawable.Drawable; 11import android.animation.PropertyValuesHolder; 12import android.animation.Animator; 13import android.animation.ObjectAnimator; 14 15public class PleyActivity extends AppCompatActivity implements Animator.AnimatorListener { 16 private static final String TAG = "PleyActivity"; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.pley); 22 23 ImageView blankImage = findViewById(R.id.blankImage); 24 blankImage.setImageDrawable(getAnimeDrawable(0)); 25 26 // レイアウトからSpinnerを取得 27 Spinner spinner1 = findViewById(R.id.spinner); 28 Spinner spinner2 = findViewById(R.id.spinner2); 29 Spinner spinner3 = findViewById(R.id.spinner3); 30 31 Button button = findViewById(R.id.button); 32 button.setOnClickListener(new View.OnClickListener() { 33 @Override 34 public void onClick(View view) { 35 36 // 選択したアイテムを取得 37 String answer1 = (String) spinner1.getSelectedItem(); 38 String answer2 = (String) spinner2.getSelectedItem(); 39 String answer3 = (String) spinner3.getSelectedItem(); 40 41 String correct1 = "選択肢1"; 42 String correct2 = "選択肢2"; 43 String correct3 = "選択肢3"; 44 45 if (correct1.equals(answer1) && correct2.equals(answer2) && correct3.equals(answer3)) { 46 startAnimation(blankImage); 47 48 } else { 49 Intent intent = new Intent(PleyActivity.this, OverActivity.class); 50 startActivity(intent); 51 } 52 } 53 }); 54 } 55 56 private Drawable getAnimeDrawable(int index) { 57 TypedArray typedArray = getResources().obtainTypedArray(R.array.anime); 58 return typedArray.getDrawable(index); 59 } 60 61 private void startAnimation(View v) { 62 int[] location = new int[2]; 63 v.getLocationInWindow(location); 64 int x = location[0]; // X座標 65 66 // PropertyValuesHolderを使ってX軸方向移動範囲のpropertyを保持 67 PropertyValuesHolder vhX = PropertyValuesHolder.ofFloat( 68 "translationX", 69 x + 400.0f); 70 71 // ObjectAnimatorにセットする 72 ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder( 73 v, 74 vhX); 75 76 // 再生時間を設定 3000msec=3sec 77 objectAnimator.setDuration(3000); 78 79 objectAnimator.addListener(this); 80 81 // アニメーションを開始する 82 objectAnimator.start(); 83 } 84 85 @Override 86 public void onAnimationStart(Animator animation) { 87 Log.d(TAG,"onAnimationStart()"); 88 } 89 90 @Override 91 public void onAnimationEnd(Animator animation) { 92 Log.d(TAG,"onAnimationEnd()"); 93 } 94 95 @Override 96 public void onAnimationCancel(Animator animation) { 97 Log.d(TAG,"onAnimationCancel()"); 98 } 99 100 @Override 101 public void onAnimationRepeat(Animator animation) { 102 Log.d(TAG,"onAnimationRepeat()"); 103 } 104}

投稿2021/08/17 16:40

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y-mo

2021/08/18 05:44

jimbeさんありがとうございます! コードまで提示していただけて、すごく参考になりました…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問