
2012.03.11 等々力公園、梅の花とうぐいす
- 自由研究メイン
- Menu表示
AppWidget AnalogClockで世界時計
AnalogClock widgetを使って世界時計をどのように作るのか考えてみます。2つの時計を並べて、時差のある国の表示をしてみます。
例として、日本とロンドン(時差-9時間分)の時計を並べてみます。

Fig.1 世界時計表示画面
AppWedgetを作ると、下図のようにウィジェット(ここではWorldClock)が作られます。

Fig.2 WorldClock widgetのアイコン
ここでの作り方を説明します。(ただし正当法かどうかは不明です)
予備知識
・AnalogClock.javaのソースファイルにて手をいれるのは難しそう
・短針、長針の図は指定出来る
・短針、長針の図はそれぞれ1時間ごと、1分毎に回転して表示されている
・時計widgetは2つ以上並べることができる
時差を作るには
・短針、長針の図の初期値を時間差分だけ回転させる
Widgetの大きさは?
大きさは参考サイト(2)で規定しているようです。この作法に従わないといろいろのwidgetサイズが出来てしまい、並べたときの見栄えが悪くなってしまいます。このサイトで作ったwidgetサイズはこの作法に従っていませんので、公開する時は作法に従ったサイズにしましょう。
<参考サイト>
(1)Android example source code file (AnalogClock.java)
(2)android Developers guide ,App Widgets
(3)アンドロイドな日々、アナログ時計 Analog Clock
(4)2011-04-28 アナログ時計のウィジェットの作り方 Android開発覚書
(5)ウィジェットの作り方,TechFirm
(6)Android AppWidget,Y.A.M の 雑記帳
上記方針で進めてみます
図の回転方法やDigitalClockについては追って試みていきます。
・appwidget.xml
・main.xml
・HelloAndroidWidgetProvider.java
・AndroidManifest.xml
//////////////////////////////////////////////////////////
/////////// appwidget.xmlファイル///////////////////////////////////
大きさの制限があるといわれているが、もっと小さい数字でも動いています
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="110dp"
android:minHeight="56dp"
android:initialLayout="@layout/main"
android:updatePeriodMillis="0">
</appwidget-provider>
/////////////////////////////////////////////////////////
/////////// maint.xmlファイル///////////////////////////////////
AnalogClockwidgetを並べてみます。短針、長針の図をよういします。
ロンドン用なので9時間遅らせて保存(回転させて保存しました、これはのちほどプログラムで回転させていきたいと思います)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#000000">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<AnalogClock
android:id="@+id/AnalogClock"
android:layout_width="wrap_content"
android:layout_height="55dp"/>
<AnalogClock
android:id="@+id/AnalogClock2"
android:layout_width="fill_parent"
android:layout_height="55dp"
android:dial="@drawable/dial"
android:hand_hour="@drawable/hour"
android:hand_minute="@drawable/minute" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" 東京" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ロンドン "
android:gravity="right"/>
</LinearLayout>
</LinearLayout>
///////////////////////////////////////////////////////////
/////////// AndroidManifest.javaファイル///////////////////////////////////
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="worldclock.widget"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".HelloAndroidWidgetProvider"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget" />
</receiver>
</application>
</manifest>
AppWidget AnalogClockの初期値設定
時差を与えるために、初期値設定を考えます。ここでは、単純に設定するだけです。本格的に作るつもりなら、UTC時刻やサマータイム・・など気になるでしょうが。
方針
・TexBoxで初期値を与える
・Widgetをクリックしたときに設定ダイアログが開く
・短針、長針を初期値分だけ回転させて保存する
⇒これには問題がありそうです。短針のデータはリソースでSDKではres>drawable配下に保存されています。しかしながら、リソースファイルを上書きが出来るとは思いません。SDKでデータを保存すると、DDMSのDEVICE>File Explorer で見ることのできる、(ローカルファイルは)data/data/(パッケージ名)/files/(ファイル名)に造られてしまいます。
ローカルファイルをリソースとして参照出来ればいいのですが、どうなのでしょうか?
・これによって、システム(android)時刻に時差が作れそう
(この先は不明です、少々保留に)
⇒Home Screenで動いているwidgetをRemoteviewでリソースを回転させることはできないと、他のサイトに書かれています。
時差は30分単位ですので、その分のリソースファイルを持てばいいと書いてあります。それでいいですかね。
すなわち、こんな感じでしょうか、確認してませんが、ご了承ください。
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.main);
contentView.setImageViewResource(R.id.AnalogClock, clockimage);
その後-
Then get an instance of AppWidgetManager, and call manager.updateAppWidget(appWidgetId, remoteView).
参考サイト
(1)AppWidgetを指定した時間に実行するには,Androidで動く携帯Javaアプリ作成入門(10)
(2)AppWidgetでのonClickの取り方, sFutures
(3) AppWidget onClick時にIDを渡す, sFutures