【はじめてのKotlinプログラミング(5)】when(タッチ処理で「猫パンチ」!?)

(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を使った
プログラミング解説でした。

    コメントを残す