onTouchEventの処理が不明なので教えていただきたいです。
現在、Android Studioを使用しており、タッチをしている間はキャラクターが上昇し、タッチをしない間はキャラクターが下降する処理を記述しています。
動作自体は問題ないのですが、なぜその動きになるのか疑問な点があります。
疑問点は以下になります。
①onTouchEventでstart_flg = falseで1回目の処理を行う
②start_flg = trueに置き換えて、changePos()を実行して、キャラクター上昇
③onTouchEventが"指を離す"で実行されて、if文がstart_flg = trueで実行
④else以下のif文が読み込まれ、action_flgが書き換えられて処理が逆に下降で実行
以上の処理までは考え方として合っているのでしょうか?
その考えの場合、start_flgをfalseに書き換えているタイミングが理解できません。
start_flgがfalseで読み込まれているのは、最初の1回だけになってしまいます。
ただ、changePos()を記述しているのは、start_flg = falseの処理なので、キャラクターが移動する処理として何度もこのコードが実行されているはずです。
フィールド変数として記載しているstart_flg = falseに戻っているのでしょうか?
return true でstart_flg = trueで返却していると思いますが、一生、if文の中のstart_flg = falseが読み込まれないような気がしています。
どこかで勘違いしていると思うのですが、どこか分からない状態です。
どういった処理の流れをしているか教えていただければ幸いでございます。
お手数おかけしますがご確認よろしくお願いいたします。
java
1 2package com.example.catchtheball; 3 4import androidx.appcompat.app.AppCompatActivity; 5 6import android.os.Bundle; 7import android.os.Handler; 8import android.view.MotionEvent; 9import android.view.View; 10import android.widget.FrameLayout; 11import android.widget.ImageView; 12import android.widget.TextView; 13 14import java.util.Timer; 15import java.util.TimerTask; 16 17public class MainActivity extends AppCompatActivity { 18 19 private TextView scoreLabel; 20 private TextView startLabel; 21 private ImageView box; 22 private ImageView orange; 23 private ImageView pink; 24 private ImageView black; 25 26 // サイズ 27 private int frameHeight; 28 private int boxSize; 29 30 // 位置 31 private float boxY; 32 33 // Handler & Timer 34 private Handler handler = new Handler(); 35 private Timer timer = new Timer(); 36 37 // Status 38 private boolean action_flg = false; 39 private boolean start_flg = false; 40 41 @Override 42 protected void onCreate(Bundle savedInstanceState) { 43 super.onCreate(savedInstanceState); 44 setContentView(R.layout.activity_main); 45 46 scoreLabel = findViewById(R.id.scoreLabel); 47 startLabel = findViewById(R.id.startLabel); 48 box = findViewById(R.id.box); 49 orange = findViewById(R.id.orange); 50 pink = findViewById(R.id.pink); 51 black = findViewById(R.id.black); 52 53 orange.setX(-80.0f); 54 orange.setY(-80.0f); 55 pink.setX(-80.0f); 56 pink.setY(-80.0f); 57 black.setX(-80.0f); 58 black.setY(-80.0f); 59 } 60 61 public void changePos() { 62 if (action_flg) { 63 boxY -= 20; 64 65 } else { 66 boxY += 20; 67 } 68 69 if (boxY < 0) boxY = 0; 70 71 if (boxY > frameHeight - boxSize) boxY = frameHeight - boxSize; 72 73 box.setY(boxY); 74 } 75 76 @Override 77 public boolean onTouchEvent(MotionEvent event) { 78 if (start_flg == false) { 79 80 start_flg = true; 81 82 FrameLayout frame = findViewById(R.id.frame); 83 frameHeight = frame.getHeight(); 84 85 boxY = box.getY(); 86 boxSize = box.getHeight(); 87 88 startLabel.setVisibility(View.GONE); 89 90 timer.schedule(new TimerTask() { 91 @Override 92 public void run() { 93 handler.post(new Runnable() { 94 @Override 95 public void run() { 96 changePos(); 97 } 98 }); 99 } 100 }, 0, 20); 101 102 } else { 103 if (event.getAction() == MotionEvent.ACTION_DOWN) { 104 action_flg = true; 105 106 } else if (event.getAction() == MotionEvent.ACTION_UP) { 107 action_flg = false; 108 109 } 110 } 111 return true; 112 } 113} 114
回答1件
あなたの回答
tips
プレビュー