`
hbczzsw
  • 浏览: 41856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Gallery3D中画图时调用glTranslate函数参数赋值过程

J# 
阅读更多
GridDrawManager::drawDisplayItem(RenderView view, GL11 gl, DisplayItem displayItem, Texture texture, int pass,Texture previousTexture, float mixRatio) 函数有下面几句:
      
Java代码 复制代码
  1. Vector3f animatedPosition = displayItem.mAnimatedPosition;   
  2.         float translateXf = animatedPosition.x * camera.mOneByScale;   
  3.         float translateYf = animatedPosition.y * camera.mOneByScale;   
  4.         float translateZf = -animatedPosition.z;  
Vector3f animatedPosition = displayItem.mAnimatedPosition;
        float translateXf = animatedPosition.x * camera.mOneByScale;
        float translateYf = animatedPosition.y * camera.mOneByScale;
        float translateZf = -animatedPosition.z;

调用过程:
->computeVisibleItems(),displayItems[baseIndex + j] = displayItem;Vector3f position = pool.create(); GridCameraManager.getSlotPositionForSlotIndex(i, camera, layout, deltaAnchorPosition, position);//give position value  displayList.setPositionAndStackIndex(displayItem, position, j, true);//raletive position to item

->GridLayer, mDrawManager = new GridDrawManager(context, mCamera, mDrawables, sDisplayList, sDisplayItems, sDisplaySlots);
->GridDrawManager(), mDisplayItems = displayItems;
->drawFocusItems ,DisplayItem[] displayItems = mDisplayItems;
->animatedPosition = displayItem.mAnimatedPosition;
->drawDisplayItem, amAnimatedPosition
->DisplayItem::commit()  amAnimatedPosition.set(mTargetPosition);
-> DisplayItem::set(Vector3f position, int stackIndex, boolean performTransition) mTargetPosition.z =


Java代码 复制代码
  1. public void getPositionForSlotIndex(int slotIndex, int itemWidth, int itemHeight, Vector3f outPosition) {   
  2.         outPosition.x = (slotIndex / mNumRows) * (itemWidth + mSpacingX);   
  3.         outPosition.y = (slotIndex % mNumRows) * (itemHeight + mSpacingY);   
  4.         int maxY = (mNumRows - 1) * (itemHeight + mSpacingY);   
  5.         outPosition.y -= (maxY >> 1);   
  6.         outPosition.z = 0;   
  7.         Log.d("outPosition","slotIndex="+slotIndex+",mNumRows="+mNumRows+",outPosition=("+outPosition.x+","+outPosition.y+","+outPosition.z+")");   
  8.     }  
public void getPositionForSlotIndex(int slotIndex, int itemWidth, int itemHeight, Vector3f outPosition) {
        outPosition.x = (slotIndex / mNumRows) * (itemWidth + mSpacingX);
        outPosition.y = (slotIndex % mNumRows) * (itemHeight + mSpacingY);
        int maxY = (mNumRows - 1) * (itemHeight + mSpacingY);
        outPosition.y -= (maxY >> 1);
        outPosition.z = 0;
        Log.d("outPosition","slotIndex="+slotIndex+",mNumRows="+mNumRows+",outPosition=("+outPosition.x+","+outPosition.y+","+outPosition.z+")");
    }


在gallery3d中矩阵是从上到下、从左到右排列的,在主界面时最多有3行,mNumRows=3,在缩略图界面最多4行mNumRows=4,在查看界面只有一行mNumRows=1
上面函数是计算所绘制项位置的,slotIndex / mNumRows得到的是当前处于多少列,slotIndex % mNumRows得到的是处于多少行。 int maxY = (mNumRows - 1) * (itemHeight + mSpacingY);
        outPosition.y -= (maxY >> 1);是为了在y方向对称,想成屏幕中间是分界线,以上的项y为负,线以下的y为正。
deltaAnchorPosition的赋值过程:
Java代码 复制代码
  1. int currentlyVisibleSlotIndex = getAnchorSlotIndex(ANCHOR_CENTER);->anchorItem = displayItem.mItemRef;-> newSlotIndex = i;->if (currentAnchorSlotIndex != Shared.INVALID && newAnchorSlotIndex != Shared.INVALID) {   
  2.                 layout.getPositionForSlotIndex(newAnchorSlotIndex, itemWidth, itemHeight, deltaAnchorPosition);   
  3.                 oldLayout.getPositionForSlotIndex(currentAnchorSlotIndex, itemWidth, itemHeight, currentSlotPosition);   
  4.                 currentSlotPosition.subtract(sDeltaAnchorPosition);   
  5.                 deltaAnchorPosition.subtract(currentSlotPosition);   
  6.                 deltaAnchorPosition.y = 0;   
  7.                 deltaAnchorPosition.z = 0;   
  8.             }  
int currentlyVisibleSlotIndex = getAnchorSlotIndex(ANCHOR_CENTER);->anchorItem = displayItem.mItemRef;-> newSlotIndex = i;->if (currentAnchorSlotIndex != Shared.INVALID && newAnchorSlotIndex != Shared.INVALID) {
                layout.getPositionForSlotIndex(newAnchorSlotIndex, itemWidth, itemHeight, deltaAnchorPosition);
                oldLayout.getPositionForSlotIndex(currentAnchorSlotIndex, itemWidth, itemHeight, currentSlotPosition);
                currentSlotPosition.subtract(sDeltaAnchorPosition);
                deltaAnchorPosition.subtract(currentSlotPosition);
                deltaAnchorPosition.y = 0;
                deltaAnchorPosition.z = 0;
            }


MediaFeed::run()
onFeedChanged(, onLayout(newSlotIndex, currentlyVisibleSlotIndex, null);
onLayout,  sDeltaAnchorPositionUncommited.set(deltaAnchorPosition);
computeVisibleRange(),sDeltaAnchorPosition.set(sDeltaAnchorPositionUncommited);
deltaAnchorPosition.set(sDeltaAnchorPosition);
deltaAnchorPosition
分享到:
评论
1 楼 huchunming2010 2011-04-28  
deltaAnchorPosition这个变量作用?OnFeedChanged这个方法较为复杂,onlayout这个方法的作用也不是很清楚,请否加QQ781649477讨论

相关推荐

Global site tag (gtag.js) - Google Analytics