Android 使用动画gif的实时壁纸(带有centercrop缩放类型)

Android 使用动画gif的实时壁纸(带有centercrop缩放类型),android,live-wallpaper,Android,Live Wallpaper,如何使用动画.gif图像创建简单的实时壁纸?我得到的.gif图像与屏幕不相称。如何使其成为中心裁剪?您的活动文件 public class GIFWallpaperService extends WallpaperService { @Override public WallpaperService.Engine onCreateEngine() { try { Movie movie = Movie.decodeStream( getR

如何使用动画.gif图像创建简单的实时壁纸?我得到的.gif图像与屏幕不相称。如何使其成为中心裁剪?

您的活动文件

public class GIFWallpaperService extends WallpaperService {

@Override
public WallpaperService.Engine onCreateEngine() {
    try {
        Movie movie = Movie.decodeStream(
                getResources().getAssets().open("owlinsnow.gif"));

        return new GIFWallpaperEngine(movie);
    }catch(IOException e){
        Log.d("GIF", "Could not load asset");
        return null;
    }
}

private class GIFWallpaperEngine extends WallpaperService.Engine {

    private final int frameDuration = 20;

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

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

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

    private Runnable drawGIF = new Runnable() {
        public void run() {
            draw();
        }
    };


    private void draw() {
        if (visible) {
            Canvas canvas = holder.lockCanvas();
            canvas.save();
            // Adjust size and position so that
            // the image looks good on your screen
            canvas.scale(2f, 2f);
            movie.draw(canvas, -100, 0);
            canvas.restore();
            holder.unlockCanvasAndPost(canvas);
            movie.setTime((int) (System.currentTimeMillis() % movie.duration()));

            handler.removeCallbacks(drawGIF);
            handler.postDelayed(drawGIF, frameDuration);
        }
    }

    @Override
    public void onVisibilityChanged(boolean visible) {
        this.visible = visible;
        if (visible) {
            handler.post(drawGIF);
        } else {
            handler.removeCallbacks(drawGIF);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        handler.removeCallbacks(drawGIF);
    }
}
}
清单文件

<application android:allowBackup="true" android:label="@string/app_name"
    android:icon="@drawable/owl" android:theme="@style/AppTheme">

    <service
        android:name=".GIFWallpaperService"
        android:enabled="true"
        android:label="Owl in Snow"
        android:permission="android.permission.BIND_WALLPAPER" >
        <intent-filter>
            <action android:name="android.service.wallpaper.WallpaperService"/>
        </intent-filter>
        <meta-data
            android:name="android.service.wallpaper"
            android:resource="@xml/wallpaper" >
        </meta-data>
    </service>

</application>

<uses-feature
    android:name="android.software.live_wallpaper"
    android:required="true" >
</uses-feature>

在res下创建xml目录,并在其中创建wallpar.xml

<?xml version="1.0" encoding="UTF-8"?>
<wallpaper
xmlns:android="http://schemas.android.com/apk/res/android"
android:label="GIF Wallpaper"
android:thumbnail="@drawable/owl">
</wallpaper>


确保将gif图像放置在“资源”文件夹中。要创建资产文件夹,请单击“文件->新建->文件夹->资产”

在我看来,选择的答案有些不完整,而且不通用,因为它提到了硬编码的值,并且没有记住不同的屏幕大小。只获取onSurfaceChanged方法发送的值并使用它们来缩放画布对象会容易得多

基本上,我们取屏幕宽度与电影(GIF)宽度之比,以及屏幕高度与电影高度之比。然后使用这两个变量缩放画布,以完美地填充整个屏幕

首先,全局存储从onSurfaceChanged方法获得的宽度和高度

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    super.onSurfaceChanged(holder, format, width, height);
    this.width = width;
    this.height = height;
    //GLOBALLY DECLARED
}
onSurface在onCreate运行之后立即更改了运行,因此不用担心,在使用这些值之前,它们将存储在变量widthheight

稍后在初始化画布时,使用屏幕大小与电影大小的比率缩放画布。 PS-movie是与我们正在使用的GIF关联的电影对象

float x = (float)width / (float)movie.width();
float y = (float)height / (float)movie.height();
canvas.scale(x,y);

有一个xml属性scaleType。你试过了吗?你的问题和题目不一样。。所以请更改标题..我尝试了不使用activity_main.xml文件。因此,对于.gif,我无法以编程方式使用scalType。。imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);它起作用了。但对于不同的设备,图像的比例不正确。画布的istead.scale(2f,2f);尝试DisplayMetrics DisplayMetrics=新建DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);int height=displaymetrics.heightPixels;int width=displaymetrics.widthPixels@VarunPuravankara这个方法会有用的,是的。但是如果不提供上下文,使用起来会有点复杂。此外,我们正在绘制的屏幕表面视图可能会发生变化,如旋转或多重监视器等,因此使用onSurfaceChanged传递的值可能会有所帮助。请看我的回答,以获得澄清。