1. 程式人生 > >Android4.0.3修改啟動動畫和開機聲音[轉載]

Android4.0.3修改啟動動畫和開機聲音[轉載]

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
  首先看一下定義的常量:#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判斷語句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()if (mAndroidAnimation) {
  r = Android(); // 執行android字型閃動的圖片
  } else {
  r = movie(); // 執行bootanimation.zip中提供的動畫圖片
  }
  ==> 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 即可
  以下是我修改後的效果圖:
[img][/img]
  看樣子還想那麼回事
  接下來我們給系統新增開機聲音
  由於動畫是在BootAnimation播放的,所以我們的聲音肯定也在這個類中做,照貓畫虎
  首先在BootAnimation.h新增方法的宣告和標頭檔案的引用#include
  #include
[img][/img]
  新增方法 void bootMusic();
[img][/img]
  然後在BootAnimation.cpp中實現這個方法: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)