Custom WallpaperService показывает только первый кадр GIF - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю над небольшим проектом, где я делаю свое собственное приложение с живыми обоями, где я должен иметь возможность выбрать GIF и автоматически сделать из него живые обои.Из-за этого мне нужно написать свой собственный сервис обоев, и пока он работает, но кажется, что он рисует только первый кадр.

Вот код:

package com.example.r.c;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Canvas;
import android.os.Environment;
import android.service.wallpaper.WallpaperService;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.SurfaceHolder;
import android.graphics.Movie;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import android.os.Handler;

public class CustomWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {

    try{

        File f = new File("/storage/emulated/0/testgif.gif");
        Movie m = Movie.decodeStream(new FileInputStream(f));
        return new wEngine(m);

    } catch (Exception e){
        return null;
    }


}

public class wEngine extends Engine{

    private Movie movie;
    private SurfaceHolder holder;
    private Handler handler;
    private boolean visible = true;

    public wEngine(Movie m){
        this.movie = m;
        handler = new Handler();
    }

    @Override
    public void onCreate(SurfaceHolder surfaceHolder) {
        super.onCreate(surfaceHolder);
        this.holder = surfaceHolder;
    }

    private Runnable drawRunnable = new Runnable() {
        @Override
        public void run() {
            draw();
        }
    };

    private void draw(){
        Canvas canvas = holder.lockCanvas();
        canvas.save();

        canvas.scale(2f,2f);
        movie.draw(canvas, 0, 0);
        canvas.restore();
        holder.unlockCanvasAndPost(canvas);
        movie.setTime((int) System.currentTimeMillis() % movie.duration());

        handler.removeCallbacks(drawRunnable);
        handler.postDelayed(drawRunnable, 20);
    }

    @Override
    public void onVisibilityChanged(boolean visible) {
        super.onVisibilityChanged(visible);

        this.visible = visible;
        if (visible) {
            handler.post(drawRunnable);
        } else {
            handler.removeCallbacks(drawRunnable);

        }
    }
}
}

Как я уже говорил,код рисует первый кадр, и поэтому нет проблем с открытием или доступом к файлу, и если я открою gif в файловом менеджере android, он будет работать отлично.

Спасибо за всевозможную помощь!

1 Ответ

0 голосов
/ 18 сентября 2018

Найдена проблема!

movie.setTime((int) System.currentTimeMillis() % movie.duration());

должно быть:

movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
...