回答編集履歴
4
文章抜け修正
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
サンプルコード提示
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
補足
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
メソッド名を修正
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
アニメーションにはObjectAnimatorを用いたらどうでしょうか。こんな感じのメソッドを用意します。
|
6
6
|
|
7
7
|
```Java
|
8
|
-
void
|
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
|
-
|
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
|
-
|
33
|
+
animationImageView("translationY", start, end);
|
34
34
|
y++;
|
35
35
|
}
|
36
36
|
```
|