Gallery3d 学习笔记(6)
繼續講解前,我們先回顧一下前面5節的分析。
首先在開機或者加載外部存儲器時,在mediaprivder里面receiver會得到廣播消息,receiver開啟服務進行掃描,生成數據庫,并在T卡上生成縮略圖臨時文件,
然后在第一個Activity里面有兩個關于opengl的成員,RenderView和作為Root Layer 的GridLayer成員,并且關聯了RenderView和Root Layer,并且在Activity里面通過調用RenderView的同名成員函數的辦法,將按鍵響應以及渲染的暫停和繼續同Activity同步關聯。
而RenderView在刷新時,通過調用generate接口,生成Root層的,Root層調用generate接口生成背景層和Hud層,同樣的辦法Hud層生成其他的層,并將RendView保存到自己的成員變量中。
而這些層又分成了幾個類,放在幾個層的列表中,決定哪些層響應點擊事件,哪些層透明。
現在我們要分析的問題是,界面和層是如何關聯的,又是如何切換的?
這個問題比較多,會花幾個部分解決。
我們先探討一個小的問提,我們先使用下Gallery3d ,你會發現長按鍵后可以標記相冊或者單一圖片或者視頻。
說明Gallery3d里面又兩種模式,普通模式和選擇模式對應的代碼是在HudLayer中:
public final class HudLayer extends Layer {public static final int MODE_NORMAL = 0;public static final int MODE_SELECT = 1;那么在關鍵的HudLayer中又用了兩個方法來讀取和設置模式 int getMode() {return mMode;}void setMode(int mode) {if (mMode != mode) {mMode = mode;updateViews();}}
在哪里調用的呢
public void enterSelectionMode() {// Do not enter selection mode if the feed is about to change.if (mGridLayer.feedAboutToChange())return;// Disable sharing if it is the pick intent.if (mGridLayer.getPickIntent()) {mSingleViewIntentBottomMenu = mSingleViewIntentBottomMenuNoShare;mNormalBottomMenu = mNormalBottomMenuNoShare;}setAlpha(1.0f);setMode(HudLayer.MODE_SELECT);// if we are in single view mode, show the bottom menu without the// delete button.if (mGridLayer.noDeleteMode()) {mSelectionMenuBottom.setMenus(mSingleViewIntentBottomMenu);} else {mSelectionMenuBottom.setMenus(mNormalBottomMenu);}}public void cancelSelection() {mSelectionMenuBottom.close();closeSelectionMenu();setMode(MODE_NORMAL);}
就是通過HudLayer中的進入選擇模式和退出選擇模式來切換模式的和菜單的顯示。那么從用戶長按又是如何到enterSelectMode函數的呢?
首先觸摸是各個層里面處理的,而按鍵都是Root Layer處理的,誰是Root Layer,當然是GridLayer,我們看下GridLayer是如何處理的
@Overridepublic boolean onTouchEvent(MotionEvent event) {return mInputProcessor.onTouchEvent(event);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (mInputProcessor != null)return mInputProcessor.onKeyDown(keyCode, event, mState);return false;}說明所有GridLayer的按鍵和觸摸都交給了一個叫做mInputProcessor的成員去處理了。對應的是
GridInputProcessor類
那么,我們重新整理下思路:
用戶長按 Activity --> 因為Acitvity中的觸摸是層里面處理的,所以給了根層GridLayer去處理,而GridLayer嫌麻煩,另外寫了一個類GridInputProcessor的成員處理,而再這個類中,調用通過傳進來的GridLayer上下文和方法 getHud獲得了Hud層的對象,然后調用他的enterSelectionMode方法,將狀態設置成了選擇模式。
長按和處理我們看完了,其他的拖動和點擊請自己再分析下,作為今天的作業吧,呵呵。
那么我們再來看GridLayer界面的顯示,再構造函數我們可以看到下面的代碼。
大家還記得RenderView里面對三組層的列表進行的統一刷新么?
其中對opaque層是怎么刷新的,使用的是一個循環,加上調用層的renderOpaque方法,那么我們來看這個里面是否有?我們看GridLayer層的刷新函數
在這里面,我們找到了實質性刷界面的函數
ComputerVisibleItem();計算可見項目
mDrawManager.prepareDraw準備工作
mDrawManager.drawThumnails畫縮略圖
在這里我們看到了縮略圖顯示刷新,但是還有一些疑問,數據從哪里來的,而且這里只有一個界面的顯示,其他的界面如何顯示的?下次探討吧。
總結
以上是生活随笔為你收集整理的Gallery3d 学习笔记(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曾国藩的正面与侧面
- 下一篇: 微信电脑版字体模糊(或文字太小)怎么调整