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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Gallery3d 学习笔记(6)

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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類


這個類又是如何處理的呢?

public void onLongPress(MotionEvent e) {if (mZoomGesture)return;if (mLayer.getFeed() != null && mLayer.getFeed().isSingleImageMode()) {HudLayer hud = mLayer.getHud();hud.getPathBar().setHidden(true);hud.getMenuBar().setHidden(true);if (hud.getMode() != HudLayer.MODE_NORMAL)hud.setMode(HudLayer.MODE_NORMAL);}if (mCurrentFocusSlot != Shared.INVALID) {vibrateLong();GridLayer layer = mLayer;if (layer.getState() == GridLayer.STATE_FULL_SCREEN) {layer.deselectAll();}HudLayer hud = layer.getHud();hud.enterSelectionMode();layer.addSlotToSelectedItems(mCurrentFocusSlot, true, true);}}

那么,我們重新整理下思路:


用戶長按 Activity --> 因為Acitvity中的觸摸是層里面處理的,所以給了根層GridLayer去處理,而GridLayer嫌麻煩,另外寫了一個類GridInputProcessor的成員處理,而再這個類中,調用通過傳進來的GridLayer上下文和方法 getHud獲得了Hud層的對象,然后調用他的enterSelectionMode方法,將狀態設置成了選擇模式。


長按和處理我們看完了,其他的拖動和點擊請自己再分析下,作為今天的作業吧,呵呵。


那么我們再來看GridLayer界面的顯示,再構造函數我們可以看到下面的代碼。


mCameraManager = new GridCameraManager(mCamera);mDrawManager = new GridDrawManager(context, mCamera, mDrawables, mDisplayList, mDisplayItems, mDisplaySlots);mInputProcessor = new GridInputProcessor(context, mCamera, this, mView, mTempVec, mDisplayItems);



mDrawManager就是負責界面的顯示的。我們仔細看下。


大家還記得RenderView里面對三組層的列表進行的統一刷新么?


其中對opaque層是怎么刷新的,使用的是一個循環,加上調用層的renderOpaque方法,那么我們來看這個里面是否有?我們看GridLayer層的刷新函數


// Renders the node in a given pass.public void renderOpaque(RenderView view, GL11 gl) {GridCamera camera = mCamera;int selectedSlotIndex = mInputProcessor.getCurrentSelectedSlot();computeVisibleItems();gl.glMatrixMode(GL11.GL_MODELVIEW);gl.glLoadIdentity();GLU.gluLookAt(gl, -camera.mEyeX, -camera.mEyeY, -camera.mEyeZ, -camera.mLookAtX, -camera.mLookAtY, -camera.mLookAtZ,camera.mUpX, camera.mUpY, camera.mUpZ);view.setAlpha(1.0f);if (mSelectedAlpha != 1.0f) {gl.glEnable(GL11.GL_BLEND);gl.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);view.setAlpha(mSelectedAlpha);}if (selectedSlotIndex != Shared.INVALID) {mTargetAlpha = 0.0f;} else {mTargetAlpha = 1.0f;}mDrawManager.prepareDraw(mBufferedVisibleRange, mVisibleRange, selectedSlotIndex, mInputProcessor.getCurrentFocusSlot(),mInputProcessor.getCurrentScaledSlot(), mInputProcessor.isFocusItemPressed(), mInputProcessor.getScale(),mInputProcessor.getScaleGestureDetector(), mFeedAboutToChange);if (mSelectedAlpha != 0.0f) {mDrawManager.drawThumbnails(view, gl, mState);}if (mSelectedAlpha != 1.0f) {gl.glDisable(GL11.GL_BLEND);}// We draw the selected slotIndex.if (selectedSlotIndex != Shared.INVALID) {mDrawManager.drawFocusItems(view, gl, mZoomValue, mSlideshowMode, mTimeElapsedSinceView);mCurrentFocusItemWidth = mDrawManager.getFocusQuadWidth();mCurrentFocusItemHeight = mDrawManager.getFocusQuadHeight();}view.setAlpha(mSelectedAlpha);}

在這里面,我們找到了實質性刷界面的函數

ComputerVisibleItem();計算可見項目

mDrawManager.prepareDraw準備工作

mDrawManager.drawThumnails畫縮略圖


在這里我們看到了縮略圖顯示刷新,但是還有一些疑問,數據從哪里來的,而且這里只有一個界面的顯示,其他的界面如何顯示的?下次探討吧。



總結

以上是生活随笔為你收集整理的Gallery3d 学习笔记(6)的全部內容,希望文章能夠幫你解決所遇到的問題。

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