プログラミング言語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
}
}