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

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

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

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

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

Android Studio

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

Q&A

0回答

1165閲覧

アニメーション(animator)が終了したらダイアログを表示させたい。

aruko

総合スコア47

Java

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

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

Android Studio

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

0グッド

0クリップ

投稿2021/12/15 13:43

androidstudioでゲーム作りをしています。
animatorで連続アニメーションさせ、その連続アニメーションが終わったら、ダイアログを表示させたいと思い、MainActivity.javaに、

animatorset_ouhuku.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) { }
@Override
public void onAnimationEnd(Animator animation) {
list_kaki_select.remove(0);
if(list_kaki_select.size()!=0){
kaki_getXY();
kaki_saru_keisan_animation();
}else{
DialogFragment dialog=new MyDialogFragment();
dialog.show(getSupportFragmentManager(),"dialog_button");

}
}
@Override
public void onAnimationCancel(Animator animation) { }
@Override
public void onAnimationRepeat(Animator animation) { }
});
}
}
というコードを書きましたが、ダイアログが表示されたらすぐ画面自体が消えてしまいます。

なので、 protected void onCreate(Bundle savedInstanceState) に直接
**DialogFragment dialog=new MyDialogFragment();
dialog.show(getSupportFragmentManager(),"dialog_button");**を書くと、ちゃんとダイアログが表示されます。

アニメーションが終了したらダイアログが表示されるようにするには、どうしたらいいでしょうか。
よろしくお願いします。

MainActivity.javaです。

java

1import androidx.appcompat.app.AppCompatActivity; 2import androidx.constraintlayout.widget.ConstraintLayout; 3import androidx.fragment.app.DialogFragment; 4import androidx.lifecycle.ViewModelProvider; 5 6import android.animation.Animator; 7import android.animation.AnimatorInflater; 8import android.animation.AnimatorSet; 9import android.animation.ObjectAnimator; 10import android.content.Intent; 11import android.media.Image; 12import android.os.Bundle; 13import android.os.Handler; 14import android.os.Looper; 15import android.util.DisplayMetrics; 16import android.view.View; 17import android.view.animation.Animation; 18import android.view.animation.AnimationUtils; 19import android.widget.ImageView; 20import android.widget.TextView; 21 22import java.util.ArrayList; 23import java.util.List; 24import java.util.Random; 25 26public class MainActivity extends AppCompatActivity implements Runnable { 27 ImageView saru1,saru2; 28 int count; 29 Thread thread; 30 static Animation anim1; 31 static int w,h;//画面サイズ取得 32 ImageView kaki[]=new ImageView[24];//柿全部24こ 33 int kakiImageId[]=new int[]{R.id.kaki0,R.id.kaki1, R.id.kaki2,R.id.kaki3, R.id.kaki4,R.id.kaki5, R.id.kaki6,R.id.kaki7, R.id.kaki8,R.id.kaki9, R.id.kaki10,R.id.kaki11, R.id.kaki12,R.id.kaki13, R.id.kaki14,R.id.kaki15, R.id.kaki16,R.id.kaki17, R.id.kaki18,R.id.kaki19, R.id.kaki20,R.id.kaki21, R.id.kaki22,R.id.kaki23};;//柿24このImageId 34 List<Integer> list_kaki24 = new ArrayList<>(); 35 List<Integer> list_kaki_select = new ArrayList<>(); 36 int kazu;//サルがとる柿の数 37 int px;//サル画像の左側のマージン 38 int kaki_num;//とる柿ナンバー(配列) 39 float x;//とる柿のX座標 40 float y;//とる柿のy座標 41 42 TextView ma_tv[]=new TextView[8];//TextView8こ 43 int ma_tvId[]=new int[]{R.id.ma_tv0,R.id.ma_tv1,R.id.ma_tv2,R.id.ma_tv3,R.id.ma_tv4,R.id.ma_tv5,R.id.ma_tv6,R.id.ma_tv7}; 44 String ma_tvText[]=new String[]{"わしといっしょに、","いやいや、きみがわしになって、","ぼうけんをしてくれるかのう?","むかし、","けがをしたさるをたすけたが、","そのご、どうなったのか、","きになっとる。",""}; 45 46 @Override 47 protected void onCreate(Bundle savedInstanceState) { 48 super.onCreate(savedInstanceState); 49 setContentView(R.layout.activity_main); 50 51 anim1 = AnimationUtils.loadAnimation(this, R.anim.anim1); 52 thread = new Thread(this); 53 count = 0; 54 saru1 = findViewById(R.id.saru1); 55 saru2 = findViewById(R.id.saru2); 56 for(int i=0;i<8;i++){ 57 ma_tv[i]=(TextView)this.findViewById(ma_tvId[i]); 58 ma_tv[i].setVisibility(View.INVISIBLE); 59 ma_tv[i].setText(ma_tvText[i]); 60 } 61 for(int i=0;i<24;i++){ 62 kaki[i]=(ImageView)this.findViewById(kakiImageId[i]); 63 list_kaki24.add(i); 64 } 65 kimeru_kaki();//どの柿をいくつとるか決めておく 66 px = convertDPtoPX(100);//サル画像の左側のマージンが100dpをpxに変換 67 } 68 public void onWindowFocusChanged(boolean hasFocus) { 69 super.onWindowFocusChanged(hasFocus); 70 View view = findViewById(R.id.ma_app_screen); 71 h = view.getHeight(); 72 w = view.getWidth(); 73 if (list_kaki_select.size() != 0) { 74 kaki_getXY(); 75 kaki_saru_keisan_animation(); 76 } 77 thread.start(); 78 } 79 public int convertPXtoDP(int px) { 80 DisplayMetrics metrics = this.getResources().getDisplayMetrics(); 81 int dp = (int)(px / metrics.density); 82 return dp; 83 } 84 public int convertDPtoPX(int dp) { 85 DisplayMetrics metrics = this.getResources().getDisplayMetrics(); 86 int px = (int)(dp*metrics.density); 87 return px; 88 } 89 public void start(){ 90 if(thread==null){ 91 thread=new Thread(this); 92 thread.start(); 93 } 94 } 95 public void stop(){ 96 if(thread!=null){thread=null;} 97 } 98 public void run() { 99 Thread thisThread=Thread.currentThread(); 100 final Handler mainHandler = new Handler(Looper.getMainLooper()); 101 while (thread!=null){ 102 count++; 103 mainHandler.post(() -> { 104 ma_tv[7].setVisibility(View.VISIBLE); 105 ma_tv[7].setText("list_kaki_select="+list_kaki_select+" : count=" + String.valueOf(count)); 106 if(count>=6&&count%3==0&&count<27){ 107 ma_tv[(count/3)-2].setVisibility(View.VISIBLE); 108 ma_tv[(count/3)-2].startAnimation(anim1); 109 } 110 }); 111 try { 112 thread.sleep(1000); 113 } catch (InterruptedException e) { 114 } 115 } 116 } 117 private void kimeru_kaki(){ 118 Random rand = new Random(); 119 kazu = rand.nextInt(4) + 4;//5~8の数が持ち去る柿の数 120 Random rand2 = new Random(); 121 for (int i = 0; i < kazu; i++) {//全柿の数24の中からどの柿を持ち去るか決める 122 int num = rand2.nextInt(list_kaki24.size()); 123 list_kaki_select.add(list_kaki24.get(num)); 124 list_kaki24.remove(num); 125 } 126 } 127 private void kaki_getXY(){ 128 kaki_num=list_kaki_select.get(0);//最初の要素を取り出す 129 x = kaki[kaki_num].getX(); 130 y = kaki[kaki_num].getY(); 131 } 132 private void kaki_saru_keisan_animation() { 133 Random rand=new Random(); 134 int r=rand.nextInt(3000)+2000; 135 float from_x=0; 136 float to_x=0; 137 float from_xx=0; 138 float to_xx=0; 139 int jikan=0; 140 saru1.setY(y - 48);//48は位置調整 141 saru2.setY(y - 48); 142 if(kaki_num<12){ //上の段の柿 143 jikan = (int) (r *(w-x) / (w + px-20));//移動時間の計算//pxはサル画像のマージン分 144 from_x=w+px; 145 to_x=x+px-15; 146 from_xx=x + px - 15; 147 to_xx=w+px; 148 }else{ //下の段の柿 149 jikan = (int)( r * x / (w + px-20));//移動時間の計算 150 from_x=-px; 151 to_x=x + px - 15; 152 from_xx=x + px - 15; 153 to_xx=-px; 154 } 155 ObjectAnimator animator_yoko_idou = ObjectAnimator.ofFloat(saru1, "translationX", from_x,to_x).setDuration(jikan);//15は位置調整 156 ObjectAnimator animator_idou_modoru1 = ObjectAnimator.ofFloat(saru1, "translationX", from_xx, to_xx).setDuration(jikan); 157 ObjectAnimator animator_idou_modoru2 = ObjectAnimator.ofFloat(saru2, "translationX", from_xx, to_xx).setDuration(jikan); 158 ObjectAnimator animator_toumei = ObjectAnimator.ofFloat(kaki[kaki_num], "alpha", 0f, 0f).setDuration(jikan); 159 Random rand2 = new Random(); 160 int start_ofset = rand2.nextInt(4000);//スタートオフセットの時間 161 animator_toumei.setStartDelay(start_ofset + jikan); 162 AnimatorSet animatorset_idou_modoru12 = new AnimatorSet(); 163 animatorset_idou_modoru12.playTogether(animator_idou_modoru1, animator_idou_modoru2); 164 AnimatorSet animatorset_ouhuku = new AnimatorSet(); 165 animatorset_ouhuku.playSequentially(animator_yoko_idou, animatorset_idou_modoru12); 166 animatorset_ouhuku.setStartDelay(start_ofset); 167 animator_toumei.start(); 168 animatorset_ouhuku.start(); 169 animatorset_ouhuku.addListener(new Animator.AnimatorListener() { 170 @Override 171 public void onAnimationStart(Animator animation) { 172 173 } 174 @Override 175 public void onAnimationEnd(Animator animation) { 176 list_kaki_select.remove(0); 177 178 if(list_kaki_select.size()!=0){ 179 kaki_getXY(); 180 kaki_saru_keisan_animation(); 181 }else{ 182 DialogFragment dialog=new MyDialogFragment(); 183 dialog.show(getSupportFragmentManager(),"dialog_button"); 184 } 185 } 186 @Override 187 public void onAnimationCancel(Animator animation) { } 188 @Override 189 public void onAnimationRepeat(Animator animation) { } 190 }); 191 } 192}

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

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

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

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

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

jimbe

2021/12/15 16:54

> ダイアログが表示されたらすぐ画面自体が消えてしまいます その時 logcat には何も出ていないのでしょうか。 何も出ていませんでしたらそのように、出ていましたらそれをご提示ください。
aruko

2021/12/15 23:14

java.lang.IllegalThreadStateException と出ています。 もしかしたら、ダイアログが表示されたことによってスレッドが強制的にストップされるということでしょうか。
jimbe

2021/12/16 03:20

観測された現象・メッセージの内容から推測・調査・検証して修正するのがデバッグです。ただし、一部の情報から「思いこむ」とハマる可能性があります。 IllegalThreadStateException 「だけ」では、スレッドが変になった…程度しか分かりません。どのスレッドが、どのタイミングで、どの状態で変になったのかが分からなければなりません。(ご提示のコードに出てくる thread の他、アプリ自体もスレッドで動作していますし、アニメーションもスレッドかもしれません。) IllegalThreadStateException のメッセージには後続に何と出ているでしょうか。まずはそれらを **ご質問に追記** して頂く必要があります。
aruko

2021/12/16 06:51

エラーメッセージは次のようです。 java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:868) at tmaruko.okura.jiisan2.MainActivity.onWindowFocusChanged(MainActivity.java:102) at androidx.appcompat.view.WindowCallbackWrapper.onWindowFocusChanged(WindowCallbackWrapper.java:124) at com.android.internal.policy.DecorView.onWindowFocusChanged(DecorView.java:1694) at android.view.View.dispatchWindowFocusChanged(View.java:14227) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1492) at android.view.ViewRootImpl.handleWindowFocusChanged(ViewRootImpl.java:2938) at android.view.ViewRootImpl.access$1100(ViewRootImpl.java:146) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4698) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7418) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935) よろしくお願いします。
aruko

2021/12/16 10:43

jimbeさん、いつも協力いただいてすみません。 thread.start()を public void onWindowFocusChanged(boolean hasFocus)から、 protected void onCreate(Bundle savedInstanceState)に変えたらできました。 すみませんでした。
jimbe

2021/12/16 11:29

いえ、メッセージから該当箇所を絞れたようですので、それで良いのではないでしょうか。 つまり原因は、ダイアログを表示した為にフォーカスが変わり、フォーカスが変わると呼ばれる onWindowFocusChanged が実行されて、既に実行中の thread をまた start() したため・・・ということでしょう。 ところで、スレッドの実行は onCreate で開始して大丈夫なのでしょうか。 onWindowFocusChanged で開始していれば確実に w や h は設定された状態でスレッドが開始しますが、onCreate で開始すると、 onWindowFocusChanged が実行される前にどこまでスレッドが実行されるかは保障されません。もし onWindowFocusChanged が実行される前にスレッド内の何かで w や h 等が使われれば、以前問題になったようにゼロとして動作することになります。 マルチスレッドのプログラムは常にこのように「いつ・何が実行されるか分からない」前提をどこまで管理出来ているかが難しいです。 修正方法の一つとしまして、 onWindowFocusChanged でスレッドを開始するという方針はそのままに、「二回以上 start しないようにする」という方法もあります。 onCreate() 内の > thread = new Thread(this); を削除し、 onWindowFocusChanged 内の > thread.start(); の代わりに start(); とするというものです。 この start() メソッドは > public void start(){ > if(thread==null){ > thread=new Thread(this); > thread.start(); > } > } のことです。 start() は thread==null なら生成して実行しますので、実行中ならば thread!=null ですから二度以上は実行されません。 thread 変数の値によってスレッドの多重起動を防ぐことになっているんですね。 処理を適切にメソッドに分け、条件があるならばそれをメソッド内に含ませておくことで、外からは特別条件を意識しなくても済むようになります。
aruko

2021/12/16 14:54

start();とするところを、thread.start()としていたことに気づいたので、それも直しました。 onCreateで実行することは、スマホをすぐにオンにすれば特に問題はないのでとりあえずそうしました。 ダイアログを複数作っていくため、フォーカスが変わっていくかもしれないとも思ったからです。 でも、jimbeさんが書いてくださったように、 onWindowFocusChanged内でも可能なので、今後の作成状況を見て考えていきたいと思います。 ほんとにありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問