`
tansitongba
  • 浏览: 484678 次
文章分类
社区版块
存档分类
最新评论

Android原理之动态墙纸

 
阅读更多

Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来。

相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与传统手机系统采用GIF作为动态背景不同的是,Android的动态墙纸并不是GIF图片,而是一个标准的Android应用程序,也就是APK。既然是应用程序,当然意味着天生具有有GIF图片不具备的功能——能与用户发生交互,而且动态的背景变化绝不仅仅局限于GIF图片那般只能是固定的几张图片的循环播放。

需要指出的是,标准的Android系统可以支持将动态的GIF图片设置为静态墙纸,但并不能将GIF图片动态的运行起来。也就是说,如果你将GIF图片作为静态墙纸,你只能看到一帧静态的图片,不能像很多其他系统的山寨机那样能够在桌面看到GIF图片动态效果。这种局限是Android的一大缺陷,这个缺陷是Android墙纸框架设计缺陷有关。当然了,既然你可以加载丰富类型的旋动的具有交互效果的Android动态墙纸,那么GIF图片的少许遗憾完全可以接受。

Android内置的动态墙纸都是基于RenderScript实现的,RenderScriptGoogle用于Android的一种类C语言,其与C语言语言结构很类似,其对OpenGL的标准API进行了简单的封装,可以在运行时再加载RenderScript文件运行。也就是说,如果你想基于RenderScript开发新的动态墙纸,你应该对OpenGL的常用API有一定的了解。此外,Google目前对RenderScript的开发资料还不是很完善,在公开发布的SDK里也暂时没有把RenderScript继承进ADT,换言之,如果你想用RenderScript开发新动态墙纸,你不能基于ADTSDKEclipse下进行开发,而应该下载完整源代码并编译整个框架,然后在自己的Linux编译环境里去写新应用。因为RenderScript是要调用OpenGL接口的,你开发的应用要能在真机上运行起来,你的机子必须支持3D,也就是OpenGL。如果你发现有的厂商的手机桌面并没有加载动态墙纸的入口,那么不用多说,那一定是该手机根本不支持3D,这一点对于想购买真机来学习Andoid开发的朋友来说就一定要当心了。

Google在发布的各个Android版本里都内置了一定数量的动态墙纸,各个版本的动态墙纸代码有少许差别,但是动态墙纸的名称、视效、个数基本都是一样的。下面我们看下这些动态墙纸的代码在什么位置。我们打开GoogleAndroid源代码地址:http://android.git.kernel.org/


可以看到,Android内置的动态墙纸都在packages/wallpapers/这个目录里,通过git clone方法(参见博文“Android源码下载——git clone实现单个目录下载”,http://blog.csdn.net/droidpioneer/article/details/6612026)快速的下载各个子目录各个Android版本的Android内置动态墙纸代码。其中,BasicMusicVisualization两个目录里都包括了多个相同代码框架的多个动态墙纸,MagicSmoke目录只包含魔幻烟雾一个动态墙纸,LivePicker目录里包含的是动态墙纸的选择列表的代码,也就是你在桌面选择添加动态墙纸时出现的系统里所有动态墙纸的那个列表的实现代码。

那么,动态墙纸的本质是什么呢?前文已述,是APK,不过是比较特殊的APK。我们不妨打开MagicSomkeAndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.magicsmoke">

    <original-package android:name="com.android.magicsmoke" />

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

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

    <application
        android:label="@string/wallpapers"
        android:icon="@drawable/ic_launcher_wallpaper">

        <service
            android:label="@string/wallpaper_magicsmoke"
            android:name="MagicSmoke"
            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/magicsmoke" />
        </service>

        <activity
            android:name="com.android.magicsmoke.MagicSmokeSelector"
            android:theme="@style/Preview"
            android:exported="true">
        </activity>

    </application>

</manifest>

我想细心的朋友已经猜出来了,Android动态墙纸的本质是一个“Service”,这个Service能够被主界面Launcher加载。那么Launcher是如何能识别这个包含动态墙纸ServiceAPK的呢?上面这个AndroidManifest.xml文件的intent-filteraction泄露了天机:

<action android:name="android.service.wallpaper.WallpaperService" />

不错,系统正式通过APK的这个action把其当做一个动态墙纸加载进LivePicker列表,用户在LivePicker列表里选择自己喜欢的动态墙纸,进而将动态墙纸显示进Launcher的背后。

需要指出的是,Android的动态墙纸虽然似乎是显示在Launcher的背景里,但其实这只是假象,动态墙纸和Launcher是完全不同的两个进程,只不过Launcher和动态墙纸的进程可以通过框架里的WallpaperManager进行进程间通信罢了,用户在Launcher桌面滑动、点击屏幕时有的动态墙纸能产生交互效果,实际上就是这个进程通信完成的。如果你通过代码将Launcher的背景设置为非透明的,比如以不透明的图片或者颜色作为背景,那么,你将看不到任何动态墙纸效果,当然,这样的话,静态墙纸你也不会看到了。




分享到:
评论

相关推荐

    Android动态壁纸

    手机端壁纸实现原理,代码有注释,适合初学者学习

    Android编程之动态壁纸实例分析

    主要介绍了Android编程之动态壁纸实现方法,以实例形式分析了Android动态壁纸的原理与实现步骤,具有一定参考借鉴价值,需要的朋友可以参考下

    Android自定义动态壁纸开发详解

    一、动态壁纸原理 如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。 动态壁纸的本质其实就是一个服务在维护一个动态壁纸引擎Engine,所以我们看到的动态效果其实是通过这个引擎画出来...

    android开发资料大全

    Android源码之动态壁纸引擎 动态桌面实现 android控件的抖动效果 很漂亮的ListView android 图像处理滤镜 照亮边缘特效 无闪烁启动画面 Android实现《天女散花》效果--(带源码) 天天动听 半透明Menu效果 Android ...

    OpenGL ES应用开发实践指南(Android卷).pdf

    《OpenGL ES应用开发实践指南:Android卷》是一本系统的OpenGL三维游戏和动态壁纸开发指南。由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还...

    OpenGL ES应用开发实践指南 Android卷

    《OpenGL ES应用开发实践指南:Android卷》是一本系统的OpenGL三维游戏和动态壁纸开发指南。由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还...

    Android2.3应用开发实战

    googlemaps、音频和视频、2d绘图和 3dopengl绘图、surfaceview、动态壁纸、蓝牙通信、触控、感应检测、android2.3特性、照相机、voip等内容。  《android 2.3应用开发实战》面向 android初学者、想系统掌握 android...

    android 4.0锁屏讲解

    介绍了Android4.0的锁屏流程和工作原理

    opengles应用开发实践指南android卷

    在本书第二部分,你就可以在第一部分学习到的知识的基础上开始搭建三维世界中的效果,比如光照和地形渲染,接下来还会学习如何创建可以运行在Android主屏幕(home screen)上的动态壁纸。 本书的读者对象: 如果对...

    SmoothLifeAndroid:适用于SmoothLife的Android动态壁纸

    “将Conway的“生活游戏”推广到一个连续的领域-SmoothLife” ... 此应用要求您的设备支持Android动态壁纸。 否则将无法打开。 希望我最终可以解决该问题。 它也是一个占用大量CPU的应用程序。 可以更改某些

    Android代码-安卓下载任务管理

    &gt; 前言:上年开发了一个壁纸,音乐,应用,视频等资源浏览和下载安卓应用,准备分解功能模块做下笔记。下载页面UI设计参照 网易云音乐 下载功能 多任务并行下载 断点续传(需服务器支持) 项目地址:...

    详解Android进程保活的方法

    关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一。你到网上搜 Android 进程保活,可以搜出各种各样神乎其技的做法,绝大多数都是极其不靠谱。前段时间,Github还出现了一个很火的“黑...

    TinyPNG PNG图片压缩利器

    对于颜色繁杂的,比如照片墙纸之类的图片(有些应用的启动画面喜欢搞这种),那用JPG是最好不过了,这种图片压缩前压缩后肉眼分辨几乎不计,如果保存成PNG 体积将是JPG的几倍甚至几十倍,严重浪费体积

    adb1.0.26包含fastboot.exe

    ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。 基本用法 命令语法 ...

    Planner 5D - Interior Design-crx插件

    事实:-超过350万注册用户-在诸如“使用”和“上瘾技巧”之类的技术博客中精选并被“福布斯”提及-用户分享了460万个室内设计创意,其中有190K被标记为“最喜欢的创建”内部:-创建自己的平面图或在现有画廊的项目...

Global site tag (gtag.js) - Google Analytics