Androidでミラクルライト #cure_advent

この記事はプリキュアアドベントカレンダー24日目の投稿です。

プリキュアのお陰で日曜日だけは早起きできるw
レジーナ・キュアエース……二人は一体どんな関係なんだ(棒読み)

さて、クリスマスイブの投稿なのにクリスマスネタ何もなくてごめんなさい…
自分はプログラマなのでプログラムネタで!(しかも時間なくてやりたいことできてないけど…)

プリキュアの映画に行くと小さなお友達はミラクルライトという応援アイテムをもらえるが大きなお友達はもらえない。
映画が始まる前にプリキュアたちからの注意としてライトの扱い方を説明されるがそのなかで「ライトを持ってないお友達は心のなかで応援してね」とあるが、小さのお友達=もってる、つまり持ってない人=大きなお友達向けの注意である。

とはいってもみんなといっしょに応援したいのでスマホで実装してみた。
本当はXamarinForAndroid使ったりライト振ったときにTwitterに応援メッセージ送信とかしたかったんだけど先週仕事をミスして3連休潰れてしまったのでミラクルライトの基本的な要件、ボタン(画面)を押下すると点灯する、プリキュアの応援ができるということだけを実装

まずは一つ目の要件、ライトの点灯
最初、カメラのフラッシュの方を点灯させようかなと思ったけどまぶしすぎるので、画面を白くする方向で
タッチの検出はActivityのOnTouchEventをオーバーライドする。
下記のように実装

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            isBright = true;
            layout.setBackgroundColor(Color.WHITE);
            
            break;
        case MotionEvent.ACTION_UP:
            isBright = false;
        	layout.setBackgroundColor(Color.BLACK);
            break;

        }
        return true;
    }

これでタッチした時に画面が明るくなる。

次にプリキュアの応援
上に書いたとおりここは本当はTwitter4J使ってツイートしたかったんだけど間に合わなかった…
年明けまでには追記で書きたい!
とりあえず今回やったことは画面が点灯状態の時端末を振ったらToastメッセージで応援メッセージが表示されるというもの
シャカシャカ振ってるのを検知するイベントの実装を調べていたらいくつかサンプルが会ったので下記のものを拝借した。
http://www.grandnature.net/blog/archives/2009/02/android_2.html
ただ、加速度センサー周りのAPIが昔と今で違うみたいで警告が出る。
今回はそのまま使ったけど、最新のAPIに対応させたほうがいいかも
ということで必要な部分だけを抜き出した。

ソースのうちの実際にシャカシャカを検知する部分のソース

    public void onSensorChanged(int sensor, float[] values) {
        switch(sensor) {
        case SensorManager.SENSOR_ACCELEROMETER:
            // 傾き(ハイカット)
            currentOrientationValues[0] = values[0] * 0.1f + currentOrientationValues[0] * (1.0f - 0.1f);
            currentOrientationValues[1] = values[1] * 0.1f + currentOrientationValues[1] * (1.0f - 0.1f);
            currentOrientationValues[2] = values[2] * 0.1f + currentOrientationValues[2] * (1.0f - 0.1f);
            // 加速度(ローカット)
            currentAccelerationValues[0] = values[0] - currentOrientationValues[0];
            currentAccelerationValues[1] = values[1] - currentOrientationValues[1];
            currentAccelerationValues[2] = values[2] - currentOrientationValues[2];
            // 振ってる? 絶対値(あるいは2乗の平方根)の合計がいくつ以上か?
            float targetValue = 
                Math.abs(currentAccelerationValues[0]) + 
                Math.abs(currentAccelerationValues[1]) +
                Math.abs(currentAccelerationValues[2]);
            if(targetValue > 30.0f && isBright) {
                Toast.makeText(this, "プリキュアがんばれー", Toast.LENGTH_LONG).show();
                }
            break;
        case SensorManager.SENSOR_ORIENTATION:
            break;
        default:
        }
    }

反応するしきい値がサンプルのままだと過敏に反応しすぎたので、少し値は調整した。
とりあえず今回はここまでです。
実際に起動して端末を振ると下記のようになります。
絵を描く能力がないので寂しい背景ですが……
Screenshot_2013-12-23-23-20-39

もちろん、映画館では迷惑になるので携帯をぶん回したりしないでね!
家でクリスマスプリキュア映画鑑賞会とかやるときに使ってください。

それではみなさん、メリークリスマス!
(もうちょっと綺麗に整形して機能追加したらGitHubにあげる)

コメント

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