teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

文章抜け修正

2017/10/24 15:11

投稿

keicha_hrs
keicha_hrs

スコア6768

answer CHANGED
@@ -55,9 +55,9 @@
55
55
 
56
56
  基本的には、ボタンを押して猫を移動させる度にxまたはyを1ずつ増やしています。しかし、猫が端に到達したときにボタンを押したときには効かないようにする処理が必要です。そのためにif文を入れています。
57
57
 
58
- yが0のときは猫が一番上にいるときなので、yが0より大きいときだけ処理を実行するように、`if (y > 0)`という条件を入れています。
58
+ yが0のときは猫が一番上にいるときなので、「うえ」を押したときにyが0より大きいときだけ処理を実行するように、`if (y > 0)`という条件を入れています。
59
59
 
60
- yが3のときは猫が一番下にいるときなので、yが3より小さいときだけ処理を実行するように、`if (y < 3)`という条件を入れています。
60
+ yが3のときは猫が一番下にいるときなので、「した」を押したときにyが3より小さいときだけ処理を実行するように、`if (y < 3)`という条件を入れています。
61
61
 
62
62
  ひだり、みぎについても考え方は同じです。
63
63
 

3

サンプルコード提示

2017/10/24 15:11

投稿

keicha_hrs
keicha_hrs

スコア6768

answer CHANGED
@@ -44,4 +44,99 @@
44
44
  ```Java
45
45
  ImageView imageView1 = findViewById(R.id.imageView1);
46
46
  ```
47
- Android Support Library 26.0.0以上を適用すると、findViewByIdの結果をキャストせずに代入できるようになりました(長年不評だったところをようやく改めたということ)。その前提でサンプルを書いたので上記のようになっています。
47
+ Android Support Library 26.0.0以上を適用すると、findViewByIdの結果をキャストせずに代入できるようになりました(長年不評だったところをようやく改めたということ)。その前提でサンプルを書いたので上記のようになっています。
48
+
49
+ ---
50
+
51
+ (10/25 00:08追記)
52
+ 文章だけで説明するのが難しいので、ざっくり作成したコードを載せます(ここまでするのはやり過ぎだと他の回答者様に怒られてしまうかもしれないけど)。一応ここではfindViewByIdのキャストは入れました。
53
+
54
+ このコードでは、縦4マス、横3マスの盤上を猫が移動するものとしています。開始時の猫の位置は左上としているので、xとyの初期値は0としています。
55
+
56
+ 基本的には、ボタンを押して猫を移動させる度にxまたはyを1ずつ増やしています。しかし、猫が端に到達したときにボタンを押したときには効かないようにする処理が必要です。そのためにif文を入れています。
57
+
58
+ yが0のときは猫が一番上にいるときなので、yが0より大きいときだけ処理を実行するように、`if (y > 0)`という条件を入れています。
59
+
60
+ yが3のときは猫が一番下にいるときなので、yが3より小さいときだけ処理を実行するように、`if (y < 3)`という条件を入れています。
61
+
62
+ ひだり、みぎについても考え方は同じです。
63
+
64
+ このコードを見て、イメージを掴んで欲しいなあと。
65
+
66
+ ```Java
67
+ public class MainActivity extends AppCompatActivity {
68
+ final static float TRANSLATE_X = 300.0f; // 1回の操作でX軸方向にいくつ動かすか
69
+ final static float TRANSLATE_Y = 300.0f; // 1回の操作でY軸方向にいくつ動かすか
70
+
71
+ // 盤面上の開始座標を初期値として設定する
72
+ private int x = 0;
73
+ private int y = 0;
74
+
75
+ @Override
76
+ protected void onCreate(Bundle savedInstanceState) {
77
+ super.onCreate(savedInstanceState);
78
+ setContentView(R.layout.activity_main);
79
+
80
+ Button button1 = (Button) findViewById(R.id.button1); // うえ
81
+ Button button2 = (Button) findViewById(R.id.button2); // した
82
+ Button button3 = (Button) findViewById(R.id.button3); // ひだり
83
+ Button button4 = (Button) findViewById(R.id.button4); // みぎ
84
+
85
+ button1.setOnClickListener(new View.OnClickListener() {
86
+ @Override
87
+ public void onClick(View v) {
88
+ // 「うえ」を押したときの処理
89
+ if (y > 0) {
90
+ float start = TRANSLATE_Y * y;
91
+ float end = start - TRANSLATE_Y;
92
+ animationImageView("translationY", start, end);
93
+ y--;
94
+ }
95
+ }
96
+ });
97
+ button2.setOnClickListener(new View.OnClickListener() {
98
+ @Override
99
+ public void onClick(View v) {
100
+ // 「した」を押したときの処理
101
+ if (y < 3) {
102
+ float start = TRANSLATE_Y * y;
103
+ float end = start + TRANSLATE_Y;
104
+ animationImageView("translationY", start, end);
105
+ y++;
106
+ }
107
+ }
108
+ });
109
+ button3.setOnClickListener(new View.OnClickListener() {
110
+ @Override
111
+ public void onClick(View v) {
112
+ // 「ひだり」を押したときの処理
113
+ if (x > 0) {
114
+ float start = TRANSLATE_X * x;
115
+ float end = start - TRANSLATE_X;
116
+ animationImageView("translationX", start, end);
117
+ x--;
118
+ }
119
+ }
120
+ });
121
+ button4.setOnClickListener(new View.OnClickListener() {
122
+ @Override
123
+ public void onClick(View v) {
124
+ // 「みぎ」を押したときの処理
125
+ if (x < 2) {
126
+ float start = TRANSLATE_X * x;
127
+ float end = start + TRANSLATE_X;
128
+ animationImageView("translationX", start, end);
129
+ x++;
130
+ }
131
+ }
132
+ });
133
+ }
134
+
135
+ void animationImageView(String property, float start, float end) {
136
+ ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
137
+ ObjectAnimator animator = ObjectAnimator.ofFloat(imageView1, property, start, end);
138
+ animator.setDuration(1000);
139
+ animator.start();
140
+ }
141
+ }
142
+ ```

2

補足

2017/10/24 15:08

投稿

keicha_hrs
keicha_hrs

スコア6768

answer CHANGED
@@ -36,4 +36,12 @@
36
36
  ```
37
37
  のような感じになるんじゃないでしょうか。同じ要領で「ひだり」「みぎ」も実装すれば、それっぽくなるかなあと。
38
38
 
39
- 短時間で雑に考えたので抜けがあるかもしれませんが。
39
+ 短時間で雑に考えたので抜けがあるかもしれませんが。
40
+
41
+ ---
42
+
43
+ 本題とは関係ない部分についてですがちょっと補足。
44
+ ```Java
45
+ ImageView imageView1 = findViewById(R.id.imageView1);
46
+ ```
47
+ Android Support Library 26.0.0以上を適用すると、findViewByIdの結果をキャストせずに代入できるようになりました(長年不評だったところをようやく改めたということ)。その前提でサンプルを書いたので上記のようになっています。

1

メソッド名を修正

2017/10/21 08:19

投稿

keicha_hrs
keicha_hrs

スコア6768

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  アニメーションにはObjectAnimatorを用いたらどうでしょうか。こんな感じのメソッドを用意します。
6
6
 
7
7
  ```Java
8
- void AnimationImageView(String property, float start, float end) {
8
+ void animationImageView(String property, float start, float end) {
9
9
  ImageView imageView1 = findViewById(R.id.imageView1);
10
10
  ObjectAnimator animator = ObjectAnimator.ofFloat(imageView1, property, start, end);
11
11
  animator.setDuration(1000);
@@ -21,7 +21,7 @@
21
21
  if (y > 0) {
22
22
  float start = 300.0f * y;
23
23
  float end = start - 300.0f; // 終了位置を300.0減らした位置に
24
- AnimationImageView("translationY", start, end);
24
+ animationImageView("translationY", start, end);
25
25
  y--;
26
26
  }
27
27
  ```
@@ -30,7 +30,7 @@
30
30
  if (y < 3) {
31
31
  float start = 300.0f * y;
32
32
  float end = start + 300.0f; // 終了位置を300.0増やした位置に
33
- AnimationImageView("translationY", start, end);
33
+ animationImageView("translationY", start, end);
34
34
  y++;
35
35
  }
36
36
  ```