3D LiveWallpaper概要

【APIの説明】

概要

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)を対して行います。

2D/3D切替

Home画面に配置されている2D/3D切替ボタンが押されると、イベントが通知されます。
そのイベントの情報に従って、3D表示モード切替、および、表示するコンテンツを切り替えてください。

StereoWallpaperService起動時には、現在の2D/3D状態を取得するI/Fをコールし、その情報に従って、2D/3D表示モード切替を行ってください。

3D飛び出し度設定

設定メニューからユーザの好みに合わせた3D飛び出し度を設定することができます。
[ランチャー]->[設定]->[サウンド&画像設定] /[表示]->[3D表示の飛び出し度]

この設定は、3D Game、MediaPlayerや、PictureViewなど3D立体視に対応したアプリケーション共通で参照しています。
プリインストールアプリケーション以外からも、この設定の値を取得できるようParallaxクラスのI/Fを公開しており、onCreate/onVisibilityChanged/onSurfaceChanged時に、3D飛び出し度設定情報を取得し、表示する際に反映するようにしてください。

Feature定義

StereoWallpaperService対応機は下記Feature定義により判定可能となります。

jp.co.sharp.android.stereo3dlcd.wallpaper

【パッケージ/クラス一覧】

パッケージ名 クラス名 備考
jp.co.sharp.android.stereo3dlcd StereoWallpaperService 3D立体視のWallpaperService
  Parallax 3D立体視表示の飛び出し度を取得する

【APIの使い方】

Manifestの記載について

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)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.package.name">
    <uses-feature android:name="jp.co.sharp.android.stereo3dlcd.wallpaper"/>
  ...
  <application android:name="MyApplication" >
    <uses-library android:name="jp.co.sharp.android.stereo3dlcd" />
    ...
  </application>
  ...
</manifest>

2D/3D切替方法について

StereoWallpaperServiceを拡張したクラスを作成し、その内部クラスEngineのメソッドsetStereoViewをコールします。
パラメータがtrueの場合、3D立体視表示になります。
Falseの場合、2D表示になります。

パッケージ名: jp.co.sharp.android.stereo3dlcd
クラス名: StereoWallpaperService.Engine
メソッド: public void setStereoView(boolean stereoOn)
引数: stereoOn true: 3D表示有効
false: 3D表示無効

例2)
import jp.co.sharp.android.stereo3dlcd.*;
 
public class MyWallpaper extends StereoWallpaperService {
    ...
    public Engine onCreateEngine() {
        return new StereoEngine(getResources());
    }
    ...
    public class StereoEngine extends Engine {
        public void onCreate(SurfaceHolder surfaceHolder) {
            super.onCreate(surfaceHolder);
            if (isStereoMode()) {
                setStereoView(true);
            } else {
                setStereoView(false);
            }
    ...
    

setStereoViewをコールしたあとに、画像データを描画します。
setStereoViewをコールすると、onSurfaceChangedが呼び出されるため、そのタイミングで描画することを推奨します。

SidebySide(Half)を描画

 SidebySide(Half)を描画する方法については、特に制限はありません。
下記のようにクリップをして描画することで実現できます。
OpenGLを使う場合、glViewportで描画範囲を設定することも可能です。

例3)

SurfaceHolder holder = getHolder();
Canvas canvas = holder.lockCanvas();
If (canvas == null) return;
canvas.clipRect( 0, 0, width/2, height);
canvas.drawBitmap(mImageHalf, x / 2, y, null);
/* 左目用のデータ描画 */
canvas.drawText("depth: " + d, x/2, y, p);
canvas.restore();
canvas.clipRect( width/2, 0, width, height);
canvas.drawBitmap(mImageHalf, (width / 2 + x / 2 + d ), y, null);
/* 右目用のデータ描画 */

例4)
gl.glViewport( 0, 0, w/2, h);
... /* 左目用のデータ描画 */
gl.glDrawElements( GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
... /* 右目用のデータ描画 */
gl.glViewport( w/2, 0, w/2, h);
gl.glDrawElements( GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);

2D/3D切替イベント通知について

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表示

例5)
private static final String ACTION_CHANGE_PARAM3D
    = "jp.co.sharp.android.wallpaper3d.ACTION_CHANGE_PARAM3D";

    public void onReceive(Context context, Intent intent) {
     if ((intent.getAction().equals(ACTION_CHANGE_PARAM3D))) {
      int type = intent.getIntExtra("Extra_3D_WallPaper_SettingType", 0);
      synchronized(mContext) {
       if (type == 1) {
        stereo3D = true;
        setStereoView(true);
       } else {
        stereo3D = false;
        setStereoView(false);
       }
      }
     }

また、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出力中は補正されます。

import jp.co.sharp.android.stereo3dlcd.*;
 
~飛び出し度設定の値を取得したい箇所で~
    float fParallax;
 
    Parallax mParallax = new Parallax();
    fParallax = mParallax.get3dDepthSettingsFl();

【その他の特記事項】

視差についての注意事項

  • 立体視画像を生成するときに気をつける点として、ユーザの目に優しいコンテンツを作成するために下記ガイドラインから限界視差1度程度が推奨されております。
    ガイドラインPDFへのリンク(P21 快適視差範囲'その1)
  • 壁紙をスクリーン面より飛び出すように(前方に)表示した場合、アイコン表示に違和感を感じる恐れがあります。
    アイコンと壁紙の飛び出た部分が重なった場合の見え方が違和感を感じます。
  • 実際の表示・動作は、移動機上での確認をお願いいたします。
  • デバック方法として、DDMSなどでScreen captureと取ることで、SidebySide(Half)データでの確認ができます。

StereoWallpaperService.Engine#setStereoViewの呼び出し制限事項

StereoWallpaperService.Engine#setStereoViewの呼び出しは、StereoWallpaperService.Engineのスレッドでコールする必要があります。
例えば、GLSurfaceView.RendererのonSurfaceCreated()、onSurfaceChanged()などからは呼び出さないでください。

StereoWallpaperServiceの変数について

ライブ壁紙を設定する際に、プレビューから壁紙に設定すると、StereoWallpaperServiceの内部クラスEngineは再生成されるため、StereoWallpaperServiceの変数は初期化されず、Engineは初期化されます。
状態管理をする場合などに注意が必要です。

その他 

・2D/3D切替に対応したHomeアプリケーションが設定されている場合のみ、3D表示が可能になります。