Androidプログラミングに挑戦2!(16)単位変換アプリを作る(その7)
JUGEMテーマ:プログラミング
新年あけましておめでとうございます。
今年もつたない文章ではありますが、ぼちぼちアップしていきたいと思いますので、緩い感じでお付き合いください。
今回は、最終形態に向けての展望を整理しつつ、データ入力作業を進めていきましょう。
まずその最終形態を何と見据えるかです。
1年の始まりでもありますのでここは大きく出て、Google Playでの公開を目指したいと思います!
それに向けてはあと何をすればいいのでしょう?
思いつくままに挙げてみましょう。
・カテゴリー、単位を充実させる。
・単位の説明を表示する。
・アイコンを作る。
・多言語対応にする。
・広告を入れる(広告なしの有料版も公開する)
・Google Playデベロッパーに登録する。
・アプリを公開する。
なにやら壮大な計画になってきました。いい感じです。
今日のところは以前からの予告通り、カテゴリー、単位の充実を行いたいと思います。
まず、カテゴリーですが、前回は長さ、面積、体積、重さの4つだけ4でしたが、そこに密度、時間、速度、加速度、体積流量、質量流量、角度、角速度、角加速度、力、圧力、仕事、仕事率、温度の14カテゴリーを加えて、全部で18カテゴリーにしました。変換できる単位はそれぞれ次の通りです。
長さ:m, km, cm, mm, μm, nm, Å, pm, in, ft, yd, mile, nmile, 毛, 厘、寸、尺、間、尋、町、里、AU、ly、pc(24個)
面積:m2, a, ha, km2, cm2, mm2, in2, ft2, yd2, ac, mile2, 坪、畝、反、町(15個)
体積:m3, cm3, mm3, L, dL, mL, cc, 小さじ、大さじ、カップ、in3, ft3, USfl.oz, USfl.pt, USfl.qt, USG, Imp.gal, USbu, Oil bbl, US bbl, Imp.bbl, 勺、合、升、斗、石、俵(27個)
重さ:kg, g, mg, μg, ng, pg, fg, t, gr, dr, oz, lb, s/qr, s/t, l/t, 匁、両、斤、貫、kt(20個)
密度:kg/m3, g/cm3, lb/ft3, lb/in3(4個)
時間:s, ms, μs, ns, ps, fs, min, h, d, wk, mo, y, c(13個)
速度:m/s, m/min, m/h, km/s, km/min, km/h, fps, fpm, fph, mps, mpm, mph, kt, M(14個)
加速度:m/s2, ips2, fps2, mps2, g, Gal(6個)
体積流量:m3/s, scch, sccm, sccs, sLm, sLs, in3/s, ft3/s, m3/h, galUS/s, galUK/s(11個)
質量流量:kg/s, lb/s(2個)
角度:rad, °, ′, ″, grad, mil, %(7個)
角速度:rad/s, °/s, rps, rpm, Hz(5個)
角加速度:rad/s2, °/s2, rps2(3個)
力:N, dyn, kgf, lbf, pdl(5個)
圧力:Pa, hPa, kPa, MPa, mbar, bar, kg/cm2, atm, Torr, mmHg, mmAq, inHg, psi(13個)
仕事:J, kJ, MJ, erg, kgf・m, eV, cal, kcal, BTU, kWh, tTNT, HPh, PSh(13個)
仕事率:W, kW, HP, PS, kgfm/s, ftlb/s, kcal/s, kcal/h, BTU/s(9個)
温度:K, ℃、℉、°R(4個)
一応一般的なものは一通り集めたつもりですが、このほかにもカテゴリーの追加や単位の追加のリクエストがありましたら、いつでも対応いたしますので、コメントよろしくお願いします。
さてこれらの単位の中で、実際に換算してみようとすると今までの方式では換算できない単位がいくつか出てきました。今までの方式は、変換元の単位から基準単位に、その後基準単位から変換先の単位にそれぞれ変換係数を掛けて変換していました。ですが上記の単位の中に、変換係数を掛けるだけでは換算できない単位が出てきたんです。
一つ目は、角度の「%」。よく道路標識にある、100m進む間に1m高くなったら勾配1%、というあれです。この勾配x%を角度に直すにはatan(x/100)(アークタンジェント)という逆三角関数を使って計算してやる必要があります。
それから4つの温度。Kは℃+273.15となり、比例ではなくシフトです。またx℃とy℉の関係も、y=1.8x+32という数式で表されており、単純な比例になっていません。つまり0の点がずれているんですね。
ただ、これらに対応する必要はあるのですが、その他大勢の単位たちは今までの基準単位を経由した比例方式で簡単に換算することができるので、全部を変えてしまうのはデメリットが大きいでしょう。ということで、基本は今まで通りの変換係数方式で、そして上に挙げた5つの単位の時だけif文で見分けて個別の変換を行ってやる、ということにしたいと思います。
実際の変換はjavaで行っていますので、その部分を拡張しました。抜き出して以下に示します
変換ボタンのOnClickListener部分です。
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 入力欄に記入されたテキストを取得 input = editText.getText().toString(); // 取得したテキストを数値に変換 if (!input.equals("")) { inputValue = Double.parseDouble(input); } else { inputValue = 0; } if (categoryNumber==10) { // 角度の場合 if (idxi==6) { intermediateValue = Math.atan(inputValue/100); } else { intermediateValue = inputValue*convRatioInput; } if (idxo==6) { outputValue = 100*Math.tan(intermediateValue); } else { outputValue = intermediateValue/convRatioOutput; } } else if (categoryNumber==17) { // 温度の場合 switch (idxi){ case 0: intermediateValue = inputValue; break; case 1: intermediateValue = inputValue + 273.15; break; case 2: intermediateValue = (inputValue+459.67)/1.8; break; case 3: intermediateValue = inputValue/1.8; } switch (idxo) { case 0: outputValue = intermediateValue; break; case 1: outputValue = intermediateValue - 273.15; break; case 2: outputValue = intermediateValue*1.8 - 459.67; break; case 3: outputValue = intermediateValue*1.8; break; } } else { // その他のカテゴリーの場合 // 入力単位→出力単位に変換 outputValue = inputValue * convRatioInput / convRatioOutput; } // 変換した数値を文字列として出力エリアにセット textView2.setText(String.format("%.10g", outputValue)); } });
カテゴリーNo=10の「角度」の場合、インデックスidx*=6の場合のみatanを使った換算を行い、それ以外は換算係数を使って、一旦中間の基準単位に変換します。その後落ち着いて同じように基準単位から目的の単位に変換してやることにしました。
カテゴリーNo=17の「温度」の場合も考え方は同じです。こちらは4つの温度それぞれで異なる換算をしてやる必要がありますので、if文ではなくswitch文で対応する換算式に飛ばすようにしています。
これで機能的には完成しました。あとはまぁ飾りのようなものです。次回から一つ一つ、楽しみながらやっていくことにしましょう。
- 2016.01.04 Monday
- スマートフォン
- 23:04
- comments(0)
- -
- -
- by てちくん