今回は、Androidアプリ開発のチュートリアルとして、簡単なアニメーション付きカウントダウンアプリを作っていきましょう!
「カウントダウンアプリを作ろう」で作成したアプリをベースにチュートリアルを作成していきますので、まだの人はカウントダウンアプリの作成から進めてください。
完成形はこちら
終了テキストとカウントダウンテキストにアニメーションがついています。
- Android Studio Chipmunk | 2021.2.1 Patch 1
- Kotlin 1.6.21
目次
アニメーションの追加
今回のアニメーションは簡単なため ViewCompat
というクラスを使用していきます。
複雑なアニメーションは、Android animatorなどを使うことで実現できます。
ViewCompatクラスの animate()
というメソッドが今回重要です。
終了テキストのアニメーション
まずは終了テキストのアニメーションから実装していきます。
MainActivity
を開いてください。
CountDownTimer
クラスの onFinish()
メソッドだけを抜き出しています。
override fun onFinish() {
button.isEnabled = true
// ↓↓ここから↓↓
// alphaを0に設定
finishedTextView.alpha = 0f
// アニメーションのスタート
ViewCompat.animate(finishedTextView)
.setDuration(500)
.alpha(1f)
.start()
// ↑↑ここまでを追加↑↑
finishedTextView.visibility = View.VISIBLE
countTextView.text = "0"
}
1つ1つ解説していきます。
終了テキストのアニメーション
まず終了テキストは段々と表示されるようなアニメーションになっています。
つまり alpha
を0から1になるようにすればいいわけですね。
そのために finishedTextView
の alpha
を0にしています。
アニメーションをさせる対象の指定
次に ViewCompat.animate()
です。
引数に finishedTextView
を指定していますが、
これはアニメーションをさせる対象を指定させています。
アニメーションの長さ
その次に setDuration()
メソッドを呼んでいますが、これはアニメーションの長さです。
今回は500ミリ秒(0.5秒)にしました。
alphaの指定
その下の alpha()
メソッドですが、これは今の alpha
の状態から指定した alpha
まで変更させます。
つまり最初に alpha
を0に設定しているので、段々と0から1になるようなアニメーションになります。
開始
最後に start()
メソッドです。これは文字通りアニメーションを開始させるメソッドです。
それではここでビルドしてみましょう。
このように「終了」がフワッと表示されればOKです!
カウントダウンテキストのアニメーション
最後にカウントダウンテキストにもアニメーションをつけていきましょう。
今回もソースコードは一部抜粋しており、 CountDownTimer
クラスの onTick()
メソッドのみです。
まずは以下のように実装してみてください。
override fun onTick(millisUntilFinished: Long) {
// 1秒ごとにテキストを更新
val second = ceil(millisUntilFinished / 1000.0).toInt()
countTextView.text = second.toString()
// ↓↓ここから↓↓
// scaleを元に戻す
countTextView.scaleX = 1f
countTextView.scaleY = 1f
// scaleアニメーション開始
ViewCompat.animate(countTextView)
.setDuration(1000)
.scaleX(2f)
.scaleY(2f)
.start()
// ↑↑ここまでを追加↑↑
}
1つ1つ説明していきます。
scaleの設定
カウントダウンテキストは1秒の間に段々と大きくなるようなアニメーションをしています。
これは View
の scale
を段々と上げることで実現できます。
scale
とは View
の比率のことです。
1を指定すると1倍になり、2を指定すると2倍になるという具合です。
X
と Y
というのがありますが、 X
が横方向で Y
が縦方向です。
この scale
を上手く使っていくのですが、最初に countTextView
の scaleY
と scaleX
を0にしていると思います。
onTick
は1秒ごとに呼ばれるので、次のアニメーションに備えて初期状態に戻して上げる必要があるというわけです。
アニメーション実装部分
次にアニメーションの実装部分です。
先ほどと同様に View.animate()
を使います。
今回は1秒ごとのカウントなので setDuration()
メソッドには1000ミリ秒(1秒)を指定しています。
scaleX()
と scaleY()
ですが、これは元の scale
からそれぞれの方向に指定した scale
まで変更させます。
先ほど初期値に scale
を1に設定しているので、1から2まで大きくさせるような動きになります。
これは先ほどの alpha
と全く同じ考え方ですね。
開始
最後に start()
メソッドを呼んでアニメーションを開始させています。
ここまで実装できたらビルドさせてみましょう。
このように、カウント表示がアニメーションで表示されればOKです!
最後に MainActivity
のソースコードを載せておきますので、必要があれば参考にしてください。
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.CountDownTimer
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.core.view.ViewCompat
import kotlin.math.ceil
class MainActivity : AppCompatActivity() {
companion object {
private const val COUNT_DOWN_MILLISECOND: Long = 5000
private const val INTERVAL_MILLISECOND: Long = 1000
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.count_down_button)
val finishedTextView = findViewById<TextView>(R.id.finished_text)
val countTextView = findViewById<TextView>(R.id.count_label)
val timer = object : CountDownTimer(COUNT_DOWN_MILLISECOND, INTERVAL_MILLISECOND) {
override fun onFinish() {
button.isEnabled = true
// ↓↓ここから↓↓
// alphaを0に設定
finishedTextView.alpha = 0f
// アニメーションのスタート
ViewCompat.animate(finishedTextView)
.setDuration(500)
.alpha(1f)
.start()
// ↑↑ここまでを追加↑↑
finishedTextView.visibility = View.VISIBLE
countTextView.text = "0"
}
override fun onTick(millisUntilFinished: Long) {
// 1秒ごとにテキストを更新
val second = ceil(millisUntilFinished / 1000.0).toInt()
countTextView.text = second.toString()
// ↓↓ここから↓↓
// scaleを元に戻す
countTextView.scaleX = 1f
countTextView.scaleY = 1f
// scaleアニメーション開始
ViewCompat.animate(countTextView)
.setDuration(1000)
.scaleX(2f)
.scaleY(2f)
.start()
// ↑↑ここまでを追加↑↑
}
}
button.setOnClickListener {
// 各Viewの初期設定
button.isEnabled = false
finishedTextView.visibility = View.INVISIBLE
countTextView.text = "5"
// timerのスタート
timer.start()
}
}
}
まとめ
お疲れ様でした!
アニメーションでリッチになりましたでしょうか?
シンプルなものでも、アニメーションはアプリのUXを高めるために効果的です。
自在に使えるようになっていきましょう。