- 浏览: 1384568 次
- 性别:
- 来自: 陕西.西安
文章分类
最新评论
-
dare_:
经过试验 设置之后反而更慢没有调用ensureCapacity ...
ensureCapacity()方法提高ArrayList的初始化速度 -
wangchao9053:
[flash=200,200][url][img][list] ...
Only the original thread that created a view hierarchy can touch its views的相关 -
cyb504:
考虑将rb文件代码隐藏:我先使用命令jrubyc将所有rb文件 ...
Ruby学习十 JRuby中调用java代码 -
4562xse3460:
大哥,您这个写反了,差点误导我,我觉得看着就不对。百度第一条就 ...
portrait表示纵向,landscape表示横向 -
yin138:
portrait是肖像画,即竖屏,landscape是风景画, ...
portrait表示纵向,landscape表示横向
eoe·Android开发者门户
标题: gallery3d源码学习总结(一)——绘制流程drawFocusItems [打印本页]
作者: specialbrian 时间: 2010-10-29 20:15 标题: gallery3d源码学习总结(一)——绘制流程drawFocusItems
本帖最后由 specialbrian 于 2010-11-4 07:59 编辑
显示单张图片相关的输入变量
- 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);
- }
【此部分讲解已结束】,如您对其他部分感兴趣请回帖说明
作者: lily0314 时间: 2010-11-1 10:53
本帖最后由 lily0314 于 2010-11-19 15:55 编辑
写的挺好啊,谢谢啦!
作者: lily0314 时间: 2010-11-1 11:15
GridLayer和HudLayer分别是负责什么的?
作者: specialbrian 时间: 2010-11-1 11:26
回复 3# lily0314
HudLayer是交互控件图层,GridLayer是动画元素层。
作者: lily0314 时间: 2010-11-1 14:30
谢谢啦,能否详细讲讲drawBlendedComponents和drawThumbnails方法?
作者: lily0314 时间: 2010-11-1 15:04
STATE_TIMELINE(GridLayer中的)是什么状态?能否截图?
作者: lily0314 时间: 2010-11-1 17:19
你好,我还想请问一下从打开软件,到呈现出文件夹界面,经过了哪些过程?图片的坐标是固定的吗?随着重力感应和手指滑动,位置会有细微的小位移,用什么方法呢?是改变视点还是怎样?具体的代码是怎样呢?
作者: specialbrian 时间: 2010-11-2 09:51
本帖最后由 specialbrian 于 2010-11-2 09:53 编辑
回复 6# lily0314
[attach]12020[/attach]
图片附件: device.png (2010-11-2 09:53, 359.51 KB) / 下载次数 1
http://www.eoeandroid.com/forum.php?mod=attachment&aid=MTIwMjR8MWI5NzVmYWN8MTMwMTYyMzkxNnw0ODEyMzA%3D
作者: lily0314 时间: 2010-11-2 10:17
回复 8# specialbrian
噢,同一个文件夹内,按时间分类的界面啊,为什么我看不到这种界面?是需要怎样触发呢?
那么STATE_MEDIA_SETS是刚打开时候的主界面(有文件夹的),STATE_GRID_VIEW是缩略图矩阵浏览的界面,对吗?
作者: specialbrian 时间: 2010-11-2 14:24
回复 9# lily0314
你的理解没错,不过我习惯管STATE_MEDIA_SETS叫做相册表格页,STATE_GRID_VIEW是相片表格页,时间分类页在相片表格页的右上角控件控制,详见我图中的红色标记
作者: lily0314 时间: 2010-11-2 14:54
回复 10# specialbrian
非常感谢!不知我之前的问题有没有可解?
作者: eoe-android-com 时间: 2010-11-2 15:29
想了解一下 缓存管理那一块的
CacheService类 ,以及怎么进行异步加载的呢 以及缓存文件的的写入读取的过程
特别是DCIM\.thumbnails\.thumbdata3--1967290299 缩略图文件是如何创建的
可否 详细的讲解一下呢 谢谢
如果方便的话可否加QQ:907288406交流一下
作者: specialbrian 时间: 2010-11-2 15:43
回复 11# lily0314
正在汇总整理当中,估计今明两天给出响应帖子
作者: lily0314 时间: 2010-11-2 16:05
回复 13# specialbrian
呵呵谢谢啦,我就是看到哪,想到一些问题,就问你了,很期待你的讲解!
作者: lily0314 时间: 2010-11-2 16:55
本帖最后由 lily0314 于 2010-11-2 16:57 编辑
HudLayer.java文件中的MODE_NORMAL和MODE_SELECT是指哪些模式呢?是不是普通的模式和标记选中模式?我偶然能到标记选中模式下,但是不知道是怎么触发的,想请教下,可否有截图?
作者: specialbrian 时间: 2010-11-2 21:28
回复 5# lily0314
已经写了另一篇帖子,写了下drawThumbnails
http://www.eoeandroid.com/viewthread.php?tid=41731&extra=
作者: specialbrian 时间: 2010-11-2 21:31
回复 15# lily0314
是的,你的理解完全正确。出发多选的方式是长按一个相册或相片。
作者: specialbrian 时间: 2010-11-3 17:10
回复 12# eoe-android-com
第三篇文章
http://www.eoeandroid.com/viewthread.php?tid=41920&extra=
写了大体流程,如有疑问请提到这个帖子中吧
作者: eoe-android-com 时间: 2010-11-8 15:43
回复 18# specialbrian
非常感谢
作者: xiaomeigu330 时间: 2010-12-7 13:31
非常好,学习中。。。
作者: kuanbaobei 时间: 2010-12-8 11:45
楼主,你太帅了!能否把你对gallery3d的学习笔记,提供打包下载呢?真是讲的太好了!
作者: specialbrian 时间: 2010-12-30 14:38
目前只有这三篇:gallery3d源码学习总结(一)(二)(三),留下我的QQ:634589207
作者: contentroot 时间: 2011-1-24 11:46
问个问题。
大缩略图是做什么用的?
我跟代码没看到运行过呀?
作者: MEYEGG 时间: 2011-2-22 19:06
:):):)
作者: lzl26689 时间: 2011-3-7 17:39
谢谢啦
作者: qiuxueming 时间: 2011-3-7 18:38
不错,做个记号
欢迎光临 eoe·Android开发者门户 (http://www.eoeandroid.com/) | Powered by Discuz! X1.5 |
发表评论
-
Android检查是否已经连接到网络
2012-05-14 15:40 1243http://blog.csdn.net/kerenigma/ ... -
Android Framework系列之IMF(二)
2011-06-02 10:09 2197InputConnection是IMF里面一个重要的接口,他是 ... -
Android Frameworks系列之IMF(一)
2011-06-02 10:03 1880http://www.pin5i.com/showtopic- ... -
Android线程优先级设置方法
2011-05-28 14:15 3545http://blog.sina.com.cn/s/blog_ ... -
如何连接android数据库
2011-05-27 15:18 2301http://zhidao.baidu.com/questio ... -
ensureCapacity()方法提高ArrayList的初始化速度
2011-05-27 14:33 11563http://www.gznc.edu.cn/yxsz/jjg ... -
java的isAlive 和 join
2011-05-27 13:38 1597join()用于停止当前线程而运行别的线程。 isAli ... -
Linux系统下.ko文件是什么文件?.so文件是什么文件?
2011-05-25 18:55 5587.so 文件是动态链接库文件,相当于 win下的 .dll ... -
使用Geocoder
2011-05-11 10:46 61977.6 使用Geocoder 地理编 ... -
Gallery学习总结--Cache缓存及数据处理流程
2011-05-09 14:21 2198http://hi.baidu.com/%D6%C7%B4%E ... -
关注的网站
2011-04-06 14:37 1050http://blog.sina.com.cn/s/blog_ ... -
gallery3d源码学习总结(二)
2011-04-01 10:40 3534http://www.j2megame.com/htm ... -
Android 启动过程详解(学习1)
2011-03-31 09:27 2242Android 启动过程详解 http://blog.csd ... -
Android中的WatchDog (2)
2011-03-31 09:11 1087http://wenku.baidu.com/view/09c ... -
Android平台WindowManager运用
2011-03-30 10:00 1815Android平台WindowManager运用 我们A ... -
JPEG Rotation and EXIF Orientation
2011-03-17 14:26 3924http://blog.csdn.net/daisyhd/ar ... -
Android 的动作、广播、类别等标识大全
2011-03-11 10:19 1322Android 的动作、广播、类别等标识大全 Stri ... -
浅析Android MediaProvider之二
2011-03-08 08:27 2679http://www.poemcode.net/2010/01 ... -
Task和Activity相关
2011-02-28 09:21 1564Task和Activity相关 这段时间在做一个项目,发 ... -
android的PowerManager和PowerManager.WakeLock
2011-02-25 15:45 2633前言 学习android一段时间了,为了进一步了解and ...
相关推荐
例如,"gallery3d源码学习总结(一)——绘制流程drawFocusItems"可能是关于如何在焦点变化时绘制选中项的详细解析;"gallery3d源码学习总结(二)——绘制流程drawThumbnails"可能涵盖了如何绘制缩略图的步骤,这...
总之,Android Gallery3D的源码是一个丰富的学习资源,它涵盖了Android开发的多个关键领域,包括3D图形编程、数据管理、性能优化、用户交互设计以及项目构建。对于希望提升Android开发技能的工程师来说,深入研究这...
总的来说,通过分析Gallery3D的源码,我们可以学习到如何构建一个高性能、用户体验优秀的图库应用。它在图像处理、内存管理、用户交互、性能优化和资源管理等方面提供了丰富的实践经验。对于任何希望深入了解Android...
总结,Gallery3D作为Android平台上的一个开源项目,其源码为我们揭示了高效3D图片浏览应用的实现原理,包括数据加载、3D渲染、UI设计和性能优化等多个方面的知识。通过深入学习和理解,开发者不仅能提升自己的...
《深入剖析Android Gallery3D源码》 在Android操作系统中,Gallery3D是一款经典的图片浏览应用,它以其高效、流畅的用户体验而广受好评。本文将深入探讨Gallery3D的源码,帮助开发者理解其背后的实现原理,进一步...
《安卓Android源码——Gallery3D深度解析》 在安卓Android的世界里,源码是开发者探索系统奥秘、提升应用性能、实现个性化定制的关键。本文将深入探讨“Gallery3D”这一组件的源码,帮助读者理解其工作原理,从而在...
Gallery3D源码分析
《Gallery3D源码分析详解》 Gallery3D是一款基于OpenGL进行界面绘制的高效图片浏览应用,它的设计和实现方式与传统的Android应用有着显著的区别。本文将深入探讨Gallery3D的核心概念、线程架构、控件系统以及渲染...
本文将深入剖析Android 2.3.3版本中的图库应用——Gallery3D的源码,帮助开发者了解其工作原理,从而更好地运用到自己的项目中。 Gallery3D是一款高性能、优化过的图片浏览应用,它展示了Android平台上的3D图像处理...
总结来说,froyo版Gallery3D的源码提供了一个深入了解Android图形处理、性能优化、资源管理和组件交互的实践案例。通过对`Android.mk`、`AndroidManifest.xml`、`src`和`res`的细致研究,开发者不仅可以提升Android...
总结来说,Gallery3D作为Android平台的一款经典应用,其源码提供了丰富的学习资源,涵盖了Android应用开发的多个重要方面,包括UI设计、数据管理、图形渲染、性能优化等。深入研究并实践这些知识点,对于任何Android...
《安卓Android源码——Gallery2解析》 在安卓开发领域,深入理解源码是提升技能的重要途径之一。这里我们关注的是“Gallery2”模块,它是Android系统中的一个图像浏览应用,主要用于展示和管理用户的照片。Gallery2...
总结来说,通过对Gallery3D源码的学习,我们可以掌握Android的3D渲染技术、数据加载与缓存策略、用户交互实现、性能优化以及软件架构设计等多方面的知识。这不仅有助于提升个人的开发技能,也为构建更高级、更复杂的...
在Android平台上,Gallery 3D是一款用于展示图片的3D应用,其源码分析对于理解Android图形渲染和3D图像处理具有很高的学习价值。以下是关于Gallery 3D源码分析的一些关键知识点: 1. **Layer抽象类**: Layer是...
《安卓Andriod源码深度解析——以Gallery3D为例》 在Android系统中,Gallery3D是一款经典的图片浏览应用,其源码是开发者深入理解Android系统和图像处理的重要参考资料。通过对Grallery3D源码的分析,我们可以深入...
在分析过程中,文档主要聚焦于Gallery3D的核心组件之一——Layer类,以及其继承类和关联类RenderView的深度剖析。 ### Layer类详解 Layer被描述为一个抽象类,它包含五个关键变量:`mX`、`mY`(用于表示层的位置...
《Gallery3D:Android平台上...总结,Gallery3D是Android开发中一种创新的图片展示方式,通过3D滚动和硬件加速提供了出色的用户体验。开发者可以参考其源码,结合实际需求,定制自己的3D画廊效果,为应用增添更多亮点。
这个"安卓Android源码——gallery重叠特效源码+注释.zip"文件包含了实现Gallery重叠效果的源代码,并且附有注释,可以帮助开发者更好地理解和实现这一特效。重叠特效通常是指在用户滚动Gallery时,相邻的图片会部分...
Android 4.0 Gallery3D源码分析 Gallery3D是Android系统中一个经典的3D图像浏览应用,尤其在Android 4.0(冰淇淋三明治)版本中,它提供了流畅且富有视觉冲击力的用户体验。这个源码是开发者深入理解Android 3D图像...
android gallery3d源码,我测试过了,可以正常运行,希望对大家有用。