循環(huán)顯示圖像的原理
<!--[endif]-->
循環(huán)顯示有些類似于循環(huán)鏈表,最后一個(gè)結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)又是第1個(gè)結(jié)點(diǎn)。循環(huán)顯示圖像也可以模擬這一點(diǎn)。
也許細(xì)心的讀者從上一節(jié)實(shí)現(xiàn)的ImageAdapter類中會(huì)發(fā)現(xiàn)些什么。對(duì)!就是getView方法中的position參數(shù)和getCount方法的關(guān)系。position參數(shù)的值是不可能超過getCount方法返回的值的,也就是說,position參數(shù)值的范圍是0至getCount() - 1。
如果這時(shí)Gallery組件正好顯示到最后一個(gè)圖像,position參數(shù)值正好為getCount() - 1。那么我們?nèi)绾卧僮孏allery顯示下一個(gè)圖像呢?也就是說讓position參數(shù)值再增1,對(duì)!將getCount()方法的返回值也增1。
那么這里還有一個(gè)問題,如果position參數(shù)值無限地增加,就意味著resIds數(shù)組要不斷地增大,這樣會(huì)大大消耗系統(tǒng)的資源。想到這,就需要解決兩個(gè)問題:既要position不斷地增加,又讓resIds數(shù)組中保存的圖像資源ID是有限的,該怎么做呢?對(duì)于getCount()方法非常好解決,可以讓getCount方法返回一個(gè)很大的數(shù),例如,Integer.MAX_VALUE。這時(shí)position參數(shù)值就可以隨著Gallery組件的圖像不斷向前移動(dòng)而增大。現(xiàn)在resIds數(shù)組只有15個(gè)元素,如果position的值超過數(shù)組邊界,要想繼續(xù)循環(huán)取得數(shù)組中的元素(也就是說,當(dāng)position的值是15時(shí),取resIds數(shù)組的第0個(gè)元素,是16時(shí)取第1個(gè)元素),最簡(jiǎn)單的方法就是取余,代碼如下:
resIds[position % resIds.length]
在本節(jié)對(duì)ImageAdapter類做了如下兩個(gè)改進(jìn):
1. 使getCount方法返回一個(gè)很大的值。建議返回Integer.MAX_VALUE。
2. 在getView方法中通過取余來循環(huán)取得resIds數(shù)組中的圖像資源ID。
通過上面兩點(diǎn)改進(jìn),可以使圖像列表在向右移動(dòng)時(shí)會(huì)循環(huán)顯示圖像。當(dāng)然,這種方法從本質(zhì)上說只是偽循環(huán),也就是說,如果真把圖像移動(dòng)到getCount方法返回的值那里,那也就顯示到最后一個(gè)圖像的。不過在這里getCount方法返回的是Integer.MAX_VALUE,這個(gè)值超過了20億,除非有人真想把圖像移動(dòng)到第20億的位置,否則Gallery組件看著就是一個(gè)循環(huán)顯示圖像的組件。
本文導(dǎo)航
- 第1頁: 首頁
- 第2頁: 這些圖像的資源ID都保存在int數(shù)組中
- 第3頁: 循環(huán)顯示圖像的原理
- 第4頁: 實(shí)現(xiàn)循環(huán)顯示圖像的Gallery組件
- 第5頁: 本例中Main類的完整代碼