Android原理揭秘系列之动态墙纸

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

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

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

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

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

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

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

<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是如何能识别这个包含动态墙纸Service的APK的呢?上面这个AndroidManifest.xml文件的intent-filter的action泄露了天机:

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

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

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

/*****************************************************************************************************************************************/

本文为原创文章,转载请务必注明出处:http://blog.csdn.net/droidpioneer/article/details/6787571 

安卓开发用机友情链接:http://vpclub.octech.com.cn/ztewd/9495.html

 /******************************************************************************************************************************************/

 


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

相关文章

Linux5.3 Haproxy搭建Web群集

文章目录 计算机系统5G云计算第四章 LINUX Haproxy搭建Web群集一、Keepalived 概述1. HAProxy的主要特性2.常见的 Web 集群调度器3.HAProxy负载均衡策略4.LVS、Nginx、HAproxy的区别 二、Haproxy搭建 Web 群集 Keepalived部署高可用集群1.haproxy 服务器部署&#xff0c;配置负…

Android之场景桌面(一)

声明&#xff1a;转载请务必注明出处&#xff0c;本文代码和主题仅供学习交流&#xff0c;请勿用于商业用途。 引言&#xff1a;最近Android场景桌面开始流行起来了&#xff0c;跟原始的Android桌面相比&#xff0c;场景桌面能逼真的模拟各种自然物体&#xff0c;并且通过点击…

Android WallpaperManager 壁纸分析

Android中的壁纸分为静态壁纸和动态壁纸&#xff0c; 这两类壁纸本质都是一样的&#xff0c; 都是通过继承WallpaperService来实现的&#xff0c;只不过是绘制方面的差异。WallpaperManagerService用于管理壁纸的运行与切换&#xff0c;并通过WallpaperManager类向外界提供操作…

java springboot整合MyBatis做数据库查询操作

首先 我们还是要搞清楚 MyBatis 工作中都需要那些东西 首先是基础配置 你要连哪里的数据 连什么类型的数据库 以什么权限去连 然后 以 注解还是xml方式去映射sql 好 我们直接上代码 我们先创建一个文件夹 然后打开idea 新建一个项目 然后 按我下图的操作配置一下 然后点下一…

PD QC诱骗取电应用IC《乐得瑞LDR6328S》广泛应用于各大小家电

随着现在智能家居的应用越来越广泛&#xff0c;带电池的产品一天比一天多&#xff0c;今天这篇文章就来讲一下那些支持快速充电(PD QC)的产品应用电路是怎么实现的 USB PD受电端取电芯片&#xff08;乐得瑞取电受电)LDR6328S 支持多协议快充取电&#xff01; 1、概述 LDR6328S…

C++教程(07)——变量作用域

一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称为形式参数。 在所有函数外部声明的变量&#xff0c;称为全局变量。 作用域是程序的一个区域&#xff0c;变量的作用…

C++17新语法及标准库

1. New language features 1.1. New auto rules for direct-list-initialization 在C 17中&#xff0c;引入了一个新的auto规则来改进直接列表初始化&#xff08;direct-list-initialization&#xff09;的行为。在此前&#xff0c;使用auto声明变量并对其进行直接列表初始化…

【数据分享】2000-2021年全国1km分辨率的逐月PM2.5栅格数据(免费获取)

PM2.5作为最主要的空气质量指标&#xff0c;在我们日常研究中非常常用&#xff01;之前我们分享了2000-2021年全国范围1km分辨率的逐日的PM2.5栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;数据来自于Zendo平台&#xff01; 我们发现在Zendo平台上还…