- 浏览: 1381739 次
- 性别:
- 来自: 陕西.西安
文章分类
最新评论
-
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表示横向
http://www.j2megame.com/html/xwzx/ty/1814.html
Android Gallery 3D 特效精华
一、布局
gallery3d 的界面生成和普通的应用程序不一样。普通程序一般一个界面就是一
个activity,布局用xml或代码都可以实现,界面切换是activity 的切换方式;
而 gallery3d没有用android 的UI 系统,而是用opengl 画出来的,即界面是在
同一个 activity 的,如主界面,缩略图界面,单张图片查看界面,标记界面等
都属于同一个activity。那么这界面布局不同的界面是如何组合到一起的呢?
分析代码,可以把它看成一个状态机:
1、标记模式 public static final int MODE_SELECT = 1;(HudLayer)
包含了主界面标记模式,缩略界面矩阵游览时标记模式、缩略图界面分类游览时
标记模式 3个界面
2、普通模式 public static final int MODE_NORMAL = 0;(HudLayer)
包含了
Java 代码
1. public static final int STATE_MEDIA_SETS = 0;主界面
2. public static final int STATE_GRID_VIEW = 1;缩略图矩阵浏览
3. public static final int STATE_FULL_SCREEN = 2;查看界面
4. public static final int STATE_TIMELINE = 3;缩略图界面分类浏览
有了以上状态分类后,在渲染的时候就能根据些界面的组成来定哪些控件譔隐藏,
哪些要显示了。
下面是基本控件:
Java 代码
1. com.cooliris.media.GridLayer
2. com.cooliris.media.BackgroundLayer
3. com.cooliris.media.HudLayer
4. com.cooliris.media.ImageButton
5. com.cooliris.media.TimeBar
6. com.cooliris.media.MenuBar
7. com.cooliris.media.PopupMenu
8. com.cooliris.media.PathBarLayer
在渲染时,每一帧所有界面上的元素都画了,由于根据上面的状态只把特定窗口
的特定元素显示出来,其它窗口中的隐藏,所以不会乱。
Layer 是上面控件的基类,上面控件的类也就有了下面两个方法来隐藏不譔显示
的界面元素。
Java 代码
1. public boolean isHidden() {
2. return mHidden;
3. }
4.
5. public void setHidden(boolean hidden) {
6. if (mHidden != hidden) {
7. mHidden = hidden;
8. onHiddenChanged();
9. }
10. }
下面是根据上面分类来画不同元素所用的标识:
Java 代码
1. public static final int PASS_THUMBNAIL_CONTENT = 0;
2. public static final int PASS_FOCUS_CONTENT = 1;
3. public static final int PASS_FRAME = 2;
4. public static final int PASS_PLACEHOLDER = 3;
5. public static final int PASS_FRAME_PLACEHOLDER = 4;
6. public static final int PASS_TEXT_LABEL = 5;
7. public static final int PASS_SELECTION_LABEL = 6;
8. public static final int PASS_VIDEO_LABEL = 7;
9. public static final int PASS_LOCATION_LABEL = 8;
10. public static final int PASS_MEDIASET_SOURCE_LABEL = 9;
Java 代码
1. drawDisplayItem(view, gl, displayItem, texture, PASS_THUMBNAIL_CONTENT, placeholde
r,displayItem.mAnimatedPlaceholderFade); 画缩略图的,注掉此句,前两屏只显示框,
第三屏 OK
2. drawDisplayItem(view, gl, displayItem, texture, PASS_FOCUS_CONTENT, null, 0.0f);画单
张图片的,注掉,第三屏黑屏
3. drawDisplayItem(view, gl, itemDrawn, textureToUse, PASS_FRAME, previousTexture, ratio
);画边框的,注掉,前两屏明显没有边框,巨齿明显
4. drawDisplayItem(view, gl, displayItem, textureString, PASS_TEXT_LABEL, null, 0);画文本
标签的
5. drawDisplayItem(view, gl, displayItem, textureToUse, PASS_SELECTION_LABEL, null, 0);画
选中标记的
6. drawDisplayItem(view, gl, displayItem, videoTexture, PASS_VIDEO_LABEL, null, 0);画视频
标记的
7. drawDisplayItem(view, gl, displayItem, locationTexture, PASS_LOCATION_LABEL, null, 0);
画位置标记的
8. drawDisplayItem(view, gl, displayItem, locationTexture, PASS_MEDIASET_SOURCE_LABEL
,transparentTexture, 0.85f);画源来源图标的(相机或一般文件夹)
二、特效
举如何显示一张图片为例,在图片完全显示出来经过这样一个过程,附近的图片
渐小渐出,当前图片渐大渐入,当前图片逐渐变大直到全屏。实现这个特效,要
进行很多帧的渲染。就是说并不是只调一次 onDrawFrame 函数就可以了,要调用
多次。可以把这个特效的实现想成一个状态变化的过程,在每一个状态,纹理的
显示大小和位置都不同,这也符合动画的基本原理。放大、缩小我们只要改变顶
点数据就可以做到,gallery3d 也是这样做的,下面是主要代码:
我们知道调用onDrawFrame来渲染,最后调到下面的 drawFocusItems 函数,
Java 代码
1. GridQuad quad = GridDrawables.sFullscreenGrid[vboIndex];
2. float u = texture.getNormalizedWidth();
3. float v = texture.getNormalizedHeight();
4. float imageWidth = texture.getWidth();
5. float imageHeight = texture.getHeight();
6. boolean portrait = ((theta / 90) % 2 == 1);
7. if (portrait) {
8. viewAspect = 1.0f / viewAspect;
9. }
10. quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);//改变用来贴图片的长方
形的大小
11. quad.bindArrays(gl);//绑定新数据,为渲染做准备。
而位置的改变有两种方式,一种是直接以顶点数据中改变,另一种是计算出在 3
维 3个方向的偏移量,再调用 gltranslate来做,从代码可以看出采用的是第二
种方式来做的,比第一种方式更方便一些。代码:
Java 代码
1. gl.glTranslatef(-translateXf, -translateYf, -translateZf);
而这里的3个偏移量的计算是和camera相关的,相关文件为GridCamera.java,
GridCameraManager.java,过程很复杂,理清楚后再细化吧。
cache管理
下面是cache文件
Java 代码
1. /sdcard/Android/data/com.cooliris.media/cache/local-album-cache
2. d---rwxr-x system sdcard_rw 2010-05-21 09:56 local-album-cache
3. d---rwxr-x system sdcard_rw 2010-05-21 09:56 local-meta-cache
4. ----rwxr-x system sdcard_rw 299877 2010-05-28 07:36 local-album-cachechunk_0
5. d---rwxr-x system sdcard_rw 2010-05-21 09:56 geocoder-cache
6. ----rwxr-x system sdcard_rw 284 2010-05-28 07:36 local-album-cacheindex
7. d---rwxr-x system sdcard_rw 2010-05-21 09:56 local-image-thumbs
8. d---rwxr-x system sdcard_rw 2010-05-21 09:56 local-video-thumbs
9. d---rwxr-x system sdcard_rw 2010-05-21 09:56 picasa-thumbs
10. ----rwxr-x system sdcard_rw 80 2010-05-28 07:36 local-meta-cachechunk_0
11. ----rwxr-x system sdcard_rw 164 2010-05-28 07:36 local-meta-cacheindex
12. d---rwxr-x system sdcard_rw 2010-05-21 09:56 hires-image-cache
13. ----rwxr-x system sdcard_rw 627629 2010-05-28 07:37 local-image-thumbschunk_0
14. ----rwxr-x system sdcard_rw 3914 2010-05-21 09:56 local-image-thumbsindex
15. ----rwxr-x system sdcard_rw 53343 2010-05-28 07:34 hires-image-cache-4982941342
287215583_1024.cache
16. ----rwxr-x system sdcard_rw 237692 2010-05-28 07:33 hires-image-cache36845684843
69117627_1024.cache
17. ----rwxr-x system sdcard_rw 133182 2010-05-28 07:34 hires-image-cache60754254408
1226432_1024.cache
18. ----rwxr-x system sdcard_rw 83223 2010-05-28 07:34 hires-image-cache42754796232
10216146_1024.cache
19. ----rwxr-x system sdcard_rw 292837 2010-05-28 07:34 hires-image-cache-6463165569
36433937_1024.cache
20. ----rwxr-x system sdcard_rw 191377 2010-05-28 07:35 hires-image-cache26313646045
09958174_1024.cache
21. ----rwxr-x system sdcard_rw 366905 2010-05-28 07:35 hires-image-cache-3280562009
766080884_1024.cache
22. ----rwxr-x system sdcard_rw 323671 2010-05-28 07:35 hires-image-cache57524718275
33329222_1024.cache
创建 cache 的关键代码
Java 代码
1. LocalDataSource
2. public static final DiskCache sThumbnailCache = new DiskCache("local-image-thumbs");--
--------------------local-image-thumbs local-image-thumbschunk_0 local-image-thumbsind
ex
3. public static final DiskCache sThumbnailCacheVideo = new DiskCache("local-video-thum
bs");--------------------local-video-thumbs
4. public static final DiskCache sAlbumCache = new DiskCache("local-album-cache");---------
-------------local-album-cache local-album-cacheindex
5. public static final DiskCache sMetaAlbumCache = new DiskCache("local-meta-cache");----
--------------local-meta-cache local-meta-cacheindex
6. getChunkFile --------------local-meta-cachechunk_0 local-album-cachechunk_0
7.
8. ReverseGeocoder:: private static final DiskCache sGeoCache = new DiskCache("geocoder
-cache"); -------------------------geocoder-cache
9. PicasaDataSource:: public static final DiskCache sThumbnailCache = new DiskCache("pica
sa-thumbs");-----------------------------picasa-thumbs
10. UriTexture::writeToCache --------------------------hires-image-cache-xxx_1024.cache
布局补充:
在画一个界面是,是分类化的,比如第一个界面是显示所有有图片的文件夹,在代
码里叫专辑.有这些元素要创建:
文本标签 显示专辑名和专辑内图片或视频数
路径条 显示路径名
按纽 拍照按纽,放大/缩小
菜单栏 全选,取消全选,分享,删除,更多等
图片边框
用于显示图片的矩形
在渲染时一次把一类元素画完,再画另一类.如主界面顺序为:
路径条->按纽->文本标签->图片边框->图片.
具体代码见drawBlendedComponents 函数
1.CacheService.java 中 写 缓 存 : sAlbumCache.put(ALBUM_CACHE_LOCALE_INDEX,
sDummyData, 0);
第一个是 key ,这里是正常数据,当然还有别的 key , key 分别是 -1,-2,-3,-4,-5 。
2.DiskCache.java 中,执行上面的写的过程,这里先得明白他的 cache 怎么装的:
它是由很多称之为“片”的文件组成的,形成一个 List 形式: private final
LongSparseArray<RandomAccessFile> mChunkFiles = new
LongSparseArray<RandomAccessFile>();
即 mChuckFiles 就是整个 cache ,里面包括很多 chunk( 即片 ) ,每一个 chunk 大小为
1MB.
当要写入某一个 chunk 里面的时候,先要找到他在 mChuckFiles 里面的索引值即
chunkIndex, 由
mChunkFiles.get(chunkIndex); 来获取这个文件, chunkIndex 怎么来的呢?
private LongSparseArray<Record> mIndexMap;
Record record = mIndexMap.get(key); 这里的 key 就是上面用 put 方法传过来的
ALBUM_CACHE_LOCALE_INDEX 的值(就是 -5 )
int chunkIndex = record.chunk;
这么一步步来的。
当然了,第一次都是空的,也就是 get 不到东西 mChunkFiles.get(chunkIndex); 和 Record
record =
mIndexMap.get(key); 都 get 不到,那么第一次就先把东西放进去,mIndexMap.put(key, new
Record
(chunkIndex, record.offset, data.length, record.sizeOnDisk, timestamp)); (记录key 值)以及
final
String chunkFilePath = mCacheDirectoryPath + CHUNK_FILE_PREFIX + chunk; chunkFile = new
RandomAccessFile(chunkFilePath, "rw");mChunkFiles.put(chunk, chunkFile); (三句代码来新建
一个
chunkfile 并放到 cache 列表里面)
注意:Record 是内部类,只是一个数据集合类而已,相当于文件描述信息。每个 cache (即
chunk )对应一个。
private final LongSparseArray<RandomAccessFile> mChunkFiles = new
LongSparseArray<RandomAccessFile>(); 中 mChunkFiles 最大装 13 个,每个 chunk 是 1M,
所以全部 Cache 是 13M.
发表评论
-
Android检查是否已经连接到网络
2012-05-14 15:40 1233http://blog.csdn.net/kerenigma/ ... -
Android Framework系列之IMF(二)
2011-06-02 10:09 2193InputConnection是IMF里面一个重要的接口,他是 ... -
Android Frameworks系列之IMF(一)
2011-06-02 10:03 1877http://www.pin5i.com/showtopic- ... -
Android线程优先级设置方法
2011-05-28 14:15 3539http://blog.sina.com.cn/s/blog_ ... -
如何连接android数据库
2011-05-27 15:18 2287http://zhidao.baidu.com/questio ... -
ensureCapacity()方法提高ArrayList的初始化速度
2011-05-27 14:33 11554http://www.gznc.edu.cn/yxsz/jjg ... -
java的isAlive 和 join
2011-05-27 13:38 1590join()用于停止当前线程而运行别的线程。 isAli ... -
Linux系统下.ko文件是什么文件?.so文件是什么文件?
2011-05-25 18:55 5551.so 文件是动态链接库文件,相当于 win下的 .dll ... -
使用Geocoder
2011-05-11 10:46 61887.6 使用Geocoder 地理编 ... -
Gallery学习总结--Cache缓存及数据处理流程
2011-05-09 14:21 2194http://hi.baidu.com/%D6%C7%B4%E ... -
关注的网站
2011-04-06 14:37 1047http://blog.sina.com.cn/s/blog_ ... -
gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-04-01 10:14 4924eoe·Android开发者门户 标题: gallery3d ... -
Android 启动过程详解(学习1)
2011-03-31 09:27 2236Android 启动过程详解 http://blog.csd ... -
Android中的WatchDog (2)
2011-03-31 09:11 1079http://wenku.baidu.com/view/09c ... -
Android平台WindowManager运用
2011-03-30 10:00 1811Android平台WindowManager运用 我们A ... -
JPEG Rotation and EXIF Orientation
2011-03-17 14:26 3916http://blog.csdn.net/daisyhd/ar ... -
Android 的动作、广播、类别等标识大全
2011-03-11 10:19 1314Android 的动作、广播、类别等标识大全 Stri ... -
浅析Android MediaProvider之二
2011-03-08 08:27 2673http://www.poemcode.net/2010/01 ... -
Task和Activity相关
2011-02-28 09:21 1560Task和Activity相关 这段时间在做一个项目,发 ... -
android的PowerManager和PowerManager.WakeLock
2011-02-25 15:45 2626前言 学习android一段时间了,为了进一步了解and ...
相关推荐
总结,Gallery3D作为Android平台上的一个开源项目,其源码为我们揭示了高效3D图片浏览应用的实现原理,包括数据加载、3D渲染、UI设计和性能优化等多个方面的知识。通过深入学习和理解,开发者不仅能提升自己的...
《深入解析Android froyo Gallery3D源码》 在Android系统中,Gallery3D是一款高性能的图片浏览器,尤其在froyo(Android 2.2)版本中,它的源码设计与实现揭示了许多Android图形处理和性能优化的精髓。今天我们将...
拥有源码意味着开发者可以深入学习和研究Gallery 3D的实现细节,例如如何实现3D滚动效果、如何高效管理内存、以及如何优化GPU渲染等。这对于Android开发者尤其是对3D图形编程感兴趣的开发者来说是一份宝贵的参考资料...
总结来说,通过对Gallery3D源码的学习,我们可以掌握Android的3D渲染技术、数据加载与缓存策略、用户交互实现、性能优化以及软件架构设计等多方面的知识。这不仅有助于提升个人的开发技能,也为构建更高级、更复杂的...
Gallery3D 2是这个项目的第二个版本,它不仅提升了用户体验,还优化了性能,使其成为开发者学习和研究Android图形处理、数据管理以及UI设计的宝贵资源。 首先,Gallery3D 2的设计理念是提供流畅且高效的3D图像展示...
"gallery3d源码学习总结(二)——绘制流程drawThumbnails"可能涵盖了如何绘制缩略图的步骤,这对于实现3D滚动效果至关重要。 在"gallery3d源码学习总结(三)——Cache缓存及数据处理流程"中,可能讲解了如何有效...
学习Gallery3D源码,不仅可以加深对Android系统原理的理解,还能掌握高性能图片浏览应用的设计和实现方法。通过对源码的分析和实践,开发者可以提升自己的编程技巧,学会如何构建高效、流畅的3D界面,以及如何优化...
理解OpenGL ES的基本概念、顶点坐标、纹理映射以及着色器语言(GLSL)是深入学习Gallery3D的关键。 三、3D图像处理 Gallery3D的核心在于其3D图像处理技术。通过将图片数据转化为3D对象,应用可以实现多角度的视图...
总结来说,实现一个3D相册功能需要对Android的UI框架有深入理解,尤其是自定义控件和适配器的使用。通过重写`Gallery`的关键方法和定制适配器,我们可以创建出富有视觉吸引力且交互性强的相册应用。如果你打算开发...
总结来说,这个源码实现了一个自定义的3D翻转效果,可能包括视图动画、自定义视图绘制以及触摸事件处理等多个方面。通过学习和理解这个源码,开发者可以提高自己在Android图形和动画方面的技能,进一步提升应用的...
如果修改了某个特定模块,如Gallery3D,你可以使用`mmm`命令来编译该模块。例如,`mmm -j4 /source2.3.7/packages/apps/Gallery3D`。如果在源码目录下,可以直接进入模块目录并运行`mm -j4`。 当你需要查看修改后的...
在UI设计方面,`Gallery3D`这个文件名可能暗示了我们将讨论3D效果的图片或媒体浏览。在音乐播放器中,这可能涉及到创建一个具有动态视觉效果的界面,比如滑动切换歌曲时的3D过渡动画。这可能需要用到`ViewFlipper`,...
总结,ECharts 是一个强大且灵活的数据可视化工具,通过理解和掌握其源码、工具和配置项,开发者能够构建出高效、美观的数据展示界面,满足各种业务需求。无论是从性能优化、功能扩展还是用户体验的角度,ECharts 都...