(AndroidStudio4.2)
kotlinで、「when」を使って、条件分岐を解説します。
javaでいうところのswitchにあたります。
動画で使用した画像はこちらです。クリック先を、PCに保存してご利用ください
動画
コード
▼activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/cat01" /> </androidx.constraintlayout.widget.ConstraintLayout>
▼MainActivity.kt
package com.example.nekopunchapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.MotionEvent import android.widget.ImageView class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } //1)画面タッチ override fun onTouchEvent(event: MotionEvent?): Boolean { var iv :ImageView = findViewById(R.id.iv) //2)条件分岐(押した時、動かした時、離した時) when(event?.action){ MotionEvent.ACTION_DOWN -> iv.setImageResource(R.drawable.cat02) MotionEvent.ACTION_MOVE -> iv.setImageResource(R.drawable.cat03) MotionEvent.ACTION_UP -> iv.setImageResource(R.drawable.cat01) } return super.onTouchEvent(event) } }
テキスト
kotlinで、「when」を使って、条件分岐を解説します。
javaでいうところのswitchにあたります。
完成見本がこちらです。
何もしないと、猫ちゃんがいますが、
●画面をタッチしたとき、
●タッチしたまま動かしたとき、
●離した時、の3種類によって画像が変わる、というタッチアプリです。
前回も、同じく条件分岐をしましたが、前回は「if」を使いました。
「if」と「when」、どちらも条件分岐なので、同じような使い方もできるんですが
何々とそれ以外、みたいな二択の時にはifが、
それから今回のように、
パターンA
パターンB
パターンCといった3種類以上のパターンを使い分ける時にはwhenが適している、
みたいなイメージで最初のうちはOKだと思います。
もちろんifでも3種類とかの使い分けはできますが、
ざっくりとしたイメージとして覚えておいてください。
ということで、今回はwhenを使って
●画面をタッチした時、
●タッチしたまま動かしている時
●離した時、
この3種類で、画像を変えてみましょう。
************************************
それでは始めていきます
androidStudioを起動してください。
名前は適当に
NekoPunchApp
とかにしておきます。言語はkotlinです。
お決まりではありますが
xmlとkt、2つのファイルが出来ています。
まずはレイアウトのxmlを開いてください。
************************************
【1】ImageViewの挿入
それでは始めていきましょう。
まずはレイアウトに画像を1つ追加します。
画像はImageViewなんですが、
まず画像そのものを準備しておく必要があります。
サイトに画像を掲載しておきますので宜しければご利用ください。
リソースの中のdrawableの中に画像をドラッグ&ドロップして追加してください。
ちなみに「Ctrl+ドラッグ」でコピーになります。
はい、これでdrawableの中に
画像が3つ追加できたのを確認して、
ImageViewを設置します。
パレットからImageViewを追加して
画像を選択してくださいと言われるので、
cat01を選択してOK。
位置を決めましょう。
上下中央、左右中央。
idも決めておきましょう。
imageView、略して
ivとかにしておきます。
レイアウトは以上です。
それではいったんエミュレータを起動して確認してみましょう。
************************************
【2】タッチしたときの処理をwhenで条件分岐
それでは、kotlinを書いていきましょう。
まずは、「画面をタッチした時」のイベントを受けるには
onTouchEventというメソッドを使います。
記述する場所は、onCreate{}の外に書きます。
//1)画面タッチ override fun onTouchEvent(event: MotionEvent?): Boolean { }
onCreateの中は起動したと同時に処理されるんですけども
今回は起動直後は関係ないので、その下に書いていきます。
onTと入れると出てきます。
それからviewを取得しておきます。
var iv :ImageView = findViewById(R.id.iv)
これで、画面をタッチした時の受付が用意できましたので
今回の本題、whenを使って条件分岐をしていきましょう。
whenは
when(引数){
Aの時 -> 処理A
Bの時 -> 処理B
Cの時 -> 処理C
}
Aの時
Bの時
Cの時
と、それぞれの処理を書いてあげます。
ということで、まずwhenとかいて()、{}。
()の中に条件を書くんですが、
ちょっとここだけ、なんのこっちゃわからないと思いますが
event.actionと書いてください。
後で記述するコードを見るとわかると思いますが
タッチした時の処理は
モーションイベントっていうのを使って
押した時がアクションダウン、
離したときがアクションアップ、というような記述になります。
まあ、ここももう決まり文句みたいなもんなので
こういう風に書くんだな、くらいでOKだと思います。
それから、.のところに赤い波線が出ているかもしれません。
マウスを合わせると、何やらワーニングが出ていまして、
nullチェック、つまり空っぽをチェックしろと行っているようです。
これが何かというのも色々理屈はあるんですが
ここの上に「?」ってありますよね。
勝手に作られるやつなんですけども。
これが空っぽ判定を意味します。
?の場合はnull許容型、ということで、空っぽでもそのまま処理を流します(通過します)、という意味です。
ということで、同じようにここにも「?」と書いてあげればOKです。
これの逆で、打ち消す場合は「!!」と記述しますが、
ひとまず今回は「?」でいいでしょう。
※「!!」の場合はnullの場合エラー扱いになりますが、今回のプログラムではnullは関係ないので、ぶっちゃけどっちでも動きます。←
ちょっとここはですね、
いきなり初級編で説明するには話が飛びすぎているんですけども
このパターン、「?」とか「!!」っていうのがあるんだな、
というくらいの理解でOKです。
ここはもう決まり文句として入れておいてください。
で、ここからが今回の本題です。
この中にですね、押した時と、動かした時と、離した時
の処理を3つ書いていきます。
まず、押した時はですね
MotionEvent.ACTION_DOWN
を使います。
//2)条件分岐(押した時、動かした時、離した時) when(event!!.action){ MotionEvent.ACTION_DOWN -> iv.setImageResource(R.drawable.cat02) MotionEvent.ACTION_MOVE -> iv.setImageResource(R.drawable.cat03) MotionEvent.ACTION_UP -> iv.setImageResource(R.drawable.cat01) }
************************************
以上、条件分岐whenを使った
プログラミング解説でした。