`
竹兰君
  • 浏览: 9881 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

实现关机动画

 
阅读更多

实现关机动画

关机动画和开机动画功能是大体一致的,只是播放的动画不一样而已。

既然关机动画和开机动画如此相似,所以,先了解一下开机动画的流程是怎样的。

. 开机动画的图片存放位置:

1. 默认位置

/development/data/etc/bootanimation.zip

2. 不同的项目存放的位置

/device/qcom/项目名称/bootanimation.zip

二. 开机动画的服务

1. 文件位置

/system/core/rootdir/init.rc

该文件定义了许多的服务,其中就定义了开机动画的服务,代码如下:

service bootanim /system/bin/bootanimation

    user graphics

    group graphics

    disabled

oneshot

以上代码我所理解的含义是这样了,这是个服务。解析之后,会生成一个bootanimation的shell命令, 以后通过adb shell进入系统,执行bootanimation命令之后会启动该服务。至于字符串bootanim,它是唯一标识,用来表示该shell命令。

 

三. 播放动画

1. 文件位置

/frameworks/base/cmds/bootanimation/BootAnimation.cpp

/frameworks/base/cmds/bootanimation/BootAnimation.h 头文件

/frameworks/base/cmds/bootanimation/bootanimation_main.cpp 入口文件

BootAnimation.cpp主要用来读取bootanimation.zip文件,然后播放动画。函数readToRun用来读取动画文件,如下代码:

        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;

            }

        }

 

以上便是开机动画的主要文件,那么,我们该如何实现关机动画呢?

显然,开机动画和关机动画只是读取的动画文件不同而已,那么,在BootAnimation.cpp的函数readToRun中读取动画文件时,需要加入一个标志来判断,如果是开机,则读取开机动画,如果是关机,则读取关机动画。因此,我们我们加入一个bool类型变量mShutdownmShutdown为true表示关机。修改BootAnimation.h头文件,增加变量mShutdown,考虑到外界需要对这个变量进行设值来控制,提供一个函数isShutdown,添加如下申明:

void BootAnimation::isShutdown(bool shutdown);

修改BootAnimation.cpp文件,实现函数isShutdown。实现代码如下:

void BootAnimation::isShutdown(bool shutdown){

    mShutdown = shutdown;

}

另外,修改函数readToRun读取动画文件的部分,实现代码如下:

if(!mShutdown){

        LOGD("boot strap");

        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 {

        LOGD("shutdown");

        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;

    }

代码中可以看出,程序会从/system/media/下读取bootanimation.zip和shutdownanimation.zip文件,因此,先制作一个shutdownanimation.zip文件,参考bootanimation.zip文件,放在路径/development/data/etc/或者/device/qcom/项目名称/目录下。并且修改mk文件。增加如下代码:

device/qcom/xxx/shutdownanimation.zip:system/media/shutdownanimation.zip。

这样才能通过mk命令将此文件shutdownanimation.zip复制到system/media/下,所以代码中是到/system/media/下找相关文件。

另外,尽管变量mShutdown的默认值是false的,但为了保险起见,最好在BootAnimation.cpp的构造函数中人为添加mShutdown = false

至此,播放动画的逻辑完成。接下来,我们该如何做呢?既然,播放动画的逻辑是根据变量mShutdown来控制的。那么,我们该在哪里给变量赋值来达到控制的要求呢?

肯定是在bootanimation_main.cpp文件中,因为它是入口文件,会在BootAnimation.cpp文件之前执行。在bootanimation_main.cppmain函数中对变量进行赋值,以控制BootAnimation.cpp文件中读取的动画文件的不同。那么在bootanimation_main.cppmain函数中我们该根据什么来对变量进行相应的赋值呢?很自然的想到,只能根据main函数的参数来判断了。那么我们该如何给main函数添加参数呢?本文开始处,曾提到,init.rc文件中开机动画的服务。它会生成一个bootanimationshell的命令。实际上,当你adb shell进入系统之后,执行bootanimation时,它会从bootanimation_main.cppmain函数开始执行,进而播放动画。所以,我们只要系统能执行命令bootanimation 参数名即可,当系统关机时,会执行到frameworks/base/core/java/com/android/internal/app/ShutdownThread.java文件中的beginShutdownSequence函数。默认情况下,会弹出ProgressDialog对话框,提示正在关机操作,先将该段代码注释掉,需要在这里添加实现让系统执行命令bootanimation 参数名的功能即可。那么我们该如何让系统执行该命令呢?有两种方法:

第一种:直接调用系统shell的命令

需要使用ProcessBuilder类,该类可以直接操作shell命令。除此之外,还有一些方法,可以上网查询下。将以下代码添加到ShutdownThread.javabeginShutdownSequence函数的注释后面即可。

        String[] cmds = {"bootanimation","-shutdown"};

        try{

            ProcessBuilder builder = new ProcessBuilder(cmds);   

            builder.directory(new File("/")) ;

            builder.redirectErrorStream (true) ;

            builder.start();

        } catch(Exception e) {

            e.printStackTrace();

    }

通过以上代码,系统会执行bootanimation -shutdown的shell命令。在bootanimation_main.cpp文件中main函数需要判断参数名是否是-shutdown,判断是否是关机。修改bootanimation_main.cpp文件如下:

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");

    argc--;

    argv++;

    if (!noBootAnimation) {

 

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

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

        // create the boot animation object  

        sp<BootAnimation> boot = new BootAnimation();

        if (argc > 0) {

            LOGD(argv[0]);

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

                boot->isShutdown(true);

            }

        }

 

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

 

    }

    return 0;

}

 

第二种:在init.rc文件中添加一个类似于开机动画service

代码如下:

service shutdownanim /system/bin/bootanimation -shutdown

    user graphics

    group graphics

Disabled

通过以上代码,shutdownanim代表了bootanimation -shutdown的shell命令。

ShutdownThread.java文件的beginShutdownSequence函数的注释后面添加如下代码:

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

通过该段代码,系统会寻找标识符为shutdownanim的shell命令,然后执行它。

至此,就完成了关机动画的所有功能.(希望此文对大家有帮助,谢谢!)

 

 

 

 

分享到:
评论

相关推荐

    android之关机动画

    Android 之关机动画 ...通过修改 `BootAnimation.cpp` 文件和 `BootAnimation.h` 头文件,我们可以实现关机动画的功能。同时,我们也可以通过修改 `/system/core/rootdir/init.rc` 文件来定义关机动画的服务。

    Android 修改系统关机动画的实现

    最后,在实现关机动画的代码时,有一些注意事项。例如,必须确保在设置自定义`Dialog`之前调用`dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);`,这是保证`Dialog`能正确显示的关键...

    Android(Q)10.0添加关机音乐和关机动画.rar

    在Android系统中,关机音乐和关机动画是提升用户体验的重要元素之一,它们不仅增加了系统的个性化,也使得用户在操作设备时能感受到更多的互动乐趣。本文将深入探讨如何在Android Q (10.0)系统中添加关机音乐和关机...

    开关机动画及图片修改

    总之,开关机动画及图片的修改是一个结合了艺术创意和技术实现的综合过程,它要求开发者具备图像处理能力、动画制作技巧、编程技能,以及对操作系统源码的理解,同时还需要使用各种工具进行开发、调试和测试。

    安卓开关机动画

    总的来说,安卓开关机动画的设计和实现涉及图像处理、动画原理、XML编程、系统级别的资源管理和权限控制等多个方面。理解这些知识点可以帮助开发者或爱好者创建出既美观又流畅的个性化开关机动画。

    MTK切换开关机动画

    MTK切换开关机动画是针对基于MediaTek(MTK)芯片组的Android设备的一个功能,特别是在ICS(Ice Cream Sandwich)系统平台上实现的。MediaTek是一家知名的半导体公司,为各种智能设备提供芯片解决方案,包括智能手机...

    Android开关机动画

    Android开关机动画是Android系统中一个重要的组成部分,它在设备启动和关闭时为用户呈现动态视觉效果,增加了系统的个性化和用户体验。制作精美的开关机动画不仅能够提升品牌形象,也能为用户带来愉悦的操作体验。 ...

    android开关机动画切换

    在Android系统中,开关机动画是用户在启动或关闭设备时看到的一系列动态图像,它不仅为用户提供了视觉反馈,也是品牌识别的一部分。本主题主要关注如何在Android系统中进行开关机动画的切换,这对于特定的移动开发...

    HTC关机动画

    在手机系统中,关机动画通常是通过特定的图像文件和动画脚本实现的,它们被集成到系统的UI框架中。在Android系统中,关机动画通常是由一系列PNG或JPEG图片序列组成的,这些图片在短时间内连续播放,创造出动态的效果...

    android 电视关机动画

    对于电视设备而言,由于其大屏幕和远距离观看的特性,关机动画的设计和实现更需注重细节和流畅性。下面我们将深入探讨Android电视关机动画的相关知识点。 一、Android系统架构与关机动画 Android系统是基于Linux...

    Android开关机动画铃声

    这意味着要实现关机动画和铃声,需要在系统源代码层面进行修改,比如在`init.rc`中启用`shutdownsound`服务,并创建对应的关机动画文件`shutdownanimation.zip`。同时,可能还需要对系统服务进行调整以播放关机铃声...

    展讯6820 android开关机动画和铃声源码

    在Android系统中,开关机动画的实现主要依赖于以下组件: 1. **Bootanimation**: 这是一个特殊的文件格式,包含了一系列的PNG或JPEG图片以及控制这些图片播放的命令。在6820平台上,这些动画可能被定制为专有的...

    Android 12 开关机动画客制化patch

    在这一版本中,开关机动画的制作和修改变得更加灵活,允许开发者或爱好者通过修改特定的代码和资源文件来实现个性化。 "bootanimation"文件是Android开关机动画的核心,它是由一系列PNG图像和控制播放的脚本文件...

    android开关机动画开关机铃声修改方法

    关机动画的定制过程与开机动画类似,也需要通过创建`closesource.mk`文件和相应的动画文件来实现。具体步骤如下: 1. **创建文件**:同样地,在`vendor/ts/boot`目录中创建`shutdownanimation.zip`文件。 2. **...

    javascript实现关机效果,且能拖拽

    然而,我们可以模拟一个关机效果,例如通过改变页面的外观或显示一个模拟关机的动画来实现。这通常会涉及到CSS的过渡和动画效果,以及JavaScript事件监听和定时器的使用。例如,当用户点击一个“关机”按钮时,你...

    js 实现 关机特效(一)

    js 实现 关机特效(一)! 值得下载看看!资源免费,大家分享!!

    CSS3实现的动画开关,效果很炫酷

    【CSS3实现的动画开关详解】 在Web开发中,用户界面的交互性是提升用户体验的重要因素之一。CSS3(Cascading Style Sheets Level 3)的引入为开发者提供了丰富的动画功能,使得创建炫酷的界面元素变得更加容易。本...

    Rockchip 定制开关机铃声和动画说明

    开关机动画是用户与设备互动的重要部分,可以提升用户体验和品牌识别度。文档详细说明了如何在Rockchip平台上定制这些动画。这通常涉及到修改系统资源文件,如图形、动画序列等,并通过Android的框架服务进行集成。...

    开机关机动画

    开机关机动画是智能手机领域中的一个细节之处,它在用户启动设备时展现,提供了一种视觉上的享受和品牌识别度的展示。这些动画不仅仅是一个简单的开始标志,它们往往体现了手机制造商的设计理念和审美风格,更是操作...

Global site tag (gtag.js) - Google Analytics