Android 设置gif动态桌面

news/2025/1/12 1:34:46/

  Android设置桌面主要用到了WallPaperService这个类。首先创建自己的类继承WallPaperService并重写onCreateEngine()方法,创建自己的Engine。

 1、创建自己的Engine类GifEngine 继承Engine,重写里面的onSurfaceCreated方法,onVisibilityChanged方法,onSurfaceDestroy方法。在onSurfaceCreate方法中加载gif动画,这里涉及到gif动画的加载与播放,涉及到Movie类,用movie解码gif文件然后画在canvas上,并重复一帧一帧的绘制。这样就能将gif动画渲染到surfaceView上呈现到屏幕。

   onVisibilityChanged方法在桌面可见不可见的时候进行回调,当屏幕可见的时候进行播放,屏幕不可见取消gif绘制。onSurfaceDestroy销毁的时候销毁操作。类如下:

public class GIfWallPaperService extends WallpaperService {private Movie movie;
    private Handler handler;
    private boolean isVisible;
    private int height;
    private int width;
    private int gifWidth;
    private int gifHeigth;

    @Override
    public Engine onCreateEngine() {return new GifEngine();
    }class GifEngine extends Engine {@Override
        public void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);
            handler = new Handler();
            try {InputStream inputStream = getContentResolver().openInputStream(Config.filePath);
                movie = Movie.decodeStream(inputStream);
                DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
                height = displayMetrics.heightPixels;
                width = displayMetrics.widthPixels;
                gifWidth = movie.width();
                gifHeigth = movie.height();
            } catch (FileNotFoundException e) {e.printStackTrace();
            }}@Override
        public void onVisibilityChanged(boolean visible) {if (visible) {isVisible = true;
                handler.post(runnable);
            } else {isVisible = false;
                handler.removeCallbacks(runnable);
            }}@Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);
            handler.removeCallbacks(runnable);
        }
        private Runnable runnable = new Runnable() {@Override
            public void run() {if (isVisible) {
                    Canvas canvas = getSurfaceHolder().lockCanvas();
                    canvas.save();
                    canvas.scale(2 , 2 );
                    movie.draw(canvas, 0, 0);
                    movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
                    canvas.restore();
                    getSurfaceHolder().unlockCanvasAndPost(canvas);

                    handler.postDelayed(runnable, 50);   //50ms表示每50m绘制一次
                }}};
    }
}

2、配置AndroidMainfest.xml 

<service android:name=".service.GIfWallPaperService"
         android:label="@string/gif_wallpaper"
         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/gif_wallpaper" />
</service>

3、配置gif_wallpaper.xml

    

<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
    android:thumbnail="@mipmap/ic_launcher"
    android:description="@string/gif_description"
    />

4、配置strings.xml

<string name="gif_description">gif动态壁纸</string>

5、配置权限

<uses-permission android:name="android.permission.SET_WALLPAPER" />

6、启动GifService

Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,new ComponentName(context, GIfWallPaperService.class));
startActivity(intent);
这样就可以实现gif动画加载了



http://www.ppmy.cn/news/120974.html

相关文章

android静态图片和动态壁纸

[Android Version] 6573 Android V2.3 6575 Android V2.3/V4.0 [DESCRIPTION] 如何客制化第一次开机时的默认壁纸。 [SOLUTION] 默认壁纸可设置为一张图片&#xff0c;或者某个动态壁纸 静态壁纸 Android V2.3版本上&#xff1a; 替换frameworks/base/core/res/res/drawable/de…

Android动态壁纸详解

动态壁纸 Livewallpaper&#xff08;动态壁纸&#xff09;&#xff1a; 首先动态壁纸并不是GIF图片&#xff0c;而是一个独立的应用程序,本质是一个Service,甚至可以没有桌面图标。 直接看AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?…

动态修改安卓桌面icon

动态修改安卓桌面icon 继承启动activity 网上很多说使用activity-alias的&#xff0c;后面看到知乎一个文章&#xff1a;Android动态变更图标和应用名&#xff0c;觉得也是写成一个activity合理一些。 这里直接继承原来的启动activity&#xff0c;内容为空就行&#xff1a; …

Android动态壁纸开发

新建一个Android项目&#xff1a; 完成下面步骤后&#xff0c;安装到手机&#xff0c;并设置动态壁纸才能看到效果。 res/xml/cube1.xml <?xml version"1.0" encoding"utf-8"?><!-- The attributes in this XML file provide configuration inf…

Android静态壁纸和动态壁纸的使用和理解

这两天在公众号上偶然看到一篇关于设置动态壁纸的文章&#xff0c;觉得蛮有意思的&#xff0c;学习了一下&#xff0c;以此文章记录一下怎样给手机设置静态壁纸和动态壁纸&#xff0c;设置壁纸的使用方法。 静态壁纸 Android中WallpaperManager系统服务用于管理壁纸的运行与切…

Android动态壁纸的制作教程

动态壁纸是在Android 2.1新增的一个功能。动态壁纸可以添加到Android的桌面&#xff0c;具有交互式的动画背景效果。在本教程中&#xff0c;我们将教会你如何去制作一个交互式的动态壁纸。 动态壁纸是一个Android应用程序&#xff0c;包括一个服务(WallpaperService)。该服务必…

Android 动态壁纸 Livepaper

动态壁纸原理 及 例子 最近做动态壁纸的项目&#xff0c;原来觉得动态壁纸是个很小的项目&#xff0c;但是看到Android Market上有个专门的动态壁纸分类(现在升级为Google Play了), 而且自己做的这个项目可连接上服务器&#xff0c;供用户购买下载图片&#xff0c;终于有了自信…

android动态壁纸---线条

android SDK2.1中有关于动态壁纸的2个演示DEMO&#xff0c;本人在网上查了相关资料。找到了一个演示DEMO的源代码&#xff0c;希望和大家分享。 同时谢谢提供代码的LZ.并且再此基础上本人做了一个简单的线条动态壁纸,后续还有动态壁纸---球的感应动作实例和大家一起分享学习。…