プログラミング言語kotlinで、ボールが色んな場所から、ランダムに落下してくるプログラムを書いていきたいと思います。

動画

目次

01:22 レイアウト(xml)
04:35 [1]viewの取得
08:15 [2]アニメーション(関数)
13:05 [3]関数の中身
16:50  -(1)X軸のランダムな初期位置
20:55  -(2)アニメーション
24:45  -(3)フレームの更新
26:35  -(4)受付機能追加
33:30 [4-5]回数を設定、1減算
38:55 [6]新規アニメーション
40:55 [7]リターン
44:20 [8]スタート

コード

▼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/ivBall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ball" />
</androidx.constraintlayout.widget.ConstraintLayout>

▼MainActivity.kt

package com.example.randomball

import android.animation.Animator
import android.animation.ValueAnimator
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.animation.AccelerateInterpolator
import android.widget.ImageView

class MainActivity : AppCompatActivity() {
    //4)制限回数(初期値)
    private var remainingFalls = 5

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //1)viewの取得+画面の高さ
        val ivBall:ImageView = findViewById(R.id.ivBall)
        val screenHeight = resources.displayMetrics.heightPixels.toFloat()

        //2)アニメーション ⇒中身は「3」へ
        //8)関数を代入
        val anim = fallingAnimator(ivBall, screenHeight)
        anim.start()
    }

    //3)「2」の中身
    private fun fallingAnimator(ball:ImageView,sHeight:Float):ValueAnimator{
        //[3-1]X軸の、ランダムな初期位置を設定
        val screenWidth = resources.displayMetrics.widthPixels.toFloat()-100f //画面幅 -ボール幅(左右)
        ball.translationX = (Math.random()*screenWidth).toFloat() //その画面の枠の中で、ランダムな数値を設置

        //[3-2]アニメーション
        val animator = ValueAnimator.ofFloat(0f,sHeight)
        animator.duration = 3000 // アニメーションの時間(ミリ秒)
        animator.interpolator = AccelerateInterpolator() // アニメーションの加速度(削除可)

        //[3-3]フレームの更新
        animator.addUpdateListener { valueAnimator ->
            val value = valueAnimator.animatedValue as Float
            ball.translationY =value
        }

        //[3-4]受付機能の追加
        animator.addListener(object :Animator.AnimatorListener{
            override fun onAnimationStart(animation: Animator) {
            }

            override fun onAnimationEnd(animation: Animator) {
                //5)制限回数を1減らす
                remainingFalls--

                //6)制限回数が残っている場合、新しいアニメーションを作成して再生
                if(remainingFalls>0){
                    val newAnimator =fallingAnimator(ball,sHeight)
                    newAnimator.start()
                }
            }

            override fun onAnimationCancel(animation: Animator) {
            }

            override fun onAnimationRepeat(animation: Animator) {
            }

        })

        //7)リターン
        return animator
    }
}

    コメントを残す