android开机动画制作与播放原理简介

android开机动画制作与播放原理简介
android开机动画制作与播放原理简介

android开机动画制作与播放原理简介

谁都想拥有一个华丽漂亮的开机动画,这让人心情舒畅,android是怎么来实现的?怎么制作一个自己的开机动画?这里揭开android开机动画的神秘面纱。

1、制作开关机动画

1.1 开机动画的位置

system/media/bootanimation.zip,要修改开机动画就是修改bootanimation这个压缩文件。如果不存在该压缩包,使用原生自带的资源,其路径在

system/framework/framework-res.apk/assets/images

(android-logo-mask.png,android-logo-shine.png),但是比较难看,比较常见的就是“android”。所以要定制自己的开关机动画一般都是在system/media/目录下放置bootanimation.zip和shutanimation.zip.这里以开机动画为例,关机动画和开机动画其原理一样。

1.2 bootanimation.zip文件结构

bootanimation里面主要包含一个desc.txt以及N个文件夹。而文件夹里面放着的就是开机动画的图片资源。decs.txt的作用就是指导系统如何去执行开机动画。

desc.txt编写规范,例如开机动画需要用到2个文件夹,分别是folder1和folder2,开机的时候,先把folder1里面的图片都播放一遍,然后再循环播放folder2里面的文件,直到进入系统,decs.txt文档的内容如下:

[plain]view plaincopy

1.320 480 12

2.p 1 0 folder1

3.p 0 0 folder2

320 480是代表屏幕的分辨率,12表示12帧每秒,简单地说12代表一秒钟播放12张图片;

p 1 0 part1:p就是play。1是播放一次,0是无限次。0代表阶段间隔帧数为0。folder1就是说,这条指令是针对folder1这个文件夹的;

p 0 0 part2:第一个0这里是代表循环播放,第二个0和上面第二条指令一样。folder2就是第二个文件夹。

总结规则如下:

第一条指令:[屏幕的分辨率] [播放频率]

第二条指令:[p] [播放次数] [间隔帧数] [文件夹]

第N条指令:同上

1.3 压缩包

把需要用到的folder文件夹跟decs.txt打包成zip格式,必须是zip,不能是rar,且打包的时压缩方式选择“存储”模式。然后改名成为bootanimation.zip,最后将制作好的zip包push到/system/media 目录下。

注意:bootanimation不能太大,一般最好不要超过3M。

1.4 查看动画

在终端中输入命令:

adb shell---> cd /system/bin--->bootanimation 或者bootanimation shut

这样不用重启即可查看定制的动画,方便。

1.5 硬性条件

手机必须有root权限,否则我们制作好的图片资源没办法push到/system/media目录,另外执行bootanimaiton也有可能没有权限,所以这里要定制自己的手机必须有root权限,当然了至于使用什么样的方式大家可以根据自己的爱好,各显神通。

2、播放原理

通过上面的准备开机资源已经制作好了,那android是怎么来实现播放的。首先对于开关机动画的播放,android专门使用了一个native service来实现播放(/system/bin/bootanimation),包括开机铃声的实现也是用该service来实现的。

2.1 bootanimation的启动

Android系统在init.rc中定义了很多Service,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。Init.rc中定义的Service将会被Init进程创建,其中已经定义的服务就包含bootanimation。

每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“ ctl.start ”和“ctl.stop ”是用来启动和停止服务的。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。

1.service bootanim /system/bin/bootanimation

2. user graphics

3. group graphics system audio qcom_oncrpc

4. disabled

5. oneshot

定义了一个bootanim的服务,对应执行/system/bin/bootanimation

disabled 表示init进程创建只是创建它,但不立刻执行;

oneshot 表示该服务只执行一次;

2.2 开机动画调用

通过上面可知,bootanimation的调用同故宫clt.start 和ctl.stop来实现的,当我们开机启动时,系统内核起来后,启动android,这时就会启动开机动画具体是在

SurfaceFlinger.cpp的readyToRun方法中调用,为什么会在这调用,请回顾一下开机流程。[plain]view plaincopy

1.status_t SurfaceFlinger::readyToRun()

2.{

3. // start boot animation service

4. property_set("ctl.start", "bootanim");//

5.

6.}

当android启动完成后,关闭掉开机动画

[plain]view plaincopy

1.void SurfaceFlinger::bootFinished()

2.{

3. //stop bootanim service

4. property_set("ctl.stop", "bootanim");

5.}

2.3 bootanimation 源码分析

代码所在位置:/frameworks/base/cmds/bootanimation,其主要包含以下三个文件

[plain]view plaincopy

1.BootAnimation_main.cpp

2.BootAnimation.h

3.bootAnimation.cpp

2.3.1 Bootanimation_main.cpp

该文件是主入口文件;

[plain]view plaincopy

1.int main(int argc, char** argv)

2.{

3.#if defined(HAVE_PTHREADS)

4. setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

5.#endif

6. char value[PROPERTY_VALUE_MAX];

7. property_get("debug.sf.nobootanimation", value, "0");

8. int noBootAnimation = atoi(value);

9. LOGI_IF(noBootAnimation, "boot animation disabled");

10. if (!noBootAnimation) {

11. sp proc(ProcessState::self());

12. ProcessState::self()->startThreadPool();

13. // create the boot animation object

14. bool setBoot = true;

15. bool setRotated = false;

16. bool sePaly = true;

17. if(argc > 1){

18. if(!strcmp(argv[1],"shut"))

19. setBoot = false;

20. }

21. if(argc > 2){

22. if(!strcmp(argv[2],"nomp3"))

23. sePaly = false;

24. }

25.

26. if(argc > 3){

27. if(!strcmp(argv[3],"rotate"))

28. setRotated = true;

29. }

30. char volume[PROPERTY_VALUE_MAX];

31. property_get("persist.sys.mute.state", volume, "-1");

32. int nVolume = -1;

33. nVolume = atoi(volume);

34. if(nVolume == 0 || nVolume == 1 ){

35. sePaly = false;

36. }

37. sp boot = new BootAnimation(setBoot,sePaly,setRotated

);

38.

39. IPCThreadState::self()->joinThreadPool();

40.

41. }

42. return 0;

43.}

其主要的功能是根据传进来的参数决定是是要播放开机还是关机动画/铃音,并且启动BootAnimation;

2.3.2 BootAnimation.cpp

BootAnimation.cpp集成自Thread,在创建时会调用readyToRun()->threadLoop()。

[plain]view plaincopy

1.status_tBootAnimation::readyToRun() {

2.……………省略………………………

3.mAndroidAnimation = false;

4. if(bBootOrShutDown){

5. status_t err = mZip.open("/data/local/bootanimation.zip");

6. if (err != NO_ERROR) {

7. err =mZip.open("/system/media/bootanimation.zip");

8. if (err != NO_ERROR) {

9. mAndroidAnimation = true;

10. }

11. }

12. }else {

13. if(!bShutRotate){

14. status_terr = mZip.open("/data/local/shutanimation.zip");

15. if (err != NO_ERROR) {

16. err =mZip.open("/system/media/shutanimation.zip");

17. if (err != NO_ERROR) {

18. mAndroidAnimation = true;

19. }

20. }

21. }

22. }

23.return NO_ERROR;

24.}

readyToRun() 方法判断/system/media/bootanimation.zip(shutanimaion.zip)是否存在,如果存在,则将mAndroidAnimation 设置false,这个变量决定threadLoop中调用android()还是movie()来具体实现动画的播放。

[plain]view plaincopy

1.boolBootAnimation::threadLoop()

2.{

3. ........省略........

4. if(!bBootOrShutDown){

5. pSoundFileName="/data/local/shutaudio.mp3";

6. pBackupSoundFileName="/system/media/shutaudio.mp3";

7. } else {

8. pSoundFileName="/data/local/bootaudio.mp3";

9. pBackupSoundFileName="/system/media/bootaudio.mp3";

10. }

11. if (mAndroidAnimation)

12. r = android();

13. } else {

14. r = movie();

15. }

16.}

threadLoop()方法根据mAndroidAnimation 变量调用android()/movie(). 如果system/media/shutanimation.zip/bootanimation.zip存在的话,调用movie(),该接口会解析zip文件中的desc.txt文件,根据txt文件中的配置来播放动画。否则就调用android 来播放原生自带的资源。

3、总结

对于图片资源时如何绘制的,我想这不是本文的重点,有兴趣的同学可以继续深究,这里仅仅是抛砖引玉。

安卓按钮单击事件

第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监听器的!!! 对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器。 第二种:内部类作为监听器 将事件监听器类定义成当前类的内部类。1、使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类,2、所以可以自由访问外部类的所有界面组件。这也是内部类的两个优势。上面代码就是内部类的形式!! 第三种:Activity本身作为事件监听器

这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。Activity 的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。 上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处理器方法:onClick(view v),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。 第四种:外部类作为监听器 ButtonTest类 当用户单击button按钮时,程序将会触发MyButtonListener监听器 外部MyButtonListener类

AndroidUI基本控件与事件处理

《Android基础应用》 AndroidUI基本控件与事件处理 ?本章任务 ?使用Android开发本息计算器程序 ?使用Android开发华氏-摄氏温度转换器 ?本章目标 ?熟悉掌握本章基本控件的使用 ?熟练掌握Android常用事件 1.Android基本控件 Android应用开发的一项内容就是用户界面的开发,Android提供了大量功能丰富的UI组件,大部分放在android.widget包及其子包android.view包及其子包 在Android当中View类是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的。如Button(按钮),list(列表),EditText(编辑框),RadioButton(多选按钮),Checkbox(选择框)等都是View类 在Android中,我们可以在Xml文件中使用UI组件也可以在java文件中创建UI组件官方建议采用xml方式,这样的话能够实现界面和代码分离 1.1TextView和EditText TextView是一种用于显示字符串的控件 EditText则是用来输入和编辑字符串的控件,EditText是一个具有编辑功能的TextView

TextView和EditText基本属性 ●android:id设置ID,通过编码可以找到这个组件 ●android:layout_width设置在屏幕上的宽度 ●android:layout_height设置在屏幕上的高度 fill_parent强制性地使构件扩展,以填充布局单元内尽可能多的空间 wrap_content强制性地使视图扩展以显示全部内容 ●android:text设置显示的文本信息 ●android:textColor设置文本颜色 ●android:textSize设置文本尺寸

Android OnTouchListener触屏事件接口

Android OnTouchListener触屏事件接口 OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名如下。 Java代码: public boolean onT ouch(View v, MotionEvent event) 参数v:参数v同样为事件源对象。 参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息。 节中介绍了一个在屏幕中拖动矩形移动的案例,本节将继续采用该案例的思路,通过监听接口的方式实现在屏幕上拖动按钮移动的案例。开发步骤如下。 创建一个名为Sample的Android项目。 准备字符串资源,打开strings.xml文件,用下列代码替换原有代码。 Java代码: Hello World, Sample Sample 位置 说明:与前面介绍的案例相同,对程序中用到的字符串资源进行定义。 开发布局文件。打开res/layout目录下的main.xml,用下列代码替换其原有代码。

Java代码:

相关主题
相关文档
最新文档