开机动画_android 开机第一屏和开机动画 - CSDN
  • android开机动画详细分析可以参见...这里的开机动画指的是以bootanimation.zip方式存在,不包括BootVideo这种方式。1、开机动画路径: bootanimation.zip路径有两个: a、”/data/lo

    android开机动画详细分析可以参见http://blog.csdn.net/luoshengyang/article/details/7691321
    引用老罗的文章,写的太好了。

    以下介绍一些相关的点。
    这里的开机动画指的是以bootanimation.zip方式存在,不包括BootVideo这种方式。

    1、开机动画路径:

    bootanimation.zip路径有两个: a、"/data/local/bootanimation.zip"
    b、"/system/media/bootanimation.zip"
    标准流程会以a路径优先,也就是/data分区下的那个,没有的话才是会加载、/system分区下的动画。也就是可以再/data下就更新开机动画,恢复出厂会回到原本的/system下的动画。

    2、bootanimation.zip内容:

    这里写图片描述
    “desc.txt”:用来描述用户自定义的开机动画是如何显示的。
    desc.txt的内容格式如下面的例子所示:

    1280 720 1
    p 1 1 part0
    p 0 1 part1
    

    第一行的三个数字分别表示开机动画在屏幕中的显示宽度、高度以及帧速(fps)。剩余的每一行都用来描述一个动画片断,这些行必须要以字符“p”来开头,后面紧跟着两个数字以及一个文件目录路径名称。

    第一个数字表示一个片断的循环显示次数,如果它的值等于0,那么就表示无限循环地显示该动画片断。

    第二个数字表示每一个片断在两次循环显示之间的时间间隔。这个时间间隔是以一个帧的时间为单位的。

    文件目录下面保存的是一系列png文件,这些png文件会被依次显示在屏幕中。

    3、动画的Start和stop控制:

    动画的开始与结束是由属性值控制的,由/system/bin/surfaceflinger来控制,然后相关的动画处理程序为/system/bin/bootanimation,在init.rc中指定。

    a、bootanimation 需要由property_set(“ctl.start”, “bootanim”);来启动,由property_set(“ctl.stop”, “bootanim”);来关掉进程。

    b、“service.bootanim.exit”:这个属性在bootanimation进程里会周期检查,=1时就退出动画,这里=0表示要播放动画。

    启动和关闭的地方在frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp中调用:
    这里写图片描述
    c、property_get(“debug.sf.nobootanimation”, value, “0”);该字段如果=1,则不会显示动画。

    d、有时希望能等待开机动画全部帧播放完才进入Launcher,可以去修改frameworks\base\cmds\bootanimation.cpp中bool BootAnimation::movie()函数下的这个部分,将part.playUntilComplete设置为1即可。

     else if (sscanf(l, " %c %d %d %s", &pathType, &count, &pause, path) == 4) {
                //LOGD("> type=%c, count=%d, pause=%d, path=%s", pathType, count, pause, path);
                Animation::Part part;			
                //part.playUntilComplete = pathType == 'c';//edify by wusc to wait for bootanimation complete
                part.playUntilComplete = 1;//edify by wusc to wait for bootanimation complete
                part.count = count;
                part.pause = pause;
                part.path = path;
                animation.parts.add(part);
            }
    

    另外还可以将“desc.txt”中的p改为c,然后重新打包即可。从上面的代码也可以看出 //part.playUntilComplete = pathType == 'c';

    e、到bool BootAnimation::movie()函数,动画是在播放了,而且还在循环检测是否退出,即checkExit()。checkExit()函数中检测到"service.bootanim.exit"属性变为1了,会调用requestExit();请求退出。

    f、另外一个需要注意的地方:在bool BootAnimation::movie()函数下,每当显示完成一个png图片之后,都要将变量frameDuration的值从纳秒转换为毫秒,然后调用usleep函数,以保证每一个png图片,即每一帧动画都按照预先指定好的速度来显示。

    注意,函数usleep指定的睡眠时间只能精确到毫秒,因此,如果预先指定的帧显示时间小于1毫秒,那么BootAnimation类的成员函数movie是无法精确地控制地每一帧的显示时间的。

    4、重新打包制作开机动画的方法

    其实这个没什么好说的,就是普通的打包成zip,主要是要选成存储方式。
    这里写图片描述

    展开全文
  • Windows7炫+开机动画

    2020-07-21 23:33:40
    win7开机画面修改工具BootUpdater,英文界面,操作简单,或用魔方美化大师修改开机动画
  • 开机logo和开关机动画

    2019-06-12 13:51:49
    android5.1中,开机LOGO部分和之前版本的并不相同,主要区别在于android LOGO显示部分。...开机LOGO一般有两种:静态的和动态的,Android开机时共有三种LOGO(5.1之前可能算是4种吧)。 1. uboot显...

    转载自:http://blog.csdn.net/u014770862/article/details/52624627

    android5.1中,开机LOGO部分和之前版本的并不相同,主要区别在于android LOGO显示部分。此博客所讲之处若有错误,敬请原谅,谢谢!
    开机LOGO一般有两种:静态的和动态的,Android开机时共有三种LOGO(5.1之前可能算是4种吧)。
    1. uboot显示 (名字为:logo.bmp)
    2. kernel显示 (名字为:logo_kernel.bmp)
    3. android开机动画 (bootanimation.zip)
    一般情况下将前两幅图做成一样的,第三个就是开机动画部分。(uboot显示logo一般可以不做,加快android启动速度)。

    注意:图片不能太大,一般不要超过500k,太大会花屏或者显示黑屏。

    一、kernel显示

    1.内核支持
    首先在内核中配置支持开机LOGO显示:

    Graphics support  ------>
           [*] Bootup logo ----->
               --- Bootup logo
                   [*] Standard black and white Linux logo
                   [*] Standard 16-color Linux logo
                   [*] Standard 224-color Linux logo
    •  
    •  
    •  

    2.LOGO制作
    1).使用png格式图片

    pngtopnm linuxlogo.png > linuxlogo.pnm  //linuxlogo.png为原始图片
    pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
    pnmtoplainpnm linuxlogo224.pnm > logo_linux_clut224.ppm
    •  
    •  
    •  

    2).使用bmp格式图片

    convert logo.bmp linuxlogo.png     //logo.bmp为原始图片
    pngtopnm linuxlogo.png > linuxlogo.pnm
    pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
    pnmtoplainpnm linuxlogo224.pnm > logo_linux_clut224.ppm
    • 1
    • 2
    •  

    其他格式的图片也可以使用图片工具另存为png格式的图片,再按照上述代码执行即可。也可以将上述代码写成脚本,这样使用更方便。把制作好的logo_linux_clut224.ppm拷贝到内核drivers/video/logo/目录下面,删除文件夹下的logo_linux_clut224.o和logo_linux_clut224.c(如果有着两个文件就删除),然后编译烧录即可。

    二、Android 开机动画

    Android5.1的android字样貌似是不能单独更改的,可以用开机动画替换,和5.1之前的版本相比在init.c代码中做了一些改动:

    开机画面显示的重点函数console_init_action()并没有调用load_565rle_image(INIT_image_FILE),即在调用到console_init_action()函数后,指定的开机画面为ANDROID字样。
    load_565rle_image()函数也是不存在的。这就是android 5.1和之前不同之处,这也就说明了android5.1后,”android开机LOGO”不能替换了,只能通过替换开机动画来达到效果。将开机动画替换后,ANDROID字样也随之改变,因此通过直接更换开机动画来达到目的即可。
    开机动画的制作:bootanimation.zip
    将该文件放置在/system/media/目录下,系统启动时会自动加载该目录下的bootanimation.zip。bootanimation.zip压缩包主要由这几部分组成:

    其中desc.txt的作用就是指导系统如何去执行开机动画,desc.txt编写规范:例如开机需要用到两个文件夹part1和part2,在系统启动时,会首先将part1里面的内容播放一遍,再循环播放part2里面的内容,直到要进入launch界面时停止。示例desc.txt内容如下:

    1080 1920代表了屏幕的分辨率,22表示22帧每秒
    p 1 0 part1 :p就是play。1是播放一次,0是无限次。0代表阶段间隔帧数为0,也就是帧动画形式播放图片。part1指定了要播放的第一个文件夹为part1(也可以取别的名称,做相应修改即可)
    p 0 0 part2:第一个0表示循环播放。第二个0表示每张图片间隔帧数为0(和上面指令一样)。part2表示要循环播放的文件夹

    将制作好的文件打包成bootanimation.zip即可,注意:必须是zip格式,且包的大小最好不要超过3M。然后放入/system/media/目录下即可。

    最近在制作开机动画过程中发现添加开机动画后其一直不能显示,经过千辛万苦的寻找最终得出如下结论:
    开机动画zip的压缩尽量在linux环境下进行,在windows或者ubuntu的UI界面下压缩 bootanimation.zip可能会造成开机动画不能显示,在linux下,进入素材目录,执行压缩命令:

    zip -Z store bootanimation.zip part0/*.png part1/*.png desc.txt
    •  

    Windows下打包ZIP也需要进入素材目录。例如:选中part0,part1,desc.txt三个文件,右键选择”添加到压缩文件”,选择”ZIP”压缩,“存储”模式即可。

    展开全文
  • 开机动画

    2019-07-16 03:27:10
    <!doctype html><...<head> <meta charset="UTF-8"> <...开机动画</title> <style> *{ margin: 0; padding: 0; } img{ display: block; } #box{ ...

    <!doctype html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>开机动画</title>
    <style>
    *{
    margin: 0;
    padding: 0;
    }
    img{
    display: block;
    }
    #box{
    position:fixed;
    right: 0;
    bottom: 0;
    }
    .x{
    width: 20px;
    height: 20px;
    position: absolute;
    right: 8px;
    top: 0px;
    }
    </style>
    </head>
    <body>
    <div id="box">
    <div class="top">
    <span class="x"></span>
    <img src="images/t.jpg" alt="">
    </div>
    <div class="bottom"><img src="images/b.jpg" alt=""></div>
    </div>
    </body>
    </html>
    <script>
    window.onload = function(){
    var box =document.getElementById("box");
    var top = box.children[0];
    var bottom = box.children[1];
    var x = top.children[0];
    console.log(top)
    console.log(bottom)
    x.onclick =function(){
    animate(bottom,{height:0},function(){
    animate(box,{width:0})
    })

    }

     

     

     


    function animate(obj,json,fn){

    clearInterval(obj.timer);
    obj.timer=setInterval(function(){
    var flag = true;
    for(var k in json){
    var target = json[k];
    // leader = 当前元素的属性值
    var leader =parseInt(getStyle(obj,k));
    // 缓动公式step =(target - leader)/10 leader = leader + step;
    var step =(target - leader)/10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    leader = leader + step;
    // 赋值给元素
    obj.style[k] = leader +"px";
    if(leader != target){
    flag = false;
    }
    }
    if(flag){
    clearInterval(obj.timer);
    if(fn() !=null){
    fn()
    }
    }
    },20)
    }
    // 获取样式的方法 元素 属性
    function getStyle(obj, attr) {
    if (obj.currentStyle) {
    return obj.currentStyle[attr];
    } else {
    return window.getComputedStyle(obj, null)[attr];
    }
    };
    }

    </script>

    转载于:https://www.cnblogs.com/xiaonvren/p/5431128.html

    展开全文
  • android 开关机动画

    2019-10-11 11:49:41
    开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用“开机动画”这词。...

    开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用“开机动画”这词。

    首先,开机动画的地址:system\media\bootanimation.zip。。。要修改开机动画就是修改bootanimation这个文件。如果说你的手机里没有这个文件,那就是说明你用的是官方原始版本的rom,开机动画没有被修改过,但这不碍事,没有就放一个进去,到时候想换回最原始的开机画面,也可以把bootanimation这个文件删了。官方最原始的开机动画在system\ framework\framework-res.apk\assets\images里面,里面主要是2张图片,高手面可以去研究一下,说不定通过这个文件可以用代码实现动画的过程。

    接下来,说说bootanimation.zip这个文件的结构。bootanimation里面主要包含一个desc.txt以及N个文件夹。而文件夹里面放着的就是你要的开机动画的图片。decs.txt的作用就是指导系统如何去执行你的开机画面。
    下面继续说说desc.txt这个文档要怎么写。
    先看例子,如果我的开机动画要用到2个文件夹,分别是part1和part2,。。。。我希望开机的时候,先把part1里面的图片都播放一遍,然后再循环播放part2里面的文件,直到进入系统。那么decs.txt文档的内容应该如下:
    302 480 5
    p 1 0 part1
    p 0 0 part2

    就这么多,现在解释一下这些命令吧。
    第一行,320 480是代表你屏幕的分辨率,因为我们的胖6是320*480的,这就不多说了。后面的5是说,5帧每秒,不懂的可以这么理解,5是代表一秒钟播放5张图片。就这么简单。
    第二行,p 1 0 part1。p应该是play吧,也就是播放的意思。1是播放一次。0是空指令,就是什么都不做。part1就是说,这条指令是针对part1这个文件夹的。整条指令的意思就是,播放part1里面的图片1次,然后什么都不做,马上进入下一条指令。
    第三行,p 0 0 part2。p依然是播放。第一个0这里是代表循环播放,第二个0和上面第二条指令一样,代表什么也不做。part2也就不多说了。
    至于为什么第一个0为什么是代表循环,只能这么说,这事国际惯例,就像用迅雷的时候,0代表不限制速度一样,系统规定的,你知道就好,别纠结。

    总结公式如下
    第一条指令:屏幕的分辨率(空格)播放频率
    第二条指令:p(空格)播放次数(空格)后续操作(空格)作用文件夹
    第三条指令:同上
    第N条指令:同上
    屏幕分辨率的格式是:宽(空格)高,胖6的就是320 480。。。播放频率,上面已经说清楚了,至于到底要用多大的数字,视你开机动画的张数而定,比如说,一共有100张图片,开机时间是20秒,那么100/20就是5。
    播放次数,1是代表一次,0代表循环播放。如果要播放2次的话,就是就是打个2上去,应该是这样吧,反正我是没试过,只试过0和1.
    后续操作,0代表什么都不做,直接进入下一条指令。10是代表稍作停顿。

    至于文件夹里面的图片,比较简单,首先,纠正一个说法,之前说必须要是png格式,经过我试验证明,jpg格式的也可以,其他的有待试验,不过只支持静态图片这点应该是真的,动态图片同样有待试验。其次,关于图片的尺寸,是不做要求的,只要在txt文档里写好手机的分辨率即可,开机的时候系统会自动适配。其其次要按播放循序命名,建议用5位数字,比如说,第一张图片是00010,第二张就是00020.。。。。为什么要从00010开始,而不是00001?因为这事预防以后要在第一张和第二张中间再插一张图片进去的话,就可以把插进去的图片命名为00011,在00010之后,00020之前。就这么简单。至于图片那里来嘛,当然是自己网上找啦,也可以下载别人的bootanimation,然后修改一下。

    最后就是压缩包了,把需要用到的part文件夹跟decs.txt打包成zip格式,必须是zip,不能是rar,而且打包的时候压缩方式要选择“存储”模式。然后改名成为bootanimation.zip,复制到SD卡里,再通过RE文件管理器复制到system\media\下面,重启。

    要注意一下,bootanimation不能太大,大了会卡,一般不要超过3M,。

     

    ————————————————————————————————————————————————————————————————————————————————————

    1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);
    2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;
    3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

    现在我们说的是第三种方式(基于模拟器):

    android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png图片以动画的形式播放出来。

    首先,我们先来分析一下源码:

    frameworks/base/cmds/bootanimation/BootAnimation.cpp

    首先看一下定义的常量:

    1

    2

    3

    4

    #define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip"

     

    #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"

    #define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip"

    BootAnimation::readyToRun()

    进入一个if判断语句

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    if ((encryptedAnimation &&

                (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) &&

                (mZip.open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) == NO_ERROR)) ||

     

                ((access(USER_BOOTANIMATION_FILE, R_OK) == 0) &&

                (mZip.open(USER_BOOTANIMATION_FILE) == NO_ERROR)) ||

     

                ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) &&

                (mZip.open(SYSTEM_BOOTANIMATION_FILE) == NO_ERROR))) {

            mAndroidAnimation = false;

        }

    BootAnimation::threadLoop()

    1

    2

    3

    4

    5

    if (mAndroidAnimation) {

     r = Android(); // 执行android字体闪动的图片

     } else {

     r = movie(); // 执行bootanimation.zip中提供的动画图片

     }

    1

      

    ==> BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png"
    ==> BootAnimation::movie()会加载bootanimation.zip中的内容

    我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面

    所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了

    如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画

    那两张图片放在./frameworks/base/core/res/assets/images  目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。

    我是用Photoshop直接修改的

    修改完后直接替换,然后再 mmm frameworks/base  , make snod 即可

    以下是我修改后的效果图:

    image

     

    看样子还想那么回事

    接下来我们给系统添加开机声音

    由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎

    首先在BootAnimation.h添加方法的声明和头文件的引用

    1

    2

    #include <media/AudioSystem.h>

    #include <media/mediaplayer.h>

    image

     

    添加方法 void bootMusic();

    image

    然后在BootAnimation.cpp中实现这个方法:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    void BootAnimation::bootMusic()

    {

        int index;

        MediaPlayer* mp = new MediaPlayer();

        if (mp->setDataSource("/system/etc/poweron.wav", NULL) == NO_ERROR) {

            mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);

            mp->prepare();

        }

        AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index);

        if (index != 0) {

            mp->seekTo(0);

            mp->start();

        }

     

    }

    请注意这个目录setDataSource("/system/etc/poweron.wav", NULL)

    其实这个目录是随便写的,你想从哪个目录读这个文件就从哪个目录读好了,但是你要把这个文件放在对应的目录下

    比如,这个目录是system/etc (这个目录是android系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adb shell了,没用的

    其实system/etc这个目录对应的是我们编译后out文件夹下的xxx,然后在system/etc,所以你把poweron.wav放到这里就行了,当然如果你这时再emulaor 也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,make snod一下

    image

    然后和图上一样,你就会生成新的system.img,当然你之前添加的poweron.wav也会自动被编译进去了

    image

     

    然后再修改bootanimation_main.cpp这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调

     

    1

    2

    3

    //play boot music -yp

            BootAnimation *animation = new BootAnimation();

            animation->bootMusic();

     

    image

    修改完这写以后还需要修改Android.mk文件

    因为播放声音还需要引入库

    LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libutils \
    libbinder \
        libui \
         libskia \
        libEGL \
        libGLESv1_CM \
        libgui \
        libmedia

     

    请注意,libmedia是新添加的;

    完事后就ok了,当然还是需要编译的

    mmm  frameworks/base/cmds/bootanimation/

    make snod

     

    大功告成,这样你就成功的添加了开机音乐

    也许有人会问,那android系统自带的那些音乐和铃声在什么地方呢?

    源码目录在framworks/base/data/sounds

    至于编译完成后放到什么地方了那是Android.mk文件上配置的

    不过这里叫AllAudio.mk

    image

    我们可以看到他又包含了很多mk文件,在同一目录下就可以找到,上图中就可以,我们随便打开一个看看

    image

     

    这下你们顿时明白了吧,这些资源编译后都去了神马地方

     

    所以,在刚才添加poweron.wav的时候,其实可以直接把声音资源丢到framworks/base/data/sounds这个目录下

    然后再mk文件中这样修改:

    $(LOCAL_PATH)/poweron.wav:system/etc/poweron.wav \

     

    不用我说,当然是执行mmm还有make snod命令了

     

    其实还有一种办法,如果你不想这么麻烦,你可以之际把poweron.wav 文件丢到./frameworks/base/core/res/assets/sounds下,用的时候怎么用呢?

    加载的时候路径是什么呢?我们看看源码

    我们可以看到之前我们修改的那两张图片是怎么被加载进来的

    image

    而这个方法的两个参数是:

    image

    是不是顿时又明白了?

    原来精髓所在是有个Asset可以使用,这个和上层开发中是一样的,这个文件夹中的东西是不编译的。

    1

    2

    3

    4

    5

    6

    7

    8

    Asset* asset = assets.open(name, Asset::ACCESS_BUFFER);

        if (!asset)

            return NO_INIT;

        SkBitmap bitmap;

        SkImageDecoder::DecodeMemory(asset->getBuffer(false), asset->getLength(),

                &bitmap, SkBitmap::kNo_Config, SkImageDecoder::kDecodePixels_Mode);

        asset->close();

        delete asset;

     

    所以按照这个方法就可以找到poweron.wav 这个文件了,然后修改下bootMusic的代码就可以了。

     

    ——————————————————————————————————————————————————————————————————————————————————

    原创文章,转载请注明出处,谢谢。

    系统通常默认支持开机动画,开机关机铃声服务倒是预先定义了,不过使用时需要在/sysytem/media/下添加相应的音频文件。长按Power键弹出关键选项,关机时也只是显示进度条,而不是我们期望的关机动画同时伴有关机铃声,当然在做二次开发的时候,这些都是可以定制的。下面将逐步分析如何实现这些定制化的需求。

     

    一.    制作开机动画

    开机画面是保存在/system/media的bootanimation.zip,下面分析系统开机画面的构成
    文件名为bootanimation.zip 一定是这个不能修改,里面包含part1 part2文件夹 和desc.txt,part 文件夹里面放的是动画拆分的图片,格式为png, desc.txt里面是播放的设置。
    格式是这样的

    480 800 15
    p 1 0 part0
    p 0 0 part1
    480 800是指显示的分辨率 宽 高
    15是一秒的帧数
    p后面的数字是指播放次数 0为循环,N为播放N次
    后面那位数字 一般为0(空指令), 表示播放一遍后稍作停顿的时间
    part0,part1 为文件夹名
    一般我们只使用part0目录

    图片准备好了,desc.txt里面的命令也准备好了,就可以把他们一起打包压缩成zip格式了。记住,是zip格式,而不是rar格式。另外压缩的时候注意一点,压缩的时候压缩方式要选择存储,否则开机时手机会不认的。当然不至于变砖,只是开机的时候会黑着没动画一直到进入桌面为止。

     

    开机动画的替换也很简单,我们把做好的bootanimation.zip替换掉原来的/system/media/bootanimation.zip文件即可。关机动画其实和开机动画的制作一样,我们命名为shutdownanimation.zip,和bootanimation.zip放在同一目录下。

     

     

     

    二. 开关机动画实现原理

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

    service bootsound /system/bin/mplayer /system/media/bootsound

        user media

        group audio

        oneshot

    //开机铃声服务 /system/media/startupsound是铃声文件

    service startupsound /system/bin/mplayer /system/media/startupsound

        user media

        group audio

        disabled

        oneshot

    //关机铃声服务 /system/media/shutdownsound是关机铃声

    service shutdownsound /system/bin/mplayer /system/media/shutdownsound

        user media

        group audio

        disabled

        oneshot

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

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

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

    service bootanim /system/bin/bootanimation

        user graphics

        group graphics

        disabled

    oneshot

     

     

    当android系统boot时,开始加载动画和开机铃声,其代码位于

    //源文件SurfaceFlinger.cpp

    status_t SurfaceFlinger::readyToRun() {

        

        // start boot animation service

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

        {

            char value[PROPERTY_VALUE_MAX];

            property_get("persist.sys.profile.silent", value, "0");

            if (atoi(value)== 0){

                LOGI("start:persist.sys.profile.silent is soundable");

                // start startupsound service

                property_set("ctl.start","startupsound");//

             } else {

                LOGI("start:persist.sys.profile.silent is silent");

             }

        }

        return NO_ERROR;

    }

     

    当Android完成boot后,关闭动画和开机铃声,代码位于

    //源文件SurfaceFlinger.cpp

    void SurfaceFlinger::bootFinished() {

       const nsecs_t now = systemTime();

       const nsecs_t duration = now - mBootTime;

       LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );

       mBootFinished = true;

       //stop bootanim service

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

       char value[PROPERTY_VALUE_MAX];

       property_get("persist.sys.profile.silent", value, "0");

       if (atoi(value)== 0){

           LOGI("stop:persist.sys.profile.silent is soundable");

           //stop startupsound service

           property_set("ctl.stop","startupsound");

       } else {

           LOGI("stop:persist.sys.profile.silent is silent");

       }

    }

     

    如何理解ctr.start和ctr.stop系统属性?

    每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“ ctl.start ”和“ ctl.stop ”是用来启动和停止服务的。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。想更深入了解Android property系统可以参考博文《(翻译)Android属性系统》

     

    property_set("ctl.start",ServiceName);就是启动ServiceName服务(在init.rc中定义)

    property_set("ctl.stop",ServiceName)相对的是关闭ServiceName服务。

     

     

     

    A启动动画服务

    由于开机动画和关机动画除了播放的动画文件不同,其他的完全一致,这里重复利用/system/bin/bootanimation代码, 仿照开机动画服务,我们新定义关机动画

    service shutdownanim /system/bin/bootanimation -shutdown

        user graphics

        group graphics

        disabled

        oneshot

    唯一要注意的是关机动画使用的/system/bin/bootanimation带了-shutdown参数,这个参数用来区分加载的动画文件为开机还是关机动画。当bootanimation服务启动时,进入/frameworks/base/cmds/bootanimation/bootanimation_main.cpp主函数main

    int main(int argc, char** argv)

    {

    #if defined(HAVE_PTHREADS)

        setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

    #endif

     

        char value[PROPERTY_VALUE_MAX];

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

        int noBootAnimation = atoi(value);

        LOGI_IF(noBootAnimation,  "boot animation disabled");

        if (!noBootAnimation) {

     

            sp<ProcessState> proc(ProcessState::self());

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

     

            // create the animation object

            sp<BootAnimation> boot = new BootAnimation();

            //根据是否有参数,来设置动画对象的isShutdown属性

            if (argc > 1) {

                if (strcmp(argv[1], "-shutdown")==0) {

                    boot->isShutdown(true);

                }

            }

     

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

     

        }

        return 0;

    }

    new BootAnimation();时,如果有参数-shutdown, 则boot->isShutdown(true);方法isShutdown和isShutdown使我们新加的,所以先要在frameworks/base/cmds/bootanimation/bootanimation/BootAnimation.h头文件中申明为public,如下:

    class BootAnimation : public Thread, public IBinder::DeathRecipient

    {

    public:

                    BootAnimation();

        virtual     ~BootAnimation();

     

        sp<SurfaceComposerClient> session() const;

        bool        mShutdown;

    void        isShutdown(bool shutdown);

    …………………………………………….

    }

     

    之后修改BootAnimation.cpp

    //源码位于frameworks/base/cmds/bootanimation/bootanimation/BootAnimation.cpp

    首先在构造函数中初始化mShutdown = false;表示默认是开机标志

    BootAnimation::BootAnimation() : Thread(false)

    {

        mSession = new SurfaceComposerClient();

        mShutdown = false;

    }

    实现isShutdown(bool shutdown);方法

    void BootAnimation::isShutdown(bool shutdown)

    {

        mShutdown = shutdown;

    }

    修改status_t BootAnimation::readyToRun() 方法来根据mShutdown值加载动画文件,如

    status_t BootAnimation::readyToRun() {

    ……………………………………

    mAndroidAnimation = false;

    if (!mShutdown) {

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

        if (err != NO_ERROR) {

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

            if (err != NO_ERROR) {

                mAndroidAnimation = true;

            }

        }

    } else {

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

        if (err != NO_ERROR) {

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

            if (err != NO_ERROR) {

                mAndroidAnimation = true;

            }

        }

        mShutdown = false;

    }

    return NO_ERROR;

    }

    以上是动画定制化C代码部分的全部修改。

     

     

     

    B启动开机铃声服务

    startupsound开机铃声服务,shutdownsound关机铃声服务

    init.rc定义,service startupsound /system/bin/mplayer /system/media/startupsound

    相当于用/system/bin/mplayer对象播放媒体文件/system/media/startupsound,

    init.rc定义,service shutdownsound /system/bin/mplayer /system/media/shutdownsound

    相当于用/system/bin/mplayer对象播放媒体文件/system/media/ shutdownsound.

     

     

    到这里,开机动画和开机铃声是正常的,我们还需要修改的是关机时候的执行流程,因为默认的操作时关机确认后显示进度条。

     

     

     

    C定制Android关机过程

    在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。

         我的目标是长按Power键,将会关机,弹出“设备将要关机”选择对话框。如果可以选择“是”关机,和“否”返回系统。

     

    弹出对话框的代码位于:

    frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java

    长按Power键显示对话框的代码如下:

    Runnable mPowerLongPress = new Runnable() {

        public void run() {

            mShouldTurnOffOnKeyUp = false;

            performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);

            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);

            showGlobalActionsDialog();

        }

    };

    调用showGlobalActionsDialog方法将会显示上面提到的显示“飞行模式”,“静音”,“关机”,选项的对话框。

          关机的代码位于:

    frameworks\policies\base\phone\com\android\internal\policy\impl\GlobalActions.java

    文件的createDialog方法中,有如下代码:

    mItems = Lists.newArrayList(

        // silent mode

        mSilentModeToggle,

        // next: airplane mode

        mAirplaneModeOn,

        // last: power off

        new SinglePressAction(

               com.android.internal.R.drawable.ic_lock_power_off,

               R.string.global_action_power_off) {

                    public void onPress() {

                        // shutdown by making sure radio and power are handled accordingly.

                        ShutdownThread.shutdown(mContext, true);

                    }

     

                    public boolean showDuringKeyguard() {

                        return true;

                    }

     

                    public boolean showBeforeProvisioning() {

                        return true

                    }

                });

    从代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用ShutdownThread的shutdown方法来关机。shutdown方法的第二个参数标识是否弹出询问对话框。

     

    ShutdownThread代码位于

    frameworks/base/core/java/com/android/internal/app/ShutdownThread.java

    shutdown方法中有如下代码

    public static void shutdown(final Context context, boolean confirm) {

        // ensure that only one thread is trying to power down.

        // any additional calls are just returned

        synchronized (sIsStartedGuard){

            if (sIsStarted) {

                Log.d(TAG, "Request to shutdown already running, returning.");

                return;

            }

        }

     

        Log.d(TAG, "Notifying thread to start radio shutdown");

     

        if (confirm) {

            final AlertDialog dialog = new AlertDialog.Builder(context)

                   .setIcon(android.R.drawable.ic_dialog_alert)

                   .setTitle(com.android.internal.R.string.power_off)

                   .setMessage(com.android.internal.R.string.shutdown_confirm)

                   .setPositiveButton(com.android.internal.R.string.yes,

    new DialogInterface.OnClickListener() {

                               public void onClick(DialogInterface dialog, int which) {

                                   beginShutdownSequence(context);

                               }

                        })

                    .setNegativeButton(com.android.internal.R.string.no, null)

                    .create();

     

    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);

            if (!context.getResources().getBoolean(

                 com.android.internal.R.bool.config_sf_slowBlur)) {

    dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

            }

            dialog.show();

        } else {

            beginShutdownSequence(context);

        }

    }

     

    确认关机后开始执行beginShutdownSequence(context),这里就是我们定制关机过程的关键。

     

    修改beginShutdownSequence(context)方法,在方法开头打印Log之后增加如下代码:

    //我们判断如果有关机动画文件,即显示关机动画,否则显示默认的进度条。

    boolean showShutdownAnim = new File("/system/media/shutdownanimation.zip").exists();

        if (showShutdownAnim) {

            Log.d(TAG, "shutdownanim");

            //设置前面说的android系统属性ctr.start即通知属性服务启动关机动画服务

            android.os.SystemProperties.set("ctl.start", "shutdownanim");

        } else {

            // throw up an indeterminate system dialog to indicate radio is

            // shutting down.

            ProgressDialog pd = new ProgressDialog(context);

            pd.setTitle(context.getText(com.android.internal.R.string.power_off));

            pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));

            pd.setIndeterminate(true);

            pd.setCancelable(false);

            pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);

            if (!context.getResources().getBoolean(

                com.android.internal.R.bool.config_sf_slowBlur)) {

                pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

            }

     

            pd.show();

        }

     

        boolean playShutdownSound = new File("/system/media/shutdownsound").exists();

        android.os.SystemProperties.getBoolean("ro.config.enable_shutdownshound", false);

        if (playShutdownSound) {

            // play shutdown sound

            Log.d(TAG, "shutdownsound");

            android.os.SystemProperties.set("ctl.start", "shutdownsound");

    }

    以上就是定制化实现的所有需要修改的地方,想更深入了解Android property系统可以参考博文《(翻译)Android属性系统

     

     

    展开全文
  • 从理论上来说,android 有4个开机启动画面。 第一个应该是U-BOOT的启动画面,有些设备为了满足按动电源即有显示,在UBOOT里加了开机画面,实现的方式当然只能是写物理地址,也因此随厂家不同具体的实现千差万别。...
  • Android开机动画总结

    2020-01-12 11:48:52
    开机动画制作开机动画两个要点启动开机动画开机动画运行过程代码位置运行简介开机动画遇到的问题 制作开机动画两个要点 压缩时选择“存储”模式 资源文件命名序号,需要和最大序号位数相同,位数不够,前面补零。如...
  • android:替换开机动画

    2019-11-18 17:37:55
    开机动画的地址:system\media\bootanimation.zip,要修改开机动画就是修改bootanimation这个文件。如果说你的手机里没有这个文件,那就是说明你用的是官方原始版本的rom,开机动画没有被修改过,但这不碍事,没有...
  • 安卓手机个性开机动画制作(制作属于自己的个性开机动画
  • 开机动画制作及替换

    2020-04-27 09:40:18
    一、开机动画的制作 二、开机动画的替换 一、开机动画的制作 bootanimation.zip制作原理: Android的开机动画是由一系列连续的图片作为帧组成的动画形式,将各帧图片以压缩方式保存。这个保存的文件名就是...
  • 修改android开机动画

    2016-08-24 15:53:09
    最近由于公司需要修改android的开机动画,为了以后便于查看,今天小编拿出来跟大家分享一下。 动画就是一张一张的图片在以一秒放多少张(简称为帧)的速度播放,android动画也是如此。 以下是修改android开机动画...
  • 最近接到一项任务,修改手机的开机动画。 其实这不是什么难事儿,但问题是,客户只提供了手机。 手机是MTK的一款手机,虽然比较贵(价格超过三星Note3),但在我看来跟山寨机木有啥区别。 很冷门的手机,百度谷歌都...
  • 关于开机动画的修改,可以参考Android定制:修改开机启动画面开机动画主要是加载图片,就像动画片一样。在制作bootanimation.zip文件的时候,需要注意应该采用“存储”(store)的方式去打包,不然系统会识别不了...
  • android开机动画制作方法,指导开机动画制作人员正确的制作开机动画
  • 修改开机画面及开机动画说明,以及开机动画包,按照说明步骤,即可修改android开机画面和动画。
  • Win7系统如何关闭开机动画  Win7系统开机动画关闭教程,以前我们说过很多种帮助Win7开机加速的方法,比如减少Win7开机启动的程序、服务或计划任务等。不过这些都优化都是针对已经进入Win7系统后进行的,...
  • 每个手机开机的时候都会有一个开机动画和铃声 不同的开机动画都有不同的效果,不管是OEM还是运营商都会对这个logo有严格的要求,当然,自己如果想DIY制作自己的动画也可以参考下面的方法 通常,animation的文件存放...
  • Win8开机动画

    2020-07-29 14:21:00
    仿Win8 RTM开机动画
  • Android4.4开机动画源码

    2020-07-21 10:00:19
    Android开机动画源码,控制动画图片的显示和开机音乐的播放。
  • Rockchip之RK3288修改开机动画 在机器生产过程中,往往会有写定制服务,就比如现在这个任务,客户需要在我们的机器上定制他自己的开机动画,这是后就需要满足客户需求. 在out/target/product/rk3288/system/media下有一...
1 2 3 4 5 ... 20
收藏数 14,360
精华内容 5,744
关键字:

开机动画