生活随笔
收集整理的這篇文章主要介紹了
开机动画desc.txt描述文件的分析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自? https://blog.csdn.net/u010753159/article/details/51356331
1 desc.txt文件格式分析
desc.txt文件由若干行組成,每一行代表一種描述。下面以一個(gè)具體的例子為例,具體說(shuō)明
[html] view plaincopy
480?640?20??p?1?0?folder1??p?2?20?folder2??c?0?0?folder3??c?1?0?folder4?????
第1行用來(lái)描述開(kāi)機(jī)動(dòng)畫(huà)在屏幕顯示的大小及速度。具體為:開(kāi)機(jī)動(dòng)畫(huà)的寬度為480個(gè)像素,高度為640個(gè)像素,顯示頻率為每秒20幀,即每幀顯示1/20秒。
下面的每一行代表一個(gè)片段,顯示的時(shí)候會(huì)按照順序從上到下依次顯示。第1個(gè)字符為片段類(lèi)型,有'c'和'p'兩種,兩者的區(qū)別后面會(huì)結(jié)合代碼說(shuō)明。
第2個(gè)數(shù)字為該片段重復(fù)顯示的次數(shù),如果為‘0’,表示會(huì)無(wú)限重復(fù)顯示;第3個(gè)數(shù)字為兩次顯示之間的間隔,單位為第一行中定義的每幀顯示的時(shí)間;第4個(gè)字符串為該片段所在的文件夾,一個(gè)片段可以由多個(gè)png圖片組成,都存放在folder文件夾中。
“p 1 0 folder1”代表該片段顯示1次,與下一個(gè)片段間隔0s,該片段的顯示圖片路徑為bootanimation.zip/folder1。
“p 2 20 folder2”代表該片段顯示2次,且兩次之間顯示的間隔為20*(1/20)=1s,與下一個(gè)片段間隔20*(1/20)=1s,該片段的顯示圖片路徑為bootanimation.zip/folder2。
“c 0 0 folder3”代表該片段無(wú)限循環(huán)顯示,且兩次顯示的間隔為0s,與下一個(gè)片段間隔0s,該片段的顯示圖路徑為bootanimation.zip/folder3。
“c 1 10 folder4”代表該片段顯示1次,顯示后暫停10*(1/20)=0.5s,該片段的顯示圖路徑為bootanimation.zip/folder4。
2 "p"片段和“c”片段的區(qū)別
在早期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]);??????????????????.......????????.....??}??
里面的主要參數(shù)和函數(shù)說(shuō)嗎如下:
pcount---顯示片段的數(shù)量,比如上面的例子,pcount=4
p.count---該片段的重復(fù)顯示次數(shù)。
fcount---該片段中png圖片的數(shù)量
exitPending()---如果SurfaceFlinger服務(wù)通知bootanimation停止顯示動(dòng)畫(huà),則該函數(shù)返回值為true,否則為false。
第一個(gè)for循環(huán)用于順序顯示所有片段,第二個(gè)for循環(huán)用于重復(fù)顯示該片段,第三個(gè)for循環(huán)用于順序顯示該片段中所有的png圖片。
分析代碼,可知:若exitPending()返回值為true,即SurfaceFlinger服務(wù)要求bootanimation停止顯示動(dòng)畫(huà),則不管當(dāng)前顯示到哪個(gè)片段或png圖片,都會(huì)導(dǎo)致退出for循環(huán),從而停止開(kāi)機(jī)動(dòng)畫(huà)的顯示。
在Android5.1中,加入了“c”片段。對(duì)與以"c"標(biāo)識(shí)的片段,即使exitPending()返回值為true,也會(huì)繼續(xù)顯示。
我們分析一下源碼,首先看一下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,則會(huì)break。即:當(dāng)SurfaceFlinger服務(wù)要求bootanimation停止顯示動(dòng)畫(huà)時(shí),以‘p’標(biāo)識(shí)的片段會(huì)停止,而以'c'標(biāo)識(shí)的片段會(huì)繼續(xù)顯示。這就是兩者之間的主要區(qū)別。
這里有個(gè)問(wèn)題:重復(fù)循環(huán)顯示的'c'標(biāo)識(shí)片段,會(huì)不受任何約束的一直顯示下去,這顯然是不合適的。
于是在第二個(gè)for循環(huán)體最后,有如下代碼:
[html] view plaincopy
//?For?infinite?parts,?we've?now?played?them?at?least?once,?so?perhaps?exit????????????????if(exitPending()?&&?!part.count)????????????????????break;???
意思是,如果檢測(cè)到SurfaceFlinger服務(wù)要求bootanimation停止顯示,且該片段的顯示次數(shù)為'0',即重復(fù)循環(huán)顯示,則會(huì)break停止顯示。
我猜想"c"標(biāo)識(shí)的意思是continue,即:即使SurfaceFlinger要求bootanimation停止動(dòng)畫(huà),bootanimation也不會(huì)立刻停止動(dòng)畫(huà),它會(huì)等c標(biāo)識(shí)片段都顯示完畢后,再停止。
這樣,我們可以利用'c'和'p'片段的區(qū)別,設(shè)計(jì)出更靈活的開(kāi)機(jī)動(dòng)畫(huà)。
總結(jié)
以上是生活随笔為你收集整理的开机动画desc.txt描述文件的分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。