Androidのライブ壁紙としてアニメーションgifファイルを設定することは可能ですか?

私はAndroidプラットフォームが初めてです。私はライブ壁紙のアプリケーションを開発したいと思います。私は検索エンジンでこれについて検索されたとき、彼らのコード( SurfaceView Canvas を使用して)これにはあまり気づいていません。ここで私の疑いは、ライブ壁紙として.gif画像を設定することが可能です。

22
@ジェンス:あなたのリプレイのおかげで、もしあなたがこれを行う方法のサンプルコードがあれば、
追加された 著者 Aerrow,
私はこれのように使用しましたが、通常のJPEG画像のように見える壁紙として.gif画像を設定しました。アニメ化されていない
追加された 著者 Aerrow,
この回答にはを参照
追加された 著者 Jens,
さて、これは方法
追加された 著者 Jens,

1 答え

これはアニメーションGIFを表示するためにハッキングされた基本的な壁紙サービス(ライブ壁紙チュートリアルで提供されている)です。

First - create a project & set up your manifest as a Live wallpaper.
Then - download a gif, like this one
   nyan nyan

Save that gif in res/raw/nyan.gif in your project.
Create a live wallpaper service, like shown in this example.

public class NyanNyanService extends WallpaperService {
    static final String TAG = "NYAN";
    static final Handler mNyanHandler = new Handler();

    /**
     * @see android.service.wallpaper.WallpaperService#onCreate()
     */
    @Override
    public void onCreate() {
        super.onCreate();
    }

    /**
     * @see android.service.wallpaper.WallpaperService#onCreateEngine()
     */
    @Override
    public Engine onCreateEngine() {
        try {
            return new NyanEngine();
        } catch (IOException e) {
            Log.w(TAG, "Error creating NyanEngine", e);
            stopSelf();
            return null;
        }
    }

    class NyanEngine extends Engine {
        private final Movie mNyan;
        private final int mNyanDuration;
        private final Runnable mNyanNyan;
        float mScaleX;
        float mScaleY;
        int mWhen;
        long mStart;

        NyanEngine() throws IOException {
            InputStream is = getResources().openRawResource(R.raw.nyan);
            if (is != null) {
                try {
                    mNyan = Movie.decodeStream(is);
                    mNyanDuration = mNyan.duration();
                } finally {
                    is.close();
                }
            } else {
                throw new IOException("Unable to open R.raw.nyan");
            }

            mWhen = -1;
            mNyanNyan = new Runnable() {
                public void run() {
                    nyan();
                }
            };
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            mNyanHandler.removeCallbacks(mNyanNyan);
        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            super.onVisibilityChanged(visible);
            if (visible) {
                nyan();
            } else {
                mNyanHandler.removeCallbacks(mNyanNyan);
            }
        }

        @Override
        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            super.onSurfaceChanged(holder, format, width, height);
            mScaleX = width/(1f * mNyan.width());
            mScaleY = height/(1f * mNyan.height());
            nyan();
        }

        @Override
        public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
                float yOffsetStep, int xPixelOffset, int yPixelOffset) {
            super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
            nyan();
        }

        void nyan() {
            tick();
            SurfaceHolder surfaceHolder = getSurfaceHolder();
            Canvas canvas = null;
            try {
                canvas = surfaceHolder.lockCanvas();
                if (canvas != null) {
                    nyanNyan(canvas);
                }
            } finally {
                if (canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
            mNyanHandler.removeCallbacks(mNyanNyan);
            if (isVisible()) {
                mNyanHandler.postDelayed(mNyanNyan, 1000L/25L);
            }
        }

        void tick() {
            if (mWhen == -1L) {
                mWhen = 0;
                mStart = SystemClock.uptimeMillis();
            } else {
                long mDiff = SystemClock.uptimeMillis() - mStart;
                mWhen = (int) (mDiff % mNyanDuration);
            }
        }

        void nyanNyan(Canvas canvas) {
            canvas.save();
            canvas.scale(mScaleX, mScaleY);
            mNyan.setTime(mWhen);
            mNyan.draw(canvas, 0, 0);
            canvas.restore();
        }
    }
}

これは、基本的にnyan-nyan catをスクリーンに合わせて永久にアニメーション化します。

ライブ壁紙のマニフェストは、このようなものです(この例には設定作業が含まれていません):

<?xml version="1.0" encoding="utf-8"?>

    
     
        
            
                
            
            <meta-data android:name="android.service.wallpaper" android:resource="@xml/nyan" />
        
    

AndroidManifest.xmlには、 res/xml (この場合は「nyan.xml」という名前のファイル)への参照があります。

<?xml version="1.0" encoding="utf-8"?>

45
追加された
「映画」クラスとは何ですか? GIFアニメーションだけでなく、あらゆる種類のビデオファイルについてですか?私が見いだしたのは、それがかなり空のドキュメントです: developer.android.com /reference/android/graphics/Movie.html 同じコードを使用して、ライブ壁紙の他のビデオファイルを表示することができますか?
追加された 著者 android developer,
追加された 著者 moDev,
大きな説明のため+1。 GIFイメージの代わりにビデオを再生できますか?はい、どうすればいいですか?
追加された 著者 Hardik Joshi,
それは実行されましたが、私のコンソールショーでは、画面には何も出力されません(pid = 7019、uid = 2000)、cat = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp = test.anim/.NyanNyanService} android.permission.BIND_WALLPAPER
追加された 著者 Aerrow,
Mr.Jens、貴重な投稿に感謝します。
追加された 著者 Aerrow,
私はマニフェストファイルを間違えてしまったと思います。マニフェストファイルを投稿してください。
追加された 著者 Aerrow,
私はonsteadビデオを使用することはできますか?
追加された 著者 Ali,
どんなニャン猫gifsでも私から+1が得られます。
追加された 著者 Gerald Kaszuba,
こんにちは...この素敵なバットいくつかの時間より多くの1 GIFファイルとその時間は、コードは、多くの問題を試してみてください
追加された 著者 Android,
hm。はい、BIND_WALLPAPER権限(システムアプリケーションのために予約されています)を持たないものからライブ壁紙を開始することはできません。つまり、ホーム画面のライブ壁紙ピッカーで壁紙を選択してテストします。
追加された 著者 Jens,
キャンバスにレンダリングすることができる場合は、デバイスのパフォーマンスによって異なります。
追加された 著者 Jens,
@peejaybee - あなたが望むことは自由で、クレジットは必要ありません。
追加された 著者 Jens,
ありがとうございました
追加された 著者 Bhupinder,
これは私が自分のNyan Catをライブ壁紙にするのに使った素晴らしい答えでした(いいえ、私は冗談ではありません)。私はAndroidマーケットで無料で利用できるようにしたいと思いますし、Githubでコードをホストしたいと思いますもちろん、私はあなたの祝福なしで、またはあなたにクレジットを与えずには、どちらもしません。これらのことをしてもいいですか?
追加された 著者 peejaybee,
Androidの下位デバイスや古いバージョン(これは不具合の原因を教えてくれるテストを行っていない)で裂けることがある場合は、(1)アニメーションgifが最適化されておらず、(2)すべてのフレーム同じサイズです。ライブ壁紙は、ジンジャーブレッドを実行しているG2でひどく見えました。ステップ1は大幅に改善されましたが、旧式の電話機で正しく見えるようにするためには、両方の手順が必要でした。
追加された 著者 peejaybee,
エミュレータでは動作しますが、デバイスでは動作しません。
追加された 著者 user3278077,