- 浏览: 924583 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
Android Gallery3d源码学习总结(一)——绘制流程drawFocusItems
- 博客分类:
- Android应用开发
显示单张图片相关的输入变量
- int selectedSlotIndex = mSelectedSlot;
- GridDrawables drawables = mDrawables;
- GridCamera camera = mCamera;
- DisplayItem[] displayItems = mDisplayItems;
- int firstBufferedVisibleSlot = mBufferedVisibleRange.begin;
- int lastBufferedVisibleSlot = mBufferedVisibleRange.end;
- boolean isCameraZAnimating = mCamera.isZAnimating();
删除当前选中槽位前后2步之外的大缩略图
- for (int i = firstBufferedVisibleSlot; i <= lastBufferedVisibleSlot; ++i) {
- if (selectedSlotIndex != Shared.INVALID && (i
>= selectedSlotIndex - 2 && i <= selectedSlotIndex + 2)) {
- continue;
- }
- DisplayItem displayItem = displayItems[(i - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT];
- if (displayItem != null) {
- displayItem.clearScreennailImage();
- }
- }
得到当前图片的DispalyItem元素
- int centerIndexInDrawnArray = (selectedSlotIndex - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
- if (centerIndexInDrawnArray < 0 || centerIndexInDrawnArray >= displayItems.length) {
- return;
- }
- DisplayItem centerDisplayItem = displayItems[centerIndexInDrawnArray];
- if (centerDisplayItem == null || centerDisplayItem.mItemRef.mId == Shared.INVALID) {
- return;
- }
判断大缩略图是否加载完成
- boolean focusItemTextureLoaded = false;
- Texture centerTexture = centerDisplayItem.getScreennailImage(view.getContext());
- if (centerTexture != null && centerTexture.isLoaded()) {
- focusItemTextureLoaded = true;
- }
是否跳过当前图片前一张图片
- float camX = camera.mLookAtX * camera.mScale;
- float centerTranslateX = centerDisplayItem.mAnimatedPosition.x;
- final boolean skipPrevious = centerTranslateX < camX;
开启opengl混合模式并设置混合函数
- gl.glEnable(GL11.GL_BLEND);
- gl.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
循环遍历前中后三幅图片分别进行“核心绘制处理”
- for (int i = -1; i <= 1; ++i) {
- if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
- continue;
- 。。。
- }
核心绘制处理——输入变量准备
- if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
- continue;
- float viewAspect = camera.mAspectRatio;
- int selectedSlotToUse = selectedSlotIndex + i;
- if (selectedSlotToUse >= 0 && selectedSlotToUse <= lastBufferedVisibleSlot) {
- int indexInDrawnArray = (selectedSlotToUse - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
- if (indexInDrawnArray < 0 || indexInDrawnArray >= displayItems.length) {
- return;
- }
- DisplayItem displayItem = displayItems[indexInDrawnArray];
- MediaItem item = displayItem.mItemRef;
- final Texture thumbnailTexture = displayItem.getThumbnailImage(view.getContext(), sThumbnailConfig);
- Texture texture = displayItem.getScreennailImage(view.getContext());
在幻灯模式下且超过1秒的切换时间无须显示前后两张图片;
得到视角和当前displayItem、对应媒体对象、小缩略图材质、大缩略图材质。
加载高质量的材质资源
- if (isCameraZAnimating && (texture == null || !texture.isLoaded())) {
- texture = thumbnailTexture;
- mSelectedMixRatio.setValue(0f);
- mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
- }
- Texture hiRes = (zoomValue != 1.0f && i
== 0 && item.getMediaType() != MediaItem.MEDIA_TYPE_VIDEO) ?
displayItem
- .getHiResImage(view.getContext())
- : null;
- if (Gallery.PIXEL_DENSITY > 1.0f) {
- hiRes = texture;
- }
- if (i != 0) {
- displayItem.clearHiResImage();
- }
- if (hiRes != null) {
- if (!hiRes.isLoaded()) {
- view.bind(hiRes);
- view.prime(hiRes, true);
- } else {
- texture = hiRes;
- }
- }
如果Camera正在拉远或拉近,且大缩略图材质为空或未加载完成,则选择小缩略图作为材质,将当前图片的“大缩略图混合比例”变量进行初始化(目标值为1秒,渐变时间为0.75秒,渐变开始时间为当前帧时间)。
如果处于放大状态,则加载原图hiRes,加载成功后赋值给材质变量texture;并清除前后图片的原图。
加载材质
- final Texture fsTexture = texture;
- if (texture == null || !texture.isLoaded()) {
- if (Math.abs(centerTranslateX - camX) < 0.1f) {
- if (focusItemTextureLoaded && i != 0) {
- view.bind(texture);
- }
- if (i == 0) {
- view.bind(texture);
- view.prime(texture, true);
- }
- }
- texture = thumbnailTexture;
- if (i == 0) {
- mSelectedMixRatio.setValue(0f);
- mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
- }
- }
保留当前的最佳材质,
如果此材质加载未完成,则继续按优先级加载,并把小缩略图(基本上都已经加载成功了)设置为当前材质;
最佳材质未加载完成之前,替换渐变不会开始。
无须绘制
- if (mCamera.isAnimating() || slideshowMode) {
- if (!slideshowMode && skipPrevious && i == -1) {
- continue;
- }
- if (!skipPrevious && i == 1) {
- continue;
- }
- }
- int theta = (int) displayItem.getImageTheta();
如果相机缩放过程中,非幻灯片模式下且镜头中不需要展示前一张的情况下,无须处理前一张;
如果相机缩放或幻灯片绘制过程中,需要展示前一张的情况下,无须处理后一张。
处理前后渐变绘制
- // If it is in slideshow mode, we draw the previous item in
- // the next item's position.
- if (slideshowMode && timeElapsedSinceView < 1.0f && timeElapsedSinceView != 0) {
- if (i == -1) {
- int nextSlotToUse = selectedSlotToUse + 1;
- if (nextSlotToUse >= 0 && nextSlotToUse <= lastBufferedVisibleSlot) {
- int nextIndexInDrawnArray = (nextSlotToUse - firstBufferedVisibleSlot)
- * GridLayer.MAX_ITEMS_PER_SLOT;
- if (nextIndexInDrawnArray >= 0 && nextIndexInDrawnArray < displayItems.length) {
- float currentImageTheta = displayItem.mAnimatedImageTheta;
- displayItem = displayItems[nextIndexInDrawnArray];
- backupImageTheta = displayItem.mAnimatedImageTheta;
- displayItem.mAnimatedImageTheta = currentImageTheta;
- view.setAlpha(1.0f - timeElapsedSinceView);
- }
- }
- } else if (i == 0) {
- displayItem.mAnimatedImageTheta = backupImageTheta;
- view.setAlpha(timeElapsedSinceView);
- }
- }
如果处于幻灯片模式中 渐变过程中,处理上一幅相片时找到它的下一个DispalyItem,处理本张相片则直接使用当前DispalyItem,为的是同样找到当前DisplayItem,并绑定上一张相片和本张相片,两张相片透明度互补达到渐变的效果。
绘制小大缩略图渐变过程-小缩略图
- int vboIndex = i + 1;
- float alpha = view.getAlpha();
- float selectedMixRatio = mSelectedMixRatio.getValue(view.getFrameTime());
- if (selectedMixRatio != 1f) {
- texture = thumbnailTexture;
- view.setAlpha(alpha * (1.0f - selectedMixRatio));
- }
- GridQuad quad = GridDrawables.sFullscreenGrid[vboIndex];
- float u = texture.getNormalizedWidth();
- float v = texture.getNormalizedHeight();
- float imageWidth = texture.getWidth();
- float imageHeight = texture.getHeight();
- boolean portrait = ((theta / 90) % 2 == 1);
- if (portrait) {
- viewAspect = 1.0f / viewAspect;
- }
- quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
- quad.bindArrays(gl);
-
- drawDisplayItem(view, gl, displayItem, texture, PASS_FOCUS_CONTENT, null, 0.0f);
- quad.unbindArrays(gl);
绘制小缩略图,请注意:selectedMixRatio表示大缩略图的绘制透明度,小缩略图的自然就是1.0f - selectedMixRatio。
绘制小大缩略图渐变过程-大缩略图
- if (selectedMixRatio != 0.0f && selectedMixRatio != 1.0f) {
- texture = fsTexture;
- if (texture != null) {
- float drawAlpha = selectedMixRatio;
- view.setAlpha(alpha * drawAlpha);
- u = texture.getNormalizedWidth();
- v = texture.getNormalizedHeight();
- imageWidth = texture.getWidth();
- imageHeight = texture.getHeight();
- quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
- quad.bindArrays(gl);
- drawDisplayItem(view, gl, displayItem, fsTexture, PASS_FOCUS_CONTENT, null, 1.0f);
- quad.unbindArrays(gl);
- }
- }
更新当前图片长宽数据
- if (i == 0 || slideshowMode) {
- mCurrentFocusItemWidth = quad.getWidth();
- mCurrentFocusItemHeight = quad.getHeight();
- if (portrait) {
- // Swap these values.
- float itemWidth = mCurrentFocusItemWidth;
- mCurrentFocusItemWidth = mCurrentFocusItemHeight;
- mCurrentFocusItemHeight = itemWidth;
- }
- }
绘制视频元素
- view.setAlpha(alpha);
- if (item.getMediaType() == MediaItem.MEDIA_TYPE_VIDEO) {
- // The play graphic overlay.
- GridDrawables.sVideoGrid.bindArrays(gl);
- drawDisplayItem(view, gl, displayItem, drawables.mTextureVideo, PASS_VIDEO_LABEL, null, 0);
- GridDrawables.sVideoGrid.unbindArrays(gl);
- }
发表评论
-
Android JNI 编程常见小问题
2015-09-08 11:31 1224extern "C" { jint Jav ... -
Android ServiceManager注册自定义service
2015-08-19 09:53 4164当我们要使用android的系统服务时,一般都是使用Conte ... -
Android ALMP 架设web服务器配置
2014-10-08 18:48 1487随着信息时代的发展,智能手机已经越来越普及。下面本文将带大家把 ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10004一、一个BUG引发的问题 ... -
Android XP MTP支持
2014-03-18 16:41 2319家里电脑是win7,连上直接豌豆荚装驱动就好了。但单位的XP却 ... -
Android Launcher2 icon大小修改
2012-08-16 19:12 6057不同分辨率、不同屏幕的不同设备,android 原生的Laun ... -
android 浏览器APN切换
2012-04-16 16:42 2342业务需求:有些链接需 ... -
android 浏览器全屏显示
2012-04-16 16:40 4914业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在 ... -
Android MD5校验码的生成与算法实现
2012-03-05 15:05 20369在Java中,java.security.MessageDi ... -
Android View的xml属性
2012-02-27 13:25 2832java.lang.Object andro ... -
Android Gallery3D源码学习总结(三)——Cache缓存及数据处理流程
2011-12-29 11:04 4698第一,在应用程序中有三个线程存在:主线程(随activity的 ... -
Android Gallery3d源码学习总结(二)——绘制流程drawThumbnails
2011-12-29 11:02 2925此函数控制相册表格页 ... -
Android Gallery 3D 特效精华
2011-12-29 10:45 5334Android Gallery 3D 特效精华 一、布 ... -
Android:AppWidget,PendingIntent,RemoteViews用法
2011-11-25 10:09 5917什么是AppWidget?AppWidget就是我们平常在 ... -
Android软件汉化/精简/去广告教程
2011-08-23 12:32 2924前言: 现在随处都可以找到功能强大的汉化工具,操作简 ... -
Android ListView页眉页脚效果
2011-07-06 14:07 2682大家都知道,在我们调用ListView的addFooterVi ... -
Android 获取设备信息
2011-06-22 21:09 7961)android 获取设备型号、OS版本号: imp ... -
Android 应用安装设置
2011-05-31 16:18 1903应用程序的默认安装位置以及是否可移动取决于该程序的开发者的配置 ... -
Android Activity去除标题栏和状态栏
2011-05-31 13:10 40483一、在代码中设置 public void onCreate( ... -
Android最佳实践之响应灵敏性
2011-05-16 14:44 1363Android最佳实践之响应灵敏性 可能会存在这样 ...
相关推荐
总之,Android Gallery3D的源码是一个丰富的学习资源,它涵盖了Android开发的多个关键领域,包括3D图形编程、数据管理、性能优化、用户交互设计以及项目构建。对于希望提升Android开发技能的工程师来说,深入研究这...
例如,"gallery3d源码学习总结(一)——绘制流程drawFocusItems"可能是关于如何在焦点变化时绘制选中项的详细解析;"gallery3d源码学习总结(二)——绘制流程drawThumbnails"可能涵盖了如何绘制缩略图的步骤,这...
总结,Gallery3D作为Android平台上的一个开源项目,其源码为我们揭示了高效3D图片浏览应用的实现原理,包括数据加载、3D渲染、UI设计和性能优化等多个方面的知识。通过深入学习和理解,开发者不仅能提升自己的...
《深入剖析Android Gallery3D源码》 在Android操作系统中,Gallery3D是一款经典的图片浏览应用,它以其高效、流畅的用户体验而广受好评。本文将深入探讨Gallery3D的源码,帮助开发者理解其背后的实现原理,进一步...
总的来说,通过分析Gallery3D的源码,我们可以学习到如何构建一个高性能、用户体验优秀的图库应用。它在图像处理、内存管理、用户交互、性能优化和资源管理等方面提供了丰富的实践经验。对于任何希望深入了解Android...
**Android Gellary3D 源码解析** Android Gellary3D 是一个用于展示图像的3D画廊应用,它提供了丰富的用户体验,让用户能够以立体的方式浏览和管理手机中的图片。源代码中包含了实现这一功能的核心算法、UI设计以及...
本文将深入剖析Android 2.3.3版本中的图库应用——Gallery3D的源码,帮助开发者了解其工作原理,从而更好地运用到自己的项目中。 Gallery3D是一款高性能、优化过的图片浏览应用,它展示了Android平台上的3D图像处理...
详情请参阅 在Eclipse中编译运行Android4.3应用源码——Launcher2和Gallery2 http://blog.csdn.net/klpchan/article/details/11843295
android gallery3d源码,我测试过了,可以正常运行,希望对大家有用。
总结来说,Gallery3D作为Android平台的一款经典应用,其源码提供了丰富的学习资源,涵盖了Android应用开发的多个重要方面,包括UI设计、数据管理、图形渲染、性能优化等。深入研究并实践这些知识点,对于任何Android...
《安卓Android源码——Gallery2解析》 在安卓开发领域,深入理解源码是提升技能的重要途径之一。这里我们关注的是“Gallery2”模块,它是Android系统中的一个图像浏览应用,主要用于展示和管理用户的照片。Gallery2...
Gallery3D是Android操作系统中的一款强大的3D图像查看应用,专为用户提供了独特的三维浏览体验。它不仅是一款高效的图片管理工具,还利用了Android设备的硬件加速功能,实现了流畅的3D动画效果,让用户在手机和平板...
Gallery3D源码分析
在源码中,CustomGalleryLikeiPhone(3D相册)可能是一个自定义的Android Gallery视图。Android的Gallery组件是一个可滚动的选择器,通常用于显示一系列的图片或项目。然而,原生的Gallery组件不支持3D效果,因此...
《安卓Android源码——Gallery3D深度解析》 在安卓Android的世界里,源码是开发者探索系统奥秘、提升应用性能、实现个性化定制的关键。本文将深入探讨“Gallery3D”这一组件的源码,帮助读者理解其工作原理,从而在...
在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...
Gallery应用作为系统内置的图片查看器,它的源码对于我们理解Android图像处理、UI设计以及性能优化具有极高的学习价值。本文将深入探讨Android 4.0 Gallery源码,揭示其内部的工作机制和设计思想。 1. **架构设计**...
在Android平台上,"android ...总的来说,"android gallery3D" 是一个结合了3D视觉效果、性能优化和用户体验设计的Android应用实例,对于希望学习Android高级图像处理和3D渲染的开发者来说,这是一个值得研究的项目。
3. **自定义View**:由于原生的`Gallery`组件在新版本中不再支持3D效果,开发者需要创建一个自定义的`View`或者继承`ViewGroup`,并重写`onDraw()`方法来绘制3D效果。在这个过程中,可能需要用到`Canvas`的旋转方法`...
Android 4.0 Gallery3D源码分析 Gallery3D是Android系统中一个经典的3D图像浏览应用,尤其在Android 4.0(冰淇淋三明治)版本中,它提供了流畅且富有视觉冲击力的用户体验。这个源码是开发者深入理解Android 3D图像...