Android平臺Gallery2應用分析(六)---PhotoPage和PhotoView

PhotoPage
PhotoPage的幾個重要成員:

onCreate中創建PhotoView,從傳入的mSetPathString區分創建PhotoDataAdapter還是SinglePhotoDataAdapter。如果從相冊一級級進入,則創建PhotoDataAdapter,如果從文件管理器進入,則創建SinglePhotoDataAdapter。以從相冊進入爲例:
1) 創建PhotoDataAdapter,mPhotoView.setModel(mModel),在PhotoView中setModel除給本身的mModel賦值外,還給mTileView的mModel賦值(mTileView是TileImageView類型)。
2) onResume中,mModel.resume(), mPhotoView.resume(),其中由第一條知道mModel是PhotoDataAdapter類型,轉到PhotoDataAdapter看看做了什麼?
3) PhotoDataAdapter.resume。先執行updateImageCache(),再執行updateImageRequests,最後創建一個ReloadTask並啓動線程。
        3.1) updateImageCache()。取出mImageCache中有解碼任務的Item,釋放內存,如該Item之前並無task,則放入mImageCache中。
        3.2) updateImageRequests()。取出當前的item,sImageFetchSeq是各種解碼方式的靜態數組,在這裏會依次遍歷一遍,執行startTaskIfNeeded(),執行完後,再將task取消釋放內存。
4) startTaskIfNeeded()。因ImageEntry的requestScreenNail和requestedFullImage都是INVALID_DATA_VERSION。所以,都會執行screenNailTask和fullImageTask。
        4.1) entry.screenNailTask = mThreadPool.submit(new ScreenNailJob(item),
                                                    new ScreenNailListener(item));
由ThreadPool的機制可知,會在創建完screenNailJob(item)後,調用run()。在run()中,得到Bitmap bitmap = mItem.requestImage(…).run(jc)。其中,mItem爲LocalImage,調用LocalImage的requestImage後得到解碼後的Bitmap。然後,ThreadPool會調用Listener即screenNailListener的onFeatureDone來通知解碼完成。onFeatureDone發消息給MainThread刷新並調用Listener中的run()函數,執行updateScreenNail。其中有個for循環,依次對圖片做刷新,mPhotoView.notifyImageChange(i)會從mPictures中得到圖片並reload(),這裏對應screenNailPicture,而在reload中會調用setScreenNail(mModel.getScreenNial(mIndex)),mModel從第一條已知是PhotoDataAdapter類型,在getScreenNail中取得緩存的ImageEntry中的圖片解碼數據screenNail。
        4.2) entry.fullImageTask = mThreadPool.submit(new FullImageJob(item),
                                              new FullImageListener(item));
流程和ScreenNailJob、ScreenNailListener類似,差別在於ScreenNail是當前未顯示的圖片,而FullImage是當前顯示的圖片,由mPhotoView.notifyimageChange(0)可以看出。
PhotoView的觸屏代碼流程

歡迎轉載和技術交流,轉載請幫忙註明出處,http://blog.csdn.net/discovery_by_joseph謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章