ラベル SurfaceView の投稿を表示しています。 すべての投稿を表示
ラベル SurfaceView の投稿を表示しています。 すべての投稿を表示

2014年1月18日土曜日

[Android] アナログ時計アプリをライブ壁紙に改造する

The analog clock on the live wallpaper
前回 SurfaceViewで作成したアナログ時計アプリをライブ壁紙として改造てみました。
ライブ壁紙のAPIはSurfaceViewにそっくりです。
ソースコードを丸ごと流用できるわけではありませんが、SurfaceViewで開発したアプリはライブ壁紙に移植しやすいです。

針の画像です。128×128ピクセルです。
左から秒針、分針、時針のつもりです。
針の画像それぞれのピクセル数は32×128です。一番右の黒い塗りつぶしの領域は使用しません。

Eclipseのパッケージ・エクスプローラーで、プロジェクトの res フォルダーの下に
drawable-nodpi
というフォルダーを作り針の画像を配置します。

解像度ごとに大きさを合せた針の画像を用意したほうがいいかもしれません。

今回の開発環境は次の通りです。
・64bit版 Windows8
・32bit版 Eclipse3.7 (Windows XPモードで使用)
・Android-SDK r22.3

ライブ壁紙の対応OSはAndroid2.1以上なのでSDKの最小バージョンは7以上にする必要があります。

ライブ壁紙はXMLによるメタデータが必要です。
Eclipseのパッケージ・エクスプローラーで res フォルダーの下に xml というフォルダーを作り、メタデータのファイルを保存します。
メタデータファイル(res/xml/wallpaper.xml)

ライブ壁紙のソース(WallpaperSasmple.java)

マニフェスト(AndroidManifest.xml)

エミュレーターで動作させたスクリーンショットです。
動作保証は出来ませんがこのようになると思います。
ライブ壁紙なので、ショートカットアイコンやウィジットより後ろに重ねて表示されます。

関連ブログ
[Android] SurfaceViewのアナログ時計アプリ
[Android] アナログ時計のアプリを作ってみました
[Android] アナログ時計のアプリをC/C++で改良
[Android] ストップウォッチアプリを作ってみました
[Android] ストップウォッチアプリの表示をC言語でスムーズに改造する
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] Javaのstaticクラスから非sataticメソッドを呼び出すには
[Android] OpenGLの簡易画像ビュアーにSDカード内の画像を表示する
[Windows8][Android] EclipseをXP互換モードで起動する理由(Can't bind to local 8600 for debugger)
[Android] Android-SDKでやってはいけないこと
[Android] Toastに画像やボタンを表示するには
[Android] ライブ壁紙の作り方
[Android] Activityに時計を表示する(Activityの非同期更新)
[Android] Webコンテンツを強制的に表示するには
[Android] Toastをcancelするには

以上、参考になれば幸いです。

2014年1月11日土曜日

[Android] SurfaceViewのアナログ時計アプリを作ってみました

The analog clock application on SurfaceView
前々回 前回 のアナログ時計のアプリをSurfaceViewで表示するように作り直してみました。
OpenGLよりSurfaceViewのほうがずっと簡単です。

今回の開発環境は次の通りです。
・64bit版 Windows8
・32bit版 Eclipse3.7 (Windows XPモードで使用)
・Android-SDK r22.3

針の画像です。
左から秒針、分針、時針のつもりです。
針の画像それぞれのピクセル数は32×128です。一番右の黒い塗りつぶしの領域は使用しません。

Eclipseのパッケージ・エクスプローラーで、プロジェクトの res フォルダーの下に
drawable-nodpi
というフォルダーを作り針の画像を配置します。

以下ソースです。

アクティビティ(MainActivity.java)

MyHandlerクラスでループ処理の頻度を制御しています。
設定次第でループ処理を減らせるのでOpenGLで作った場合にに比べるとバッテリーの持ちをよくする効果が期待できます。
MyHandlerクラスのINTERVALという定数の数値を大きくすればループ処理を減らせます。
ただし、INTERVALの数値を大きくしすぎると針が指す時刻と実際の時刻の誤差が大きくなります。

320×480ピクセルのエミュレーターで実行するとこんな感じになります。

OpenGLのアプリは画像の大きさを画面サイズに対して相対的に指定できましたが、SurfaceViewは絶対値で指定する必要があります。
1024×640の画面で実行すると下のようになります。
各針の画像の絶対的な大きさは変わらないのですが、画面が広くなった分小さく見えてしまいます。
解像度ごとに大きさを合せた針の画像を用意するか、Canvasクラスのscaleメソッドで画面サイズに合わせて拡大するといいかもしれません。

関連ブログ
[Android] アナログ時計のアプリを作ってみました
[Android] アナログ時計のアプリをC/C++で改良
[Android] ストップウォッチアプリを作ってみました
[Android] ストップウォッチアプリの表示をC言語でスムーズに改造する
[Android] 方位センサーを使ってコンパスアプリを作る
[Android] Javaのstaticクラスから非sataticメソッドを呼び出すには
[Android] OpenGLの簡易画像ビュアーにSDカード内の画像を表示する
[Windows8][Android] EclipseをXP互換モードで起動する理由(Can't bind to local 8600 for debugger)
[Android] Android-SDKでやってはいけないこと
[Android] Toastに画像やボタンを表示するには
[Android] ライブ壁紙の作り方
[Android] Activityに時計を表示する(Activityの非同期更新)
[Android] Webコンテンツを強制的に表示するには
[Android] Toastをcancelするには

以上、参考になれば幸いです。

2013年8月17日土曜日

[Android] 方位センサーを使ってコンパスアプリを作る

How to use the orientation sensors
方位センサーを使って針の画像が北を指し示すアプリを作ってみました。

なお、このアプリが動作する条件は方位センサーを持つAndroid端末に限ります
中華PadのONDA Vi30には方位磁石センサーはありませんでした。

方位磁石らしさを演出するため針の画像を用意しました。
この画像をプロジェクトの
res - drawable-mdpi
のフォルダーにコピーします。
今回のアプリは針が常に北に向く様に画像を回転表示させるのでSurfaceViewを使います。

このブログを書いている時点の開発環境は次の通りです。
・Windows8 (64bit)
・Eclipse Juno (32bit) (XP互換モードで起動)
・Android SDK r22.0.1

MainActivity.java (Activity)
※特別な権限(Permission)は不要なのでマニフェストは省略します。
Android2.2以降で動作します。
Target SDK Version が8以上の設定でビルドできます。

ドコモのSH-03Cで動作確認しました。
実行するとこんな画面になるかと思います。
Android端末の向きを変えても針は北を指し続けます。
磁石(磁性体)を近づけても反応します。
ただし、端末本体の傾きは考慮してないので端末を立たせると矢印は正しい方向を向かないかもしれません。


関連ブログ
[Android] Javaのstaticクラスから非sataticメソッドを呼び出すには
[Android] OpenGLの簡易画像ビュアーにSDカード内の画像を表示する
[Windows8][Android] Can't bind to local 8600 for debugger
[Android] Android-SDKでやってはいけないこと
[Android] Toastに画像やボタンを表示するには
[Android] ライブ壁紙の作り方
[Android] Activityに時計を表示する(Activityの非同期更新)
[Android] Webコンテンツを強制的に表示するには
[Android] Toastをcancelするには

以上、参考になれば幸いです。

2010年12月30日木曜日

[Android] SurfaceviewにToastを表示するには

How to show Toast when a SurfaceView is being shown

ToastはActivityだけではなく、SurfaceViewでも表示できます。
ただしToastはContextオブジェクトを必要とするのでちょっと工夫します。
SurfaceViewにToastを実装する前のコードがこちらです。

マニフェスト(AndroidManifest.xml)


Main.java (Activity)


MySurfaceView.java (SurfaceView)


このコードを端末を回転させるたびにToastを表示させるように改造します。
回転のたびに呼び出されるSurfaceViewのonSizeChangedメソッドでToastを表示する方法を2つあげてみました。

1,コンストラクターのcontextを使う
2,ActivityのインナークラスにしてgetApplicationContext()を使う

1,コンストラクターのcontextを使う

1つ目の方法は、SurfaceViewがコンストラクターで受け取ったcontextをToastに渡す方法です。
MySurfaceView.java (SurfaceView) のみを改造します。


これで画面を回転するたびにToastが表示されるようになりました。
エミュレーターなら左のCtrl+F12で検証できます。

2,SurfaceViewクラスをActivityクラスのインナークラスにして、ActivityクラスのgetApplicationContext()を使う

2つめの方法はMain.java (Activity) のみを改造します。
Activityクラスの内部にSurfaceViewクラスを定義します。


この改造も動作は1と同じです。
この方法はSurfaceViewクラスからActivityクラスのメンバーにアクセスできます。
ただし、SurfaceViewを他のActivityから起動することが難しくなります。

関連ブログ

[Android] Toastをcancelするには

キーワード
Toast Activity SurfaceView getApplicationContext() onSizeChanged

以上、参考になれば幸いです。

SurfaceViewにToastを表示する「Eye元気!/Vigorous eyes!」公開中です!