Androidアプリ開発初心者がkotlinでカラーピッカーを作ってみるよ! その14
どうも!LSSです!
今回は前回の続きで、履歴色を記録する部分を作っていきますよ!
- まず、仕様から!
- 新たに用意する、必要な変数
- MainActivity.ktの編集を始めます!
- 次に、パーツとなるfunを先に作ります!
- さて!本日のメインイベント!!タイマー処理を書いていきます!
- エミュレータにビルドしてみましょう
- 一応、現時点でのMainActivity.ktのコード全文、のっけておきます。
- 追記。
まず、仕様から!
- 一つめの「お気に入りの色」とは別に、数秒以上変更を加えなかった色は自動的に、それ用の履歴として記録する。
とは決まっていますが、もうちょっと煮詰めていきます!
- まず、「数秒以上」の部分は「10秒以上」とします。
- 判定に当たっては、0.1秒毎にループするタイマー処理を使用します。
- 処理実行時に、別途変数に記録しておいた「さっきの色」と、現在のcl[0]、cl[1]、cl[2]から算出した「現在の色」をifで比較します。
- 「さっきの色」と「現在の色」が同一だった場合、まずカウント用変数を+1します。
- さらに、カウント用変数が100に達した場合(10秒たった場合)、まず、「最後に記録した色」をSQLiteデータベースから読み込み、「最後に記録した色」を扱う変数に代入します。
- 「現在の色=さっきの色」と「最後に記録した色」をifで比較します。
- 「現在の色=さっきの色」と「最後に記録した色」が異なる場合、「さっきの色」を「最後に記録した色」変数に代入します。
- さらに「最後に記録した色」をSQLiteデータベースに記録します。
- カウント用変数に0を代入します。
- 6.のifで「同一」だった場合は何もしません。
- 4.のifで「同一でなかった」場合は、カウント用変数を0にし、「さっきの色」変数に、「現在の色」を代入します。
- 最後にifがどうであれ、次のループを呼び出して終わりです。
…と、こういう処理で考えている動作になりそうです。
こういうの、文章で書くと伝わるのに限界がありますね^^;
フローチャートみたいのを書くのがいいですね。
新たに用意する、必要な変数
「現在の色」 はcl[0]、cl[1]、cl[2]から算出するだけなので、今回は用意しません。
他に必要なものとして、
カウント用変数…「cnt」って名前でInt型変数を用意する事にします。
さっきの色…「lastcl」って名前でInt型変数を用意する事にします。
最後に記録した色…「lastrc」って名前でInt型変数を用意する事にします。
これだけでいけそうですね。
あとはタイマー処理にHandlerとRunnableが必要になるぐらいで。
MainActivity.ktの編集を始めます!
いつものように、MainActivity.ktの編集をしていきますね。
まず、変数の宣言ですが、今の変数宣言の最後がSQLoh0なので、その次の行ぐらいから始める事にします。
var lastrc=0
var lastcl=0
var cnt=0
の3行を追記します。
↑こんな感じですね。
次に、パーツとなるfunを先に作ります!
必要なものは2つ。
「COLORRCに記録する」
「COLORRCから最新の1色だけを取り出す」
です。
まず記録する部分から手をつけます。
…これも、前回の読み込みと同様、すでに書いた「COLORSVへの記録」と似たコードになるので、
以前に書いた、
fun btSave(v:View){
のあるあたりまで画面をスクロールします。
そしてその、
fun btSave(v:View){
val dbW=sqloh0.writableDatabase
val cldr=Calendar.getInstance()
var SQLstr=dbW.compileStatement("INSERT INTO COLORSV ( SV , SVTIME ) VALUES ( ? , ? )")
SQLstr.bindString(1,(cl[0]*256*256+cl[1]*256+cl[2]).toString())
SQLstr.bindString(2,cldr.timeInMillis.toString())
SQLstr.executeInsert()
}
を選択し、コピーします。
画面でいうと、↑こういう状態です。
で、それを、すぐあとにペーストします。
↑こうなります。
今回はこの2つあるうち、下のほうのものを、
「COLORRCに記録する」
用に書き換えていきます!
fun btSave(v:View){
val dbW=sqloh0.writableDatabase
val cldr=Calendar.getInstance()
var SQLstr=dbW.compileStatement("INSERT INTO COLORSV ( SV , SVTIME ) VALUES ( ? , ? )")
SQLstr.bindString(1,(cl[0]*256*256+cl[1]*256+cl[2]).toString())
SQLstr.bindString(2,cldr.timeInMillis.toString())
SQLstr.executeInsert()
}
書き換える部分を赤字で示すと↑の部分になります。
btSave(v:VIEW)…rcSave()に打ち換えます。
SV…3つともRCに打ち換えます。
(cl[0]*256*256+cl[1]*256+cl[2])…lastrcに打ち換えます。
以上で、「COLORRCに記録する」部分は完成!
画面は
こんな風になります。
続けて、
「COLORRCから最新の1色だけを取り出す」
部分を作ります。
これは前回作った、COLORRCの読み込み部分と似ているので、
この、
fun btRCTclk(v:View){
val dbR=sqloh0.readableDatabase
val cursor=dbR.rawQuery("select RC , RCTIME from COLORRC order by RCTIME desc",null)
for (i in 0..15){
if (cursor.moveToNext()){
btcl[i]=cursor.getInt(cursor.getColumnIndex("RC"))
btns[i].setBackgroundColor(255*256*256*256+btcl[i])
}else{
btcl[i]= 0
btns[i].setBackgroundColor(255*256*256*256)
}
}
cursor.close()
}
をまた、コピーし、ペーストします。
↑こうなります。
さて、今度は上のほうのやつを書き換える事にします!
fun btRCTclk(v:View){
val dbR=sqloh0.readableDatabase
val cursor=dbR.rawQuery("select RC , RCTIME from COLORRC order by RCTIME desc",null)
for (i in 0..15){
if (cursor.moveToNext()){
btcl[i]=cursor.getInt(cursor.getColumnIndex("RC"))
btns[i].setBackgroundColor(255*256*256*256+btcl[i])
}else{
btcl[i]= 0
btns[i].setBackgroundColor(255*256*256*256)
}
}
cursor.close()
}
今度は、
「バッサリ削除する分を緑字+取り消し線」
「書き換える部分を赤字」
で示してみました。
まず、緑部分をバッサリ削除してしまってから…
btRCTclk…lastrcLoadに打ち換えます。
desc"…cと"の間に、まずスペースを一つ開けてからlimit 1を追記します。
desc limit 1"
となります。
Next…Firstに打ち換えます。
btcl[i]…2つともlastrcに打ち換えます。
以上です!
画面は、
こんな感じになります。
さて!本日のメインイベント!!タイマー処理を書いていきます!
パーツの用意が出来たところで、いよいよ、それらを利用するタイマー処理の部分を書いていきます!
タイマーについては以前、こちらの記事でも書きましたので、良かったら見てください^^
画面はまた、最初に変数宣言したあたりまでスクロールで戻しておきます。
この、cntの後に続けて書いていきますね。
まずは、
var hnd0=Handler()
と入力します。が、途中で、
こんな候補が出てくるので、Handler複数ありますが、ここはとりあえず(android.os)とつくものを選択しておきます。
補完されたHandlerには()がついていなかったので、付け足しておきます。
続けて、
var rnb0=object : Runnable{
override fun run() {
if (cl[0]*256*256+cl[1]*256+cl[2]==lastcl){
cnt++
if(cnt>=100){
lastrcLoad()
if(lastcl!=lastrc){
lastrc=lastcl
rcSave()
cnt=0
}
}
}else{
cnt=0
lastcl=cl[0]*256*256+cl[1]*256+cl[2]
}
hnd0.postDelayed(this,100)
}
}
…を、ちょっと長いですがガシガシと打ち込みます。
※今回の記事の冒頭の1~12をkotlinに翻訳するとこんな感じになります。
最後の
hnd0.postDelayed(this,100)
で、2回目以降、100ミリ秒ごとに再度処理されるのですが、一番最初の起動がまだ書いていないので、
onCreate内、最後のRedraw()を呼び出している後にでも続けて、
hnd0.post(rnb0)
と、追加しておきます。
あ、それと!
コード最下部、
override fun onDestroy() {
sqloh0.close()
super.onDestroy()
}
の中に、
hnd0.removeCallbacks(rnb0)
を追記しておきましょう。
↑こんな感じで。
以上で、完成!!です!
エミュレータにビルドしてみましょう
- シークバーで適当に色を選んで、
- 10秒ぐらい、その色のまま置いておき、
- 「最近みた色」ボタンを押すと、勝手にそこに記録されているのが確認できれば成功です!
やー、前後編に分かれて、結構なボリュームのコードを書いたような気がしますが、実際はそれほどでもないんですね^^;
一応、現時点でのMainActivity.ktのコード全文、のっけておきます。
MainActivity.kt
package jp.littlestrangesoftware.a20190919colorselect |
以上で、「最近みた色」機能の追加の説明を終わります!!
読んでくださった方、ありがとうございます!
また次回も、よろしくお願いしますね^^
追記。
それにしても…なんだかむしょうに疲れました^^;
↑こういうの欲しい!w
ハンディマッサージャー以上、電気マッサージ椅子以下、といった価格帯ですねぇ。
この価格設定もまた気になりますw