动态壁纸开发指南(一)概述介绍

栏目: Android · 发布时间: 6年前

内容简介:在Android中,壁纸分为静态与动态两种。静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应。动态壁纸实际上和其他应用是类似的,自Android 2.1开始支持。Android壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作。Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工

一、概述

1.1 简介

在Android中,壁纸分为静态与动态两种。静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应。动态壁纸实际上和其他应用是类似的,自Android 2.1开始支持。Android壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作。Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作。

1.2 示例

简单来说,动态壁纸就是一个服务,动态壁纸需要实现动态壁纸的服务WallpaperService和描绘动态壁纸的引擎WallpaperService.Engine。

组件类 说明
WallpaperService 实现动态壁纸的服务程序
WallpaperService.Engine 描绘动态壁纸的引擎

下面以视频动态壁纸为例,讲述一下具体实现流程。

(1)首先定义一个类VideoWallpaper来继承WallpaperService类并实现onCreateEngine()方法,在该方法中需要返回一个Engine实例。

public class VideoWallpaper extends WallpaperService {
    @Override
    public Engine onCreateEngine() {
        return null;
    }
}

(2)然后定义一个VideoEngine类来继承Engine类并实现onSurfaceCreated() 、onSurfaceDestroyed()和onVisibilityChanged()方法。在onSurfaceCreated()方法中初始对象资源;在onSurfaceDestroyed()中去释放和销毁资源;在onVisibilityChanged()方法中去控制视图是显示和隐藏逻辑。以视频壁纸为例:

private class VideoEngine extends Engine {
    private MediaPlayer mPlayer;

    @Override
    public void onVisibilityChanged(boolean visible) {
        if (visible) {
            mPlayer.start();
        } else {
            mPlayer.pause();
        }
    }

    @Override
    public void onSurfaceCreated(SurfaceHolder holder) {
        super.onSurfaceCreated(holder);
        mPlayer = new MediaPlayer();
        //不能使用setDisplay()方法
        mPlayer.setSurface(holder.getSurface());
        mPlayer.setDataSource(videoPath);
        mPlayer.prepare();
        mPlayer.start();
    }

    @Override
    public void onSurfaceDestroyed(SurfaceHolder holder) {
        super.onSurfaceDestroyed(holder);
        if (mPlayer.isPlaying()) {
            mPlayer.stop();
        }
        mPlayer.release();
        mPlayer = null;
    }
}

(3)对VideoWallPaper服务进行注册,这里在注册时写法和普通的Service相同。需要注意的是,WallPaperService需要一个"android.permission.BIND_WALLPAPER"的权限,添加一个action为"android.service.wallpaper.WallpaperService",还需要一个名为"android.service.wallpaper"的meta-data。如下:

<service  
         android:label="@string/app_name"  
         android:permission="android.permission.BIND_WALLPAPER"   
         android:name=".VideoWallpaper">  
         <intent-filter>  
             <action android:name="android.service.wallpaper.WallpaperService" />  
         </intent-filter>  
         <meta-data android:name="android.service.wallpaper"   
               android:resource="@xml/livewallpaper" />              
</service>

(4)上面的代码中meta-data中需要一个xml文件源,所以还需要在res的xml文件夹(没有就创建)下,创建一个名为wallpaper的xml文件。xml文件的根标签为wallpaper,有一下三个属性:

  • description :动态壁纸的文字描述
  • thumbnail:动态壁纸的图片描述
  • settingsActivity:动态壁纸的设置界面

动态壁纸的资源来源“/res/xml/liveWallpaper.xml”

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

SettingsActivity代码示例如下:

public class SettingsActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setting_layout);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="video_param"
    android:title="设置">
    <CheckBoxPreference
        android:defaultValue="true"
        android:key="loop"
        android:title="是否循环播放" />
    <CheckBoxPreference
        android:checked="false"
        android:key="volume"
        android:title="是否开启声音" />
</PreferenceScreen>

(5)接下来就是启动壁纸服务了,这里不能通过context的startService()方法来启动壁纸服务,需要通过启动系统的预览界面来间接启动服务。

Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(context, VideoWallPaperService.class)); context.startActivity(intent);

除了启动还需要关闭壁纸服务,可以通过WallpaperManager的clear()方法来关闭,也可以通过WallpaperService的clearWallpaper()(已经被标记过时)方法来关闭壁纸。

try {
      WallpaperManager.getInstance(context).clear();
} catch(IOException e) {
       e.printStackTrace();
}

其他需要注意的地方,比如可以通过WallpaperManager的getWallpaperInfo()方法来判断当前壁纸的服务是否已经在运行,从而可以通过广播或者其他通知来直接修改壁纸播放的视频,避免每次更换一个视频都需要走一次系统的预览界面。也就是在设置里面动态设置壁纸参数。

动态壁纸开发指南(一)概述介绍

上面只是简单的示例代码,如果对视频动态壁纸感兴趣,可以参考此项目 VideoWallpaper

以上就是实现一个基本动态壁纸的流程,其实视频动态壁纸实现起来比较简单,不需要开发者自己画出复杂的界面,也没有手势交互逻辑。但是市面上的动态壁纸大多比较复杂,而且基本上是使用绘图API画出来的,包括OpenGL等,在之后的文章里会详细介绍。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

因计算机而强大

因计算机而强大

[美]西摩 佩珀特 Seymour Papert / 梁栋 / 新星出版社 / 2019-1 / 38

本书有两个中心主题—— 孩子可以轻松自如地学习使用计算机; 学习使用计算机能够改变他们学习其他知识的方式。 (前苹果公司总裁 约翰·斯卡利) 最有可能带来文化变革的就是计算机的不断普及。 计算机不仅是一个工具,它对我们的心智有着根本和深远的影响。 计算机不仅帮助我们学习 ,还帮助我们学习怎样学习。 计算机是一种调解人与人之间关系的移情对象。 一个数学的头脑......一起来看看 《因计算机而强大》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具