OBONO’s Diary

へっぽこプログラマの戯言

Dice Widget

勢いで作った、サイコロを振るだけのホームウィジェットGoogle Play に登録してみた。(公開サイト)

サイコロを振るアプリは既に沢山登録されてるんだけど、サイコロを振るためだけにいちいちアプリを起動するのも、なんだかバカらしいんだよね。なので、ホームウィジェットで処理を完結させるというコンセプトで作ってみたのがコレ。
日本語の場合、設定画面の色の表現がかなり意味不明になっちゃってるけど、まぁ、気にしないでやってください。


思いの外苦労したのが、サイコロを振るアニメーションと、ウィジェットの二重起動防止。アニメーションについては、当初はもっと滑らかなアニメーションを考えていたんだけど、どうにも上手い方法が見つからず、結局のところ、透明の View を表示/非表示を繰り返して、上下にガチャガチャ動くだけのしょぼいものに仕上がってしまった。Xperia arc のミュージックプレイヤーウィジェットはぬるぬるアニメーションしてるんだけど、あれはどうやって実現してるんだ?
二重起動の防止についても、Google 先生に聞いてもなかなか直接的な回答が得られず、いろいろと試行錯誤した結果、setResult() してすぐ finish() するだけの設定用 Activity を用意して、AppWidgetManager の getAppWidgetIds() で得られる配列が2個以上なら…という判定で解決できた。具体的にはこんな感じ。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    if (AppWidgetManager.ACTION_APPWIDGET_CONFIGURE.equals(intent.getAction())) {
        int ret = RESULT_OK;
        if (AppWidgetManager.getInstance(this).getAppWidgetIds(
                new ComponentName(this, MyWidgetProvider.class)).length >= 2) {
            Toast.makeText(this, "二重起動", Toast.LENGTH_LONG).show();
            ret = RESULT_CANCELED;
        }
        setResult(ret, new Intent().putExtras(intent.getExtras()));
        finish();
    }
}

という事で、興味のある人は是非ともダウンロードして使ってみてくんなませ。