3D LiveWallpaperは、3D立体視コンテンツを表示できるようにAndroid標準LiveWallpaperに3D立体視制御機能を追加しています。
この機能を追加することで3D立体視コンテンツをHome画面に設定することができます。
3D LiveWallpaperは、Android標準のWallpaperServiceを拡張したクラスStereoWallpaperServiceを使います。
3D立体視の画像形式は、Side-by-Side(Half)のデータを描画する必要があります。
Side-by-Side(Half)とは、左右両眼用の画像を1/2に圧縮したものを横に並べて1枚のフレームを形成し、再生時に伸長することにより3D立体視映像となります。
左側が左目用、右側が右目用の画像になります。
SidebySide(Half)データを準備する場合、どのような手法があるか例を記載します。
(静止画、動画、OpenGLなどでもにつかえる例であり、特に方法を制限するものではありません。)
a) SidebySide(Half)データを準備し、画面サイズにあわせて拡大・縮小等を行い、描画する。
b) 右目用と左目用の画像をそれぞれ準備しておき、画面サイズに対して横幅1/2にリサイズし並べて描画する。
c) 1枚の画像を横幅1/2に縮小し、視差を出すために少しずらして並べて描画する。
(気をつける点)
センタリングする場合、全画面に対して行うと、期待する画像が表示されません。
右図のようにSidebySide(Half)を対して行います。
Home画面に配置されている2D/3D切替ボタンが押されると、イベントが通知されます。
そのイベントの情報に従って、3D表示モード切替、および、表示するコンテンツを切り替えてください。
StereoWallpaperService起動時には、現在の2D/3D状態を取得するI/Fをコールし、その情報に従って、2D/3D表示モード切替を行ってください。
設定メニューからユーザの好みに合わせた3D飛び出し度を設定することができます。
[ランチャー]->[設定]->[サウンド&画像設定] /[表示]->[3D表示の飛び出し度]
この設定は、3D Game、MediaPlayerや、PictureViewなど3D立体視に対応したアプリケーション共通で参照しています。
プリインストールアプリケーション以外からも、この設定の値を取得できるようParallaxクラスのI/Fを公開しており、onCreate/onVisibilityChanged/onSurfaceChanged時に、3D飛び出し度設定情報を取得し、表示する際に反映するようにしてください。
StereoWallpaperService対応機は下記Feature定義により判定可能となります。
jp.co.sharp.android.stereo3dlcd.wallpaper
パッケージ名 | クラス名 | 備考 |
---|---|---|
jp.co.sharp.android.stereo3dlcd | StereoWallpaperService | 3D立体視のWallpaperService |
Parallax | 3D立体視表示の飛び出し度を取得する |
StereoWallpaperServiceを含むパッケージを使うため、Manifestに下記 <uses-library> を記載する必要があります。
なお、<uses-feature>を設定することにより、3D LiveWallpaper機能に対応した弊社端末以外でGoogle Playにアクセスした場合に表示されないようになります。
<uses-library android:name="jp.co.sharp.android.stereo3dlcd"/>
<uses-feature android:name="jp.co.sharp.android.stereo3dlcd.wallpaper"/>
例1)
StereoWallpaperServiceを拡張したクラスを作成し、その内部クラスEngineのメソッドsetStereoViewをコールします。
パラメータがtrueの場合、3D立体視表示になります。
Falseの場合、2D表示になります。
パッケージ名: | jp.co.sharp.android.stereo3dlcd | |
クラス名: | StereoWallpaperService.Engine | |
メソッド: | public void setStereoView(boolean stereoOn) | |
引数: | stereoOn | true: 3D表示有効 false: 3D表示無効 |
setStereoViewをコールしたあとに、画像データを描画します。
setStereoViewをコールすると、onSurfaceChangedが呼び出されるため、そのタイミングで描画することを推奨します。
SidebySide(Half)を描画する方法については、特に制限はありません。
下記のようにクリップをして描画することで実現できます。
OpenGLを使う場合、glViewportで描画範囲を設定することも可能です。
例3)
Intent受信により2D/3D切替を行います。下記にIntentの定義と実装例を記載します。
インテント定義 : jp.co.sharp.android.wallpaper3d.ACTION_CHANGE_PARAM3D
引数 : Extra_3D_WallPaper_SettingType
値 : | int型 StereoWallpaper.Engine.STEREO_MODE_ON:3D表示 StereoWallpaper.Engine.STEREO_MODE_OFF:2D表示 |
また、StereoWallpaperService起動時に下記I/Fにて最新の2D/3D状態を取得し、切り替える必要があります。
パッケージ: jp.co.sharp.android.stereo3dlcd
クラス: StereoWallpaperService.Engine
メソッド: public boolean isStereoMode()
※実装例は例1)を参照お願いします。
下記I/Fにより3D飛び出し度設定の値が取得可能です。
この値は、[ランチャー]->[設定]->[サウンド&画像設定]/[表示]->[3D表示の飛び出し度]に対応した設定の値になります。
パッケージ名: jp.co.sharp.android.stereo3dlcd
クラス名: Parallax
メソッド: public float get3dDepthSettingsFl()
戻り値は、0.00f~1.00fの間になり、1.00fが一番飛び出た状態となります。
デフォルト設定は、1.00fになります。
移動機の設定が4段階の場合は、下記のような値が戻されます。
・強(default) ⇒ | 1.00f |
・中 ⇒ | 0.66f |
・弱 ⇒ | 0.33f |
・微弱 ⇒ | 0.00f |
この値をonCreate/onVisibilityChanged/onSurfaceChanged時に取得し、飛び出し度に反映してください。
※解像度の違いからHDMI出力中は補正されます。
StereoWallpaperService.Engine#setStereoViewの呼び出しは、StereoWallpaperService.Engineのスレッドでコールする必要があります。
例えば、GLSurfaceView.RendererのonSurfaceCreated()、onSurfaceChanged()などからは呼び出さないでください。
ライブ壁紙を設定する際に、プレビューから壁紙に設定すると、StereoWallpaperServiceの内部クラスEngineは再生成されるため、StereoWallpaperServiceの変数は初期化されず、Engineは初期化されます。
状態管理をする場合などに注意が必要です。
・2D/3D切替に対応したHomeアプリケーションが設定されている場合のみ、3D表示が可能になります。