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

Gallery3D笔记

阅读更多

布局及特效  gallery3d 的精华
一、布局
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;缩略图界面分类浏览  
public static final int STATE_MEDIA_SETS = 0;主界面
    public static final int STATE_GRID_VIEW = 1;缩略图矩阵浏览
    public static final int STATE_FULL_SCREEN = 2;查看界面
    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  
com.cooliris.media.GridLayer
com.cooliris.media.BackgroundLayer
com.cooliris.media.HudLayer
com.cooliris.media.ImageButton
com.cooliris.media.TimeBar
com.cooliris.media.MenuBar
com.cooliris.media.PopupMenu
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.     }  
public boolean isHidden() {
        return mHidden;
    }

    public void setHidden(boolean hidden) {
        if (mHidden != hidden) {
            mHidden = hidden;
            onHiddenChanged();
        }
    }


下面是根据上面分类来画不同元素所用的标识:

  

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;  
 public static final int PASS_THUMBNAIL_CONTENT = 0;
    public static final int PASS_FOCUS_CONTENT = 1;
    public static final int PASS_FRAME = 2;
    public static final int PASS_PLACEHOLDER = 3;
    public static final int PASS_FRAME_PLACEHOLDER = 4;
    public static final int PASS_TEXT_LABEL = 5;
    public static final int PASS_SELECTION_LABEL = 6;
    public static final int PASS_VIDEO_LABEL = 7;
    public static final int PASS_LOCATION_LABEL = 8;
    public static final int PASS_MEDIASET_SOURCE_LABEL = 9;

 

Java代码 复制代码
  1. drawDisplayItem(view, gl, displayItem, texture, PASS_THUMBNAIL_CONTENT, placeholder,displayItem.mAnimatedPlaceholderFade); 画缩略图的,注掉此句,前两屏只显示框,第三屏OK   
  2. drawDisplayItem(view, gl, displayItem, texture, PASS_FOCUS_CONTENT, null0.0f);画单张图片的,注掉,第三屏黑屏   
  3. drawDisplayItem(view, gl, itemDrawn, textureToUse, PASS_FRAME, previousTexture, ratio);画边框的,注掉,前两屏明显没有边框,巨齿明显   
  4. drawDisplayItem(view, gl, displayItem, textureString, PASS_TEXT_LABEL, null0);画文本标签的   
  5. drawDisplayItem(view, gl, displayItem, textureToUse, PASS_SELECTION_LABEL, null0);画选中标记的   
  6. drawDisplayItem(view, gl, displayItem, videoTexture, PASS_VIDEO_LABEL, null0);画视频标记的   
  7. drawDisplayItem(view, gl, displayItem, locationTexture, PASS_LOCATION_LABEL, null0);画位置标记的   
  8. drawDisplayItem(view, gl, displayItem, locationTexture, PASS_MEDIASET_SOURCE_LABEL,transparentTexture, 0.85f);画源来源图标的(相机或一般文件夹)  
drawDisplayItem(view, gl, displayItem, texture, PASS_THUMBNAIL_CONTENT, placeholder,displayItem.mAnimatedPlaceholderFade); 画缩略图的,注掉此句,前两屏只显示框,第三屏OK
drawDisplayItem(view, gl, displayItem, texture, PASS_FOCUS_CONTENT, null, 0.0f);画单张图片的,注掉,第三屏黑屏
drawDisplayItem(view, gl, itemDrawn, textureToUse, PASS_FRAME, previousTexture, ratio);画边框的,注掉,前两屏明显没有边框,巨齿明显
drawDisplayItem(view, gl, displayItem, textureString, PASS_TEXT_LABEL, null, 0);画文本标签的
drawDisplayItem(view, gl, displayItem, textureToUse, PASS_SELECTION_LABEL, null, 0);画选中标记的
drawDisplayItem(view, gl, displayItem, videoTexture, PASS_VIDEO_LABEL, null, 0);画视频标记的
drawDisplayItem(view, gl, displayItem, locationTexture, PASS_LOCATION_LABEL, null, 0);画位置标记的
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);//绑定新数据,为渲染做准备。  
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);//绑定新数据,为渲染做准备。


而位置的改变有两种方式,一种是直接以顶点数据中改变,另一种是计算出在3维3个方向的偏移量,再调用gltranslate来做,从代码可以看出采用的是第二种方式来做的,比第一种方式更方便一些。代码:

Java代码 复制代码
  1. gl.glTranslatef(-translateXf, -translateYf, -translateZf);  
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-4982941342287215583_1024.cache   
  16. ----rwxr-x system   sdcard_rw   237692 2010-05-28 07:33 hires-image-cache3684568484369117627_1024.cache   
  17. ----rwxr-x system   sdcard_rw   133182 2010-05-28 07:34 hires-image-cache607542544081226432_1024.cache   
  18. ----rwxr-x system   sdcard_rw    83223 2010-05-28 07:34 hires-image-cache4275479623210216146_1024.cache   
  19. ----rwxr-x system   sdcard_rw   292837 2010-05-28 07:34 hires-image-cache-646316556936433937_1024.cache   
  20. ----rwxr-x system   sdcard_rw   191377 2010-05-28 07:35 hires-image-cache2631364604509958174_1024.cache   
  21. ----rwxr-x system   sdcard_rw   366905 2010-05-28 07:35 hires-image-cache-3280562009766080884_1024.cache   
  22. ----rwxr-x system   sdcard_rw   323671 2010-05-28 07:35 hires-image-cache5752471827533329222_1024.cache  
/sdcard/Android/data/com.cooliris.media/cache/local-album-cache
d---rwxr-x system   sdcard_rw          2010-05-21 09:56 local-album-cache
d---rwxr-x system   sdcard_rw          2010-05-21 09:56 local-meta-cache
----rwxr-x system   sdcard_rw   299877 2010-05-28 07:36 local-album-cachechunk_0
d---rwxr-x system   sdcard_rw          2010-05-21 09:56 geocoder-cache
----rwxr-x system   sdcard_rw      284 2010-05-28 07:36 local-album-cacheindex
d---rwxr-x system   sdcard_rw          2010-05-21 09:56 local-image-thumbs
d---rwxr-x system   sdcard_rw          2010-05-21 09:56 local-video-thumbs
d---rwxr-x system   sdcard_rw          2010-05-21 09:56 picasa-thumbs
----rwxr-x system   sdcard_rw       80 2010-05-28 07:36 local-meta-cachechunk_0
----rwxr-x system   sdcard_rw      164 2010-05-28 07:36 local-meta-cacheindex
d---rwxr-x system   sdcard_rw          2010-05-21 09:56 hires-image-cache
----rwxr-x system   sdcard_rw   627629 2010-05-28 07:37 local-image-thumbschunk_0
----rwxr-x system   sdcard_rw     3914 2010-05-21 09:56 local-image-thumbsindex
----rwxr-x system   sdcard_rw    53343 2010-05-28 07:34 hires-image-cache-4982941342287215583_1024.cache
----rwxr-x system   sdcard_rw   237692 2010-05-28 07:33 hires-image-cache3684568484369117627_1024.cache
----rwxr-x system   sdcard_rw   133182 2010-05-28 07:34 hires-image-cache607542544081226432_1024.cache
----rwxr-x system   sdcard_rw    83223 2010-05-28 07:34 hires-image-cache4275479623210216146_1024.cache
----rwxr-x system   sdcard_rw   292837 2010-05-28 07:34 hires-image-cache-646316556936433937_1024.cache
----rwxr-x system   sdcard_rw   191377 2010-05-28 07:35 hires-image-cache2631364604509958174_1024.cache
----rwxr-x system   sdcard_rw   366905 2010-05-28 07:35 hires-image-cache-3280562009766080884_1024.cache
----rwxr-x system   sdcard_rw   323671 2010-05-28 07:35 hires-image-cache5752471827533329222_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-thumbsindex   
  3. public static final DiskCache sThumbnailCacheVideo = new DiskCache("local-video-thumbs");--------------------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("picasa-thumbs");-----------------------------picasa-thumbs   
  10. UriTexture::writeToCache  --------------------------hires-image-cache-xxx_1024.cache  
LocalDataSource
public static final DiskCache sThumbnailCache = new DiskCache("local-image-thumbs");----------------------local-image-thumbs local-image-thumbschunk_0  local-image-thumbsindex
public static final DiskCache sThumbnailCacheVideo = new DiskCache("local-video-thumbs");--------------------local-video-thumbs
public static final DiskCache sAlbumCache = new DiskCache("local-album-cache");----------------------local-album-cache  local-album-cacheindex
public static final DiskCache sMetaAlbumCache = new DiskCache("local-meta-cache");------------------local-meta-cache  local-meta-cacheindex
getChunkFile --------------local-meta-cachechunk_0  local-album-cachechunk_0

ReverseGeocoder::  private static final DiskCache sGeoCache = new DiskCache("geocoder-cache"); -------------------------geocoder-cache
PicasaDataSource:: public static final DiskCache sThumbnailCache = new DiskCache("picasa-thumbs");-----------------------------picasa-thumbs
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 Gallery3D 最新源码

    《Android Gallery3D最新源码解析》 Gallery3D是Android平台上的一款开源3D图片浏览应用,它以其高效、流畅的用户体验和强大的3D渲染能力而受到开发者和用户的喜爱。本文将深入探讨Gallery3D的最新源码,揭示其背后...

    android 的gallery3d

    **Android的Gallery3D详解** Gallery3D是Android操作系统中的一款强大的3D图像查看应用,专为用户提供了独特的三维浏览体验。它不仅是一款高效的图片管理工具,还利用了Android设备的硬件加速功能,实现了流畅的3D...

    Android_Gallery3D源码(已编译)

    《Android_Gallery3D源码解析》 Gallery3D是Android平台上的一款3D图片浏览应用,它展示了Android系统中3D图形处理和图像展示的强大能力。这个应用的源码提供了深入理解Android图形库、线程管理、数据加载优化以及...

    Gallery3D效果

    《Gallery3D效果详解》 Gallery3D效果是Android平台上的一种高级图像展示技术,它以其流畅的动画效果、丰富的交互性和高效的数据管理机制,为用户提供了卓越的图像浏览体验。在移动设备上,Gallery3D能够实现类似...

    Gallery 3D效果

    "Gallery 3D效果"是一种视觉上引人入胜的图像展示技术,灵感来源于iOS平台上的CoverFlow组件。这种效果通常用于创建一个动态且交互式的画廊,让用户能够以3D方式浏览图片,增强了用户体验。在Android开发中,实现...

    Android Gallery3D

    **Android Gallery3D详解** Gallery3D是Android平台上的一款高性能图片浏览器应用,它以其流畅的3D滚动效果和优秀的用户体验而备受赞誉。本篇将深入探讨Gallery3D的源代码,解析其背后的实现原理和技术细节。 ### ...

    Gallery3D源码

    《Gallery3D源码解析——打造高效且直观的图库应用》 Gallery3D是一款流行的开源图库应用程序,以其高性能和用户友好的界面而受到广大开发者和用户的喜爱。本文将深入探讨Gallery3D的源码,揭示其在图像处理、性能...

    gallery3D展示

    "Gallery3D展示"是一个专为呈现图片列表而设计的3D画廊应用或组件。在IT领域,尤其是在移动应用开发和网页设计中,这样的功能通常用于创建具有视觉吸引力和交互性的图片浏览体验。Gallery3D的核心是利用3D渲染技术来...

    Gallery3D源码分析

    Gallery3D源码分析

    安卓Android源码——Gallery3D.zip

    《深入剖析Android Gallery3D源码》 在Android操作系统中,Gallery3D是一款经典的图片浏览应用,它以其高效、流畅的用户体验而广受好评。本文将深入探讨Gallery3D的源码,帮助开发者理解其背后的实现原理,进一步...

    android gallery 3D效果

    在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...

    gallery 3D效果

    在标题"gallery 3D效果"和描述"自定义gallery ,实现3D效果图片展示,带图片倒影"中,我们可以理解为这是一个通过自定义扩展Gallery控件,实现了具有3D视觉效果和图片倒影功能的项目。 要实现这样的3D效果,开发者...

    4.0的gallery3D

    《4.0的Gallery3D详解》 Gallery3D是一款在Android 4.0系统中内置的3D图片浏览应用,它为用户提供了流畅、直观的图像浏览体验,尤其是在高性能设备上,其3D效果尤为突出。这款应用充分利用了硬件加速功能,使得图像...

    Gallery3D.zip

    "Gallery3D.zip"是一个包含Android平台上的Gallery3D应用的相关文件的压缩包。Gallery3D是一款基于Android系统的高效、流畅的3D图片浏览器,它为用户提供了丰富的图像管理和展示功能,尤其在处理大量照片时表现出...

    Gallery实现了3D效果

    在本案例中,"Gallery实现了3D效果"意味着开发者通过自定义或者利用第三方库对原生`Gallery`进行了扩展,增加了立体、动态的视觉体验,使得图片浏览变得更加生动和吸引人。 首先,我们来详细了解一下`Gallery`的...

    android Gallery 3d 图片浏览 oom

    在Android开发中,"android Gallery 3d 图片浏览 oom"是一个常见的问题,尤其是在处理大量图片时。oom,全称是Out Of Memory,即内存溢出错误,当应用程序分配的内存超过系统能提供的范围时,就会触发这个错误。本文...

    gallery3D源码分析

    《Gallery3D源码分析详解》 Gallery3D是一款基于OpenGL进行界面绘制的高效图片浏览应用,它的设计和实现方式与传统的Android应用有着显著的区别。本文将深入探讨Gallery3D的核心概念、线程架构、控件系统以及渲染...

    Android Gallery 3D效果

    在Android早期版本中,`Gallery`被广泛用来创建类似相册的3D效果,尽管在API 16之后,它被`GridView`和`RecyclerView`等更灵活的视图替代。然而,通过一些自定义实现,我们仍然可以创建出类似`Gallery 3D`的效果。 ...

Global site tag (gtag.js) - Google Analytics