Kotlinアプリ開発 vol.1-1 RM計算機を作ろう

RM計算機

最初に作るのはRM計算アプリ

RMとはRepetition Maximumの略。

1RM = 重量 (1 + 回数 ÷ 40 ) で算出できる。

 ※実際は式が複数あるが今回は割愛する

例えば70kgを3回挙げられるとすると、1RMが75kgということになる。

70kgが3回挙げられる人のRM

1RM2RM3RM5RM8RM10RM12RM15RM
75kg72kg70kg65kg63kg60kg58kg55kg

一般的には以下のように言われている。

  • 1~4回 筋力アップ
  • 5~12回 筋肥大
  • 15回~ 筋持久力アップ

筋トレの目的に応じて、自分がやるべき重量と回数の関係を知ることができる。

割り勘アプリを参考にする

RM計算アプリの作製にあたっては以下の割り勘アプリを参考にした。

【Androidアプリ開発 vol.06】割勘計算アプリ① 開発の大まかな流れと新規プロジェクトの作成!
前回まで5回に分けて書いてきたAndroidアプリ開発、環境構築編。前回:【Androidアプリ開発 vol.05】Macのターミナルアプリでadbコマンドを使えるようにする手順第6回の今回からいよいよAndroidStudioを実際に使っ

下記のように変更するだけで問題ないはず。

アプリ名割り勘RM計算機
入力1合計金額重量
入力2人数rep数
出力1合計金額÷人数RM = 重量 (1 + 回数 ÷ 40 )

丸パクリアプリ完成! そして改良・・・

とりあえず完成したので動作確認。

RM計算機Draft

改良編まで真似してやってみます。

【Androidアプリ開発 vol.09】割勘計算アプリ改良① 作ったアプリの改善点と入力画面の修正
画面を作成して、MainActivity.ktにコードを書いてようやく割勘計算アプリが完成しました。前回:【Androidアプリ開発 vol.08】割勘計算アプリ③ アプリ完成!MainActivity.ktのプログラミング!合計金額、人数

改良としてやっている項目は以下。

  • 入力画面と結果画面の2画面構成
  • イラストを載せる
  • アイコンを作る
  • 端数を表示する
  • 金額調整欄を作る

RM計算アプリの改良としては以下をやってみます。

  • 入力画面と結果画面の2画面構成
  • イラストを載せる
  • アイコンを作る
  • 8RMの結果を表示して筋肥大のメニューを提案する

Adaptive Iconを作る

ロゴ作りはCanvaを使います。

Attention Required! | Cloudflare

こんな感じで作製しました。

Android 8.0(API レベル 26)で導入されたアダプティブ ランチャー アイコンの作成方法については、この APK アイコンのガイドラインをご覧ください。

https://developer.android.com/google-play/resources/icon-design-specifications?hl=ja

どうもアイコンサイズごとに画像を用意する必要があるみたいです。

[Android] アイコンを簡単作成できる Image Asset
やっとアプリ完成だと思っても、最後の仕上げでたくさんのアイコンをつくらないといけないのは面倒ですよね〜。更に、Adaptive icons というのを Oreoから作らないといけません。ところが簡単に作成できるツール Image Asset

このサイトを参考にして作製しました。

8RMの結果を表示させる

ここが一番苦戦しました。

1RM = 重量 (1 + 回数 ÷ 40 ) で算出できる。

 ⇒ nRMの重量 = 1RM / ( 1 + 回数 ÷ 40)

 ⇒ 8RMの重量 = 1RM /  1.2 

以下のコードだと予期せぬエラーでアプリが落ちました。

       //前画面から整数型に変換した値を受け取る
        val weight = intent.getIntExtra("weight", 0)
        val rep = intent.getIntExtra("rep", 0)

        //1RMと8RMの計算
        val kekka = weight * rep / 40 + weight
        val hachi = kekka / 1.2

全く意識していなかったけど、整数型に1.2という小数をかけたのがダメだったらしい

  val hachi = kekka / 6 * 5

整数のみに変えたら無事動作しました。

RM計算機 改良

コードを紹介

入力画面のコードはこちら

MainActivity.ktのコードを見る
package com.example.rmcalc

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView

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

        val button = findViewById<Button>(R.id.b_keisann)
        button.setOnClickListener {

            //未入力判定用のフラグ
            var isValid = true

            //何kgの値を取得
            val get_weight = findViewById<EditText>(R.id.et_weight)
            val st_weight = get_weight.text.toString()

            //何kg入力欄が空欄になっていないかをチェック
            if (st_weight.isEmpty()) {
                get_weight.error = getString(R.string.et_weight_error)
                isValid = false
            }

            //何回の値を取得
            val get_rep = findViewById<EditText>(R.id.et_rep)
            val st_rep = get_rep.text.toString()

            //何回入力欄が空欄になっていないかをチェック
            if (st_rep.isEmpty()) {
                //何回が未入力の場合
                 get_rep.error = getString(R.string.et_rep_error)
                isValid = false
            }

            //何kg入力欄、何回入力欄に値が入っている場合
            if (isValid) {
                //値を文字列型から整数型に変換
                val weight = Integer.parseInt(st_weight)
                val rep = Integer.parseInt(st_rep)

                //ResultActivityにweightとrepの値を引き継ぎ
                val intent = Intent(this, ResultActivity::class.java)
                intent.putExtra("weight", weight)
                intent.putExtra("rep", rep)

                //weightとrepのEditTextを初期化
                get_weight.text.clear()
                get_rep.text.clear()

                //ResultActivityの呼び出し
                startActivity(intent)

                //計算
                val kekka = weight * rep / 40 + weight
                //1RMを取得して結果を表示
                val set_kekka = findViewById<TextView>(R.id.tv_onerep)
                set_kekka.text = getString(R.string.set_kekka, kekka)
            }
        }
    }
}

結果画面のコードはこちら

ResultActivity.ktのコードを見る
package com.example.rmcalc

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class ResultActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_result)

        //前画面から整数型に変換した値を受け取る
        val weight = intent.getIntExtra("weight", 0)
        val rep = intent.getIntExtra("rep", 0)

        //1RMと8RMの計算
        val kekka = weight * rep / 40 + weight
        val hachi = kekka / 6 * 5

        //1RMを表示
        val set_kekka1 = findViewById<TextView>(R.id.tv_result)
        set_kekka1.text = getString(R.string.set_kekka1, kekka)

        //8RMを表示
        val set_hachirm = findViewById<TextView>(R.id.tv_testmenu)
        set_hachirm.text = getString(R.string.set_hachirm, hachi)

        //再計算ボタンをタップした時の処理
        val again = findViewById<Button>(R.id.b_again)
        again.setOnClickListener {
            //ResultActivityを終了させる
            finish()
        }
    }
}

まとめ

サンプルをもとに簡易的なRM計算アプリを作製した
整数や小数の使い方を勉強する必要がある(次回分で学ぶ)

コメント

タイトルとURLをコピーしました