ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何将一个GIF变成一个动态壁纸,以便在Android应用程序中使用

2019-08-30 18:28:06  阅读:265  来源: 互联网

标签:live-wallpaper android java gif


我不需要随你的手机移动的花哨壁纸,我只想用gif作为移动的“现场”壁纸.这是可能的,如果是这样,有人可以向我解释它是如何完成的,或者指向一个演示如何的资源?我还没有找到一个.

解决方法:

请参阅GIFLiveWallpaper演示了解github repo

public class GifLiveWallPaper extends WallpaperService {

static final String TAG = "LIVE_WALLPAPER";
static final Handler liveHandler = new Handler();

@Override
public Engine onCreateEngine() {
    try {
        return new WallPaperEngine();
    } catch (IOException e) {
        Log.w(TAG, "Error creating WallPaperEngine", e);
        stopSelf();
        return null;
    }
}

class WallPaperEngine extends Engine {

    private Movie liveMovie;
    private int duration;
    private Runnable runnable;
    float mScaleX;
    float mScaleY;
    int mWhen;
    long mStart;

    public WallPaperEngine() throws IOException {

        InputStream is = getResources().openRawResource(R.raw.sam);

        if (is != null) {

            try {
                liveMovie = Movie.decodeStream(is);
                duration = liveMovie.duration();

            } finally {
                is.close();
            }
        } else {
            throw new IOException("Unable to open R.raw.hand");
        }
        mWhen = -1;
        runnable = new Runnable() {
            public void run() {
                nyan();
            }
        };
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        liveHandler.removeCallbacks(runnable);
    }

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

    @Override
    public void onSurfaceChanged(SurfaceHolder holder, int format,
            int width, int height) {
        super.onSurfaceChanged(holder, format, width, height);
        mScaleX = width / (1f * liveMovie.width());
        mScaleY = height / (1f * liveMovie.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) {
                drawGif(canvas);
            }
        } finally {
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
        liveHandler.removeCallbacks(runnable);
        if (isVisible()) {
            liveHandler.postDelayed(runnable, 1000L / 25L);
        }
    }

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

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

标签:live-wallpaper,android,java,gif
来源: https://codeday.me/bug/20190830/1769567.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有