日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开机动画desc.txt描述文件的分析

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开机动画desc.txt描述文件的分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自? https://blog.csdn.net/u010753159/article/details/51356331


1 desc.txt文件格式分析

desc.txt文件由若干行組成,每一行代表一種描述。下面以一個具體的例子為例,具體說明

[html] view plaincopy
  • 480?640?20??
  • p?1?0?folder1??
  • p?2?20?folder2??
  • c?0?0?folder3??
  • c?1?0?folder4??
  • ???
  • 第1行用來描述開機動畫在屏幕顯示的大小及速度。具體為:開機動畫的寬度為480個像素,高度為640個像素,顯示頻率為每秒20幀,即每幀顯示1/20秒。

    下面的每一行代表一個片段,顯示的時候會按照順序從上到下依次顯示。第1個字符為片段類型,有'c'和'p'兩種,兩者的區別后面會結合代碼說明。

    第2個數字為該片段重復顯示的次數,如果為‘0’,表示會無限重復顯示;第3個數字為兩次顯示之間的間隔,單位為第一行中定義的每幀顯示的時間;第4個字符串為該片段所在的文件夾,一個片段可以由多個png圖片組成,都存放在folder文件夾中。

    “p 1 0 folder1”代表該片段顯示1次,與下一個片段間隔0s,該片段的顯示圖片路徑為bootanimation.zip/folder1。

    “p 2 20 folder2”代表該片段顯示2次,且兩次之間顯示的間隔為20*(1/20)=1s,與下一個片段間隔20*(1/20)=1s,該片段的顯示圖片路徑為bootanimation.zip/folder2。

    “c 0 0 folder3”代表該片段無限循環顯示,且兩次顯示的間隔為0s,與下一個片段間隔0s,該片段的顯示圖路徑為bootanimation.zip/folder3。

    “c 1 10 folder4”代表該片段顯示1次,顯示后暫停10*(1/20)=0.5s,該片段的顯示圖路徑為bootanimation.zip/folder4。

    2 "p"片段和“c”片段的區別

    在早期Android版本中只有“p”片段,且movie()中的顯示代碼如下:

    [html] view plaincopy
  • for?(int?i=0?;?i<pcount?&&?!exitPending()?;?i++)?{????
  • ????????const?Animation::Part&?part(animation.parts[i]);????
  • ????????const?size_t?fcount?=?part.frames.size();????
  • ????????glBindTexture(GL_TEXTURE_2D,?0);????
  • ????
  • ????????for?(int?r=0?;?!part.count?||?r<part.count?;?r++)?{????
  • ????????????for?(int?j=0?;?j<fcount?&&?!exitPending();?j++)?{????
  • ????????????????const?Animation::Frame&?frame(part.frames[j]);????
  • ??
  • ????????????.......??
  • ??
  • ????.....??
  • }??
  • 里面的主要參數和函數說嗎如下:

    pcount---顯示片段的數量,比如上面的例子,pcount=4

    p.count---該片段的重復顯示次數。

    fcount---該片段中png圖片的數量
    exitPending()---如果SurfaceFlinger服務通知bootanimation停止顯示動畫,則該函數返回值為true,否則為false。

    第一個for循環用于順序顯示所有片段,第二個for循環用于重復顯示該片段,第三個for循環用于順序顯示該片段中所有的png圖片。

    分析代碼,可知:若exitPending()返回值為true,即SurfaceFlinger服務要求bootanimation停止顯示動畫,則不管當前顯示到哪個片段或png圖片,都會導致退出for循環,從而停止開機動畫的顯示。

    在Android5.1中,加入了“c”片段。對與以"c"標識的片段,即使exitPending()返回值為true,也會繼續顯示。

    我們分析一下源碼,首先看一下movie()中解析desc.txt的代碼:

    [html] view plaincopy
  • //?Parse?the?description?file????
  • for?(;;)?{????
  • ????......???
  • ????if?(sscanf(l,?"%d?%d?%d?%d",?&width,?&height,?&fps,?&flg)?>=?3)?{????
  • ????????animation.width?=?width;????
  • ????????animation.height?=?height;????
  • ????????animation.fps?=?fps;????
  • ????}????
  • ????else?if?(sscanf(l,?"?%c?%d?%d?%s?#%6s",?&pathType,?&count,?&pause,?path,?color)?>=?4)?{????
  • ????????Animation::Part?part;????
  • ????????part.playUntilComplete?=?pathType?==?'c';????
  • ????????part.count?=?count;????
  • ????????part.pause?=?pause;????
  • ????????part.path?=?path;????
  • ????????part.audioFile?=?NULL;????
  • ????????if?(!parseColor(color,?part.backgroundColor))?{????
  • ????????????ALOGE(">?invalid?color?'#%s'",?color);????
  • ????????????part.backgroundColor[0]?=?0.0f;????
  • ????????????part.backgroundColor[1]?=?0.0f;????
  • ????????????part.backgroundColor[2]?=?0.0f;????
  • ????????}????
  • ????????animation.parts.add(part);????
  • ????}????
  • ??
  • ????s?=?++endl;????
  • }??
  • 可以看到,如果pathType==‘c’,part.playUntilComplete等于true,否則為false。接著,看一下顯示代碼:
    [html] view plaincopy
  • for?(size_t?i=0?;?i<pcount?;?i++)?{????
  • ????????const?Animation::Part&?part(animation.parts[i]);????
  • ????????const?size_t?fcount?=?part.frames.size();????
  • ????????glBindTexture(GL_TEXTURE_2D,?0);????
  • ????
  • ????????for?(int?r=0?;?!part.count?||?r<part.count?;?r++)?{????
  • ????????????//?Exit?any?non?playuntil?complete?parts?immediately????
  • ????????????if(exitPending()?&&?!part.playUntilComplete)????
  • ????????????????break;????
  • ???
  • ????????????......??
  • ??
  • ????????????for?(size_t?j=0?;?j<fcount?&&?(!exitPending()?||?part.playUntilComplete)?;?j++)?{????
  • ??????????????????
  • ????????......??
  • ????
  • ????????????????checkExit();????
  • ????????????}????
  • ????
  • ????????????usleep(part.pause?*?ns2us(frameDuration));????
  • ????
  • ????????????//?For?infinite?parts,?we've?now?played?them?at?least?once,?so?perhaps?exit????
  • ????????????if(exitPending()?&&?!part.count)????
  • ????????????????break;????
  • ????????}????
  • ????
  • ????????......????
  • ????}???
  • 可以看到,如果exitPending()返回值為true且part.playUntilComplete=false,則會break。即:當SurfaceFlinger服務要求bootanimation停止顯示動畫時,以‘p’標識的片段會停止,而以'c'標識的片段會繼續顯示。這就是兩者之間的主要區別。

    這里有個問題:重復循環顯示的'c'標識片段,會不受任何約束的一直顯示下去,這顯然是不合適的。
    于是在第二個for循環體最后,有如下代碼:

    [html] view plaincopy
  • //?For?infinite?parts,?we've?now?played?them?at?least?once,?so?perhaps?exit????
  • ????????????if(exitPending()?&&?!part.count)????
  • ????????????????break;???
  • 意思是,如果檢測到SurfaceFlinger服務要求bootanimation停止顯示,且該片段的顯示次數為'0',即重復循環顯示,則會break停止顯示。


    我猜想"c"標識的意思是continue,即:即使SurfaceFlinger要求bootanimation停止動畫,bootanimation也不會立刻停止動畫,它會等c標識片段都顯示完畢后,再停止。

    這樣,我們可以利用'c'和'p'片段的區別,設計出更靈活的開機動畫。



    總結

    以上是生活随笔為你收集整理的开机动画desc.txt描述文件的分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。