梅の花とうぐいす
2012.03.11 等々力公園、梅の花とうぐいす

  1. 自由研究メイン
  2. Menu表示

AppWidget AnalogClockで世界時計

AnalogClock widgetを使って世界時計をどのように作るのか考えてみます。2つの時計を並べて、時差のある国の表示をしてみます。
例として、日本とロンドン(時差-9時間分)の時計を並べてみます。

AnalogClock Widget

Fig.1 世界時計表示画面

AppWedgetを作ると、下図のようにウィジェット(ここではWorldClock)が作られます。

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