阅读更多

显示单张图片相关的输入变量

  1. int selectedSlotIndex = mSelectedSlot;
  2.         GridDrawables drawables = mDrawables;
  3.         GridCamera camera = mCamera;
  4.         DisplayItem[] displayItems = mDisplayItems;
  5.         int firstBufferedVisibleSlot = mBufferedVisibleRange.begin;
  6.         int lastBufferedVisibleSlot = mBufferedVisibleRange.end;
  7.         boolean isCameraZAnimating = mCamera.isZAnimating();
复制代码

删除当前选中槽位前后2步之外的大缩略图

  1. for (int i = firstBufferedVisibleSlot; i <= lastBufferedVisibleSlot; ++i) {
  2.             if (selectedSlotIndex != Shared.INVALID && (i >= selectedSlotIndex - 2 && i <= selectedSlotIndex + 2)) {
  3.                 continue;
  4.             }
  5.             DisplayItem displayItem = displayItems[(i - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT];
  6.             if (displayItem != null) {
  7.                 displayItem.clearScreennailImage();
  8.             }
  9.         }
复制代码

得到当前图片的DispalyItem元素

  1. int centerIndexInDrawnArray = (selectedSlotIndex - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
  2.             if (centerIndexInDrawnArray < 0 || centerIndexInDrawnArray >= displayItems.length) {
  3.                 return;
  4.             }
  5.             DisplayItem centerDisplayItem = displayItems[centerIndexInDrawnArray];
  6.             if (centerDisplayItem == null || centerDisplayItem.mItemRef.mId == Shared.INVALID) {
  7.                 return;
  8.             }
复制代码

判断大缩略图是否加载完成

  1. boolean focusItemTextureLoaded = false;
  2.             Texture centerTexture = centerDisplayItem.getScreennailImage(view.getContext());
  3.             if (centerTexture != null && centerTexture.isLoaded()) {
  4.                 focusItemTextureLoaded = true;
  5.             }
复制代码

是否跳过当前图片前一张图片

  1. float camX = camera.mLookAtX * camera.mScale;
  2. float centerTranslateX = centerDisplayItem.mAnimatedPosition.x;
  3.             final boolean skipPrevious = centerTranslateX < camX;
复制代码

开启opengl混合模式并设置混合函数

  1. gl.glEnable(GL11.GL_BLEND);
  2.             gl.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
复制代码

循环遍历前中后三幅图片分别进行“核心绘制处理”

  1. for (int i = -1; i <= 1; ++i) {
  2.                 if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
  3.                     continue;
  4. 。。。
  5. }
复制代码

核心绘制处理——输入变量准备

  1. if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
  2.                     continue;
  3.                 float viewAspect = camera.mAspectRatio;
  4.                 int selectedSlotToUse = selectedSlotIndex + i;
  5.                 if (selectedSlotToUse >= 0 && selectedSlotToUse <= lastBufferedVisibleSlot) {
  6.                     int indexInDrawnArray = (selectedSlotToUse - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
  7.                     if (indexInDrawnArray < 0 || indexInDrawnArray >= displayItems.length) {
  8.                         return;
  9.                     }
  10.                     DisplayItem displayItem = displayItems[indexInDrawnArray];
  11.                     MediaItem item = displayItem.mItemRef;
  12.                     final Texture thumbnailTexture = displayItem.getThumbnailImage(view.getContext(), sThumbnailConfig);
  13.                     Texture texture = displayItem.getScreennailImage(view.getContext());
复制代码

在幻灯模式下且超过1秒的切换时间无须显示前后两张图片;
得到视角和当前displayItem、对应媒体对象、小缩略图材质、大缩略图材质。
加载高质量的材质资源

  1. if (isCameraZAnimating && (texture == null || !texture.isLoaded())) {
  2.                         texture = thumbnailTexture;
  3.                         mSelectedMixRatio.setValue(0f);
  4.                         mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
  5.                     }
  6.                     Texture hiRes = (zoomValue != 1.0f && i == 0 && item.getMediaType() != MediaItem.MEDIA_TYPE_VIDEO) ? displayItem
  7.                             .getHiResImage(view.getContext())
  8.                             : null;
  9.                     if (Gallery.PIXEL_DENSITY > 1.0f) {
  10.                         hiRes = texture;
  11.                     }
  12.                     if (i != 0) {
  13.                         displayItem.clearHiResImage();
  14.                     }
  15.                     if (hiRes != null) {
  16.                         if (!hiRes.isLoaded()) {
  17.                             view.bind(hiRes);
  18.                             view.prime(hiRes, true);
  19.                         } else {
  20.                             texture = hiRes;
  21.                         }
  22.                     }
复制代码

如果Camera正在拉远或拉近,且大缩略图材质为空或未加载完成,则选择小缩略图作为材质,将当前图片的“大缩略图混合比例”变量进行初始化(目标值为1秒,渐变时间为0.75秒,渐变开始时间为当前帧时间)。
如果处于放大状态,则加载原图hiRes,加载成功后赋值给材质变量texture;并清除前后图片的原图。
加载材质

  1. final Texture fsTexture = texture;
  2.                     if (texture == null || !texture.isLoaded()) {
  3.                         if (Math.abs(centerTranslateX - camX) < 0.1f) {
  4.                             if (focusItemTextureLoaded && i != 0) {
  5.                                 view.bind(texture);
  6.                             }
  7.                             if (i == 0) {
  8.                                 view.bind(texture);
  9.                                 view.prime(texture, true);
  10.                             }
  11.                         }
  12.                         texture = thumbnailTexture;
  13.                         if (i == 0) {
  14.                             mSelectedMixRatio.setValue(0f);
  15.                             mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
  16.                         }
  17.                     }
复制代码

保留当前的最佳材质,
如果此材质加载未完成,则继续按优先级加载,并把小缩略图(基本上都已经加载成功了)设置为当前材质;
最佳材质未加载完成之前,替换渐变不会开始。
无须绘制

  1. if (mCamera.isAnimating() || slideshowMode) {
  2.                         if (!slideshowMode && skipPrevious && i == -1) {
  3.                             continue;
  4.                         }
  5.                         if (!skipPrevious && i == 1) {
  6.                             continue;
  7.                         }
  8.                     }
  9.                     int theta = (int) displayItem.getImageTheta();
复制代码

如果相机缩放过程中,非幻灯片模式下且镜头中不需要展示前一张的情况下,无须处理前一张;
如果相机缩放或幻灯片绘制过程中,需要展示前一张的情况下,无须处理后一张。
处理前后渐变绘制

  1. // If it is in slideshow mode, we draw the previous item in
  2.                     // the next item's position.
  3.                     if (slideshowMode && timeElapsedSinceView < 1.0f && timeElapsedSinceView != 0) {
  4.                         if (i == -1) {
  5.                             int nextSlotToUse = selectedSlotToUse + 1;
  6.                             if (nextSlotToUse >= 0 && nextSlotToUse <= lastBufferedVisibleSlot) {
  7.                                 int nextIndexInDrawnArray = (nextSlotToUse - firstBufferedVisibleSlot)
  8.                                         * GridLayer.MAX_ITEMS_PER_SLOT;
  9.                                 if (nextIndexInDrawnArray >= 0 && nextIndexInDrawnArray < displayItems.length) {
  10.                                     float currentImageTheta = displayItem.mAnimatedImageTheta;
  11.                                     displayItem = displayItems[nextIndexInDrawnArray];
  12.                                     backupImageTheta = displayItem.mAnimatedImageTheta;
  13.                                     displayItem.mAnimatedImageTheta = currentImageTheta;
  14.                                     view.setAlpha(1.0f - timeElapsedSinceView);
  15.                                 }
  16.                             }
  17.                         } else if (i == 0) {
  18.                             displayItem.mAnimatedImageTheta = backupImageTheta;
  19.                             view.setAlpha(timeElapsedSinceView);
  20.                         }
  21.                     }
复制代码

如果处于幻灯片模式中 渐变过程中,处理上一幅相片时找到它的下一个DispalyItem,处理本张相片则直接使用当前DispalyItem,为的是同样找到当前DisplayItem,并绑定上一张相片和本张相片,两张相片透明度互补达到渐变的效果。
绘制小大缩略图渐变过程-小缩略图

  1. int vboIndex = i + 1;
  2.                         float alpha = view.getAlpha();
  3.                         float selectedMixRatio = mSelectedMixRatio.getValue(view.getFrameTime());
  4.                         if (selectedMixRatio != 1f) {
  5.                             texture = thumbnailTexture;
  6.                             view.setAlpha(alpha * (1.0f - selectedMixRatio));
  7.                         }
  8.                         GridQuad quad = GridDrawables.sFullscreenGrid[vboIndex];
  9.                         float u = texture.getNormalizedWidth();
  10.                         float v = texture.getNormalizedHeight();
  11.                         float imageWidth = texture.getWidth();
  12.                         float imageHeight = texture.getHeight();
  13.                         boolean portrait = ((theta / 90) % 2 == 1);
  14.                         if (portrait) {
  15.                             viewAspect = 1.0f / viewAspect;
  16.                         }
  17.                         quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
  18.                         quad.bindArrays(gl);
  19.                         
  20.                         drawDisplayItem(view, gl, displayItem, texture, PASS_FOCUS_CONTENT, null, 0.0f);
  21.                         quad.unbindArrays(gl);
复制代码

绘制小缩略图,请注意:selectedMixRatio表示大缩略图的绘制透明度,小缩略图的自然就是1.0f - selectedMixRatio。
绘制小大缩略图渐变过程-大缩略图

  1. if (selectedMixRatio != 0.0f && selectedMixRatio != 1.0f) {
  2.                             texture = fsTexture;
  3.                             if (texture != null) {
  4.                                 float drawAlpha = selectedMixRatio;
  5.                                 view.setAlpha(alpha * drawAlpha);
  6.                                 u = texture.getNormalizedWidth();
  7.                                 v = texture.getNormalizedHeight();
  8.                                 imageWidth = texture.getWidth();
  9.                                 imageHeight = texture.getHeight();
  10.                                 quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
  11.                                 quad.bindArrays(gl);
  12.                                 drawDisplayItem(view, gl, displayItem, fsTexture, PASS_FOCUS_CONTENT, null, 1.0f);
  13.                                 quad.unbindArrays(gl);
  14.                             }
  15.                         }
复制代码

更新当前图片长宽数据

  1. if (i == 0 || slideshowMode) {
  2.                             mCurrentFocusItemWidth = quad.getWidth();
  3.                             mCurrentFocusItemHeight = quad.getHeight();
  4.                             if (portrait) {
  5.                                 // Swap these values.
  6.                                 float itemWidth = mCurrentFocusItemWidth;
  7.                                 mCurrentFocusItemWidth = mCurrentFocusItemHeight;
  8.                                 mCurrentFocusItemHeight = itemWidth;
  9.                             }
  10.                         }
复制代码

绘制视频元素

  1. view.setAlpha(alpha);
  2.                         if (item.getMediaType() == MediaItem.MEDIA_TYPE_VIDEO) {
  3.                             // The play graphic overlay.
  4.                             GridDrawables.sVideoGrid.bindArrays(gl);
  5.                             drawDisplayItem(view, gl, displayItem, drawables.mTextureVideo, PASS_VIDEO_LABEL, null, 0);
  6.                             GridDrawables.sVideoGrid.unbindArrays(gl);
  7.                         }

更多相关文章

  1. Android拍照上传功能示例代码
  2. Android DEX反编译后部分代码解析
  3. android: 大量开源项目源代码分享
  4. android重启代码
  5. android 发布正式版时用Gradle移除日志打印代码(添加混淆配置)
  6. [置顶] android studio 如何进行格式化代码 快捷键必备

随机推荐

  1. Linux操作系统的I2C驱动
  2. linux查看硬件信息及驱动设备相关整理
  3. xshell连接linux与windows连接与传文件
  4. Linux进程通信[2]-互斥锁和条件变量
  5. linux运行命令缺少依赖库的查找方法
  6. 64位win 7装Linux虚拟机(RedHat)
  7. 看谁能找出bug★☆open函数总是返回-1
  8. linux报错之--->export `=' not a valid
  9. shell脚本let命令在windows下编辑后上传
  10. Linux下Tomcat开启查看GC信息