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

栏目: 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等,在之后的文章里会详细介绍。


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

查看所有标签

猜你喜欢:

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

疯长

疯长

[美]肖恩· 阿美拉蒂 / 中信出版集团 / 2018-10 / 45

实现财务回报以及扩大影响力是企业家长期关注和讨论的问题。 为什么有些公司实现了10倍的投资回报,而其他的则勉力支撑?产品类似的公司,为什么有的家喻户晓,有的默默无闻直至退出市场…… 为了了解真相,作者阿美拉蒂在这本书中精选10组对照公司,比如,同为社交平通的Facebook(脸谱网)和Friendster(交友网),同为快餐领域先驱的麦当劳和白色城堡,再比如都在开发电动汽车市场的特斯拉......一起来看看 《疯长》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试