`

Android 原生Gallery3d的优化系列--1

 
阅读更多
很久没有更新了,从今天开始来一系列关于Android 原生Gallery3d的学习,优化及问题解决的记录。

当有很多Album存在的时候,快速滑动,会发现需要很久才能显示数据,这是因为在
AlbumSetDataLoader里面的ReloadTask加载数据的时候都是从(mContentStart, mContentEnd)在这个范围内开始加载,而不是优先加载可见的范围(mActiveStart,mActiveEnd)而Google的大神在写这个代码的时候就已经意识到了这点,但没有完成,留下了TODO
// TODO: load active range first

所以找到了问题点,我们就优化先加载[mActiveStart,mActiveEnd]再加载(mContentStart,mActiveStart)和(mActiveEnd,mActiveEnd)

 private int getInvalidIndex(long version) {
            long setVersion[] = mSetVersion;
            int length = setVersion.length;

            //load active range first
            for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) {
                if (setVersion[i % length] != version){
                    return i;
                }
            }

            //load mContentStart ~ mActiveStart
            for (int i = mContentStart; i < mActiveStart; ++i) {
                if (setVersion[i % length] != version){
                    return i;
                }
            }

            //load mActiveEnd ~ mContentEnd
            for (int i = mActiveEnd; i < mContentEnd; ++i) {
                if (setVersion[i % length] != version){
                    return i;
                }
            }
            return INDEX_NONE;
        }

虽然我们上面修改了这里,但在AlbumSetDataLoader里面的mActiveStart和mActiveEnd是没有正确赋值的,所以我们还需要修改AlbumSettSlidingWindow.java中的
 private void setContentWindow(int contentStart, int contentEnd) {
        if (contentStart == mContentStart && contentEnd == mContentEnd){
            return;
        }

        if (contentStart >= mContentEnd || mContentStart >= contentEnd) {
            for (int i = mContentStart, n = mContentEnd; i < n; ++i) {
                freeSlotContent(i);
            }
            mSource.setContentWindow(contentStart, contentEnd);
            for (int i = contentStart; i < contentEnd; ++i) {
                prepareSlotContent(i);
            }
        } else {
            for (int i = mContentStart; i < contentStart; ++i) {
                freeSlotContent(i);
            }
            for (int i = contentEnd, n = mContentEnd; i < n; ++i) {
                freeSlotContent(i);
            }
            mSource.setContentWindow(contentStart, contentEnd);
            for (int i = contentStart, n = mContentStart; i < n; ++i) {
                prepareSlotContent(i);
            }
            for (int i = mContentEnd; i < contentEnd; ++i) {
                prepareSlotContent(i);
            }
        }

        mContentStart = contentStart;
        mContentEnd = contentEnd;
    }

    public void setActiveWindow(int start, int end) {
        if (!(start <= end && end - start <= mData.length && end <= mSize)) {
            Utils.fail("start = %s, end = %s, length = %s, size = %s",
                    start, end, mData.length, mSize);
        }

        AlbumSetEntry data[] = mData;
        mActiveStart = start;
        mActiveEnd = end;
        mSource.setActiveWindow(mActiveStart, mActiveEnd);
        int contentStart = Utils.clamp((start + end) / 2 - data.length / 2,
                0, Math.max(0, mSize - data.length));
        int contentEnd = Math.min(contentStart + data.length, mSize);
        setContentWindow(contentStart,contentEnd);

        if (mIsActive) {
            updateTextureUploadQueue();
            updateAllImageRequests();
        }
    }


也需要在AlbumSetDataLoader修改如下
 public void setContentWindow(int startContent, int endContent) {
        int length = mCoverItem.length;
        // If no data is visible, keep the cache content
        if (startContent == endContent) {
            return;
        }

        int contentStart = Utils.clamp((startContent + endContent) / 2 - length / 2,
                0, Math.max(0, mSize - length));
        int contentEnd = Math.min(contentStart + length, mSize);
        if (mContentStart > startContent || mContentEnd < endContent
                || Math.abs(contentStart - mContentStart) > MIN_LOAD_COUNT) {
            if (contentStart == mContentStart && contentEnd == mContentEnd) {
                return;
            }

            int start = this.mContentStart;
            int end = this.mContentEnd;

            mContentStart = contentStart;
            mContentEnd = contentEnd;

            if (contentStart >= end || start >= contentEnd) {
                for (int i = start; i < end; ++i) {
                    clearSlot(i % length);
                }
            } else {
                for (int i = start; i < contentStart; ++i) {
                    clearSlot(i % length);
                }
                for (int i = contentEnd; i < end; ++i) {
                    clearSlot(i % length);
                }
            }
            mReloadTask.notifyDirty();
        }

    }

    public void setActiveWindow(int start, int end) {
        if (start == mActiveStart && end == mActiveEnd){
            return;
        }

        Utils.assertTrue(start <= end
                && end - start <= mCoverItem.length && end <= mSize);

        mActiveStart = start;
        mActiveEnd = end;


    }


dangAlbumDataLoader同意存在这样的问题,但mActiveStart和mActiveEnd是正常被赋值的,所以只需按照AlbumSetDataLoader要修改第一处getInvalidIndex即可。

此优化和文章由本人实作,若要转载,请标明出处,谢谢!
分享到:
评论

相关推荐

    Android Gallery 3D效果

    在Android平台上,`Gallery`组件是一种用于展示一系列图像或项目的视图控件,它提供了平滑的滚动体验,用户可以通过左右滑动来浏览项目。在Android早期版本中,`Gallery`被广泛用来创建类似相册的3D效果,尽管在API ...

    android gallery3D

    在Android平台上,"android ...总的来说,"android gallery3D" 是一个结合了3D视觉效果、性能优化和用户体验设计的Android应用实例,对于希望学习Android高级图像处理和3D渲染的开发者来说,这是一个值得研究的项目。

    Gallery3dD源代码(android4.0版原生)

    总结,通过对"Gallery3D"在Android 4.0版本的源代码分析,我们可以学习到高级的图像处理技术、高效的资源管理和优化策略,以及良好的用户交互设计。这对于任何希望在Android平台上开发高质量图像应用的开发者来说,...

    android 4.0 原生图库

    在性能上,Gallery3D优化了对大型媒体文件的加载速度,即使在内存有限的设备上也能流畅运行。这得益于其高效的缓存机制和后台加载技术,使得用户在滚动浏览图片时几乎感觉不到延迟。同时,对于高清图片的处理,...

    android Gallery 3d实现无限循环播放 用做广告板最后了

    在Android开发中,`Gallery`组件是一个非常有用的控件,它可以用来展示一系列的图片或其它内容,用户可以左右滑动来浏览。然而,原生的`Gallery`在Android API Level 16(Jelly Bean)之后已被废弃。尽管如此,...

    Android-3D画廊

    本项目"Android-3D画廊"就是一个很好的实例,它通过继承原生的Gallery组件,实现了一个具有3D效果的图片浏览画廊。下面我们将深入探讨这个3D画廊的实现原理和关键知识点。 首先,Gallery是Android SDK提供的一种...

    android相册3D源码

    然而,原生的Gallery组件不支持3D效果,因此需要自定义实现。自定义的Gallery可能包含以下几个关键部分: 1. **3D渲染**:实现3D效果的关键是通过OpenGL ES进行渲染。这包括设置相机视角、光照效果、纹理映射等,以...

    安卓Gallery照片墙画廊图库相关-Android高级图片滚动控件3D版的图片轮播器Demo.rar

    在Android原生SDK中,Gallery组件曾被用来创建类似照片墙的效果,但自API 16(Android 4.1)起,Gallery已被废弃,推荐使用GridView或RecyclerView等替代。这个Demo可能提供了新的实现方式,以克服Gallery的局限性,...

    Android--开发--CustomGalleryLikeiPhone(3D相册).rar

    然而,原生的Gallery组件并不支持3D效果。因此,要实现类似iPhone的3D相册,我们需要自定义这个组件。 1. **自定义View**: 开发者通常会继承`Gallery`类或者使用`RecyclerView`来创建自定义的3D相册。在这个过程...

    android 3D画廊效果

    在Android原生的gallery控件已经不再推荐使用的背景下,这样的自定义解决方案显得尤为重要。 Android的Gallery控件在早期版本中被广泛使用,用于展示一系列可横向滑动的项目,如图片或图标。然而,随着Android设计...

    Android高级应用源码-Grallery3D.zip

    通过对Gallery3D源码的学习,开发者可以深入了解Android应用的性能优化、资源管理、UI设计、图形渲染等多个方面,这对于提升个人的Android开发技能和解决实际问题具有重要意义。在实际开发中,我们可以借鉴这些优秀...

    Gallery实现了3D效果

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

    froyo 的Gallery3D源码

    在Android系统中,Gallery3D是一款高性能的图片浏览器,尤其在froyo(Android 2.2)版本中,它的源码设计与实现揭示了许多Android图形处理和性能优化的精髓。今天我们将深入探讨froyo版Gallery3D的源码,理解其背后...

    android 源生图库浏览源码

    本文将深入探讨Android原生图库浏览的源码,包括`Gallery`、`Gallery2`以及`Gallery3D`这三个组件,它们在不同时期为Android提供了图像浏览功能。 1. **Gallery组件** `Gallery`是早期Android版本中用于展示图片和...

    3D相册 Gallery

    首先,3D相册的核心在于对原生Gallery组件的重写。Gallery是Android提供的一个内置控件,用于展示一系列可滚动的项目,通常用于展示图片或选择日期等。然而,原生的Gallery组件并不支持3D效果,因此我们需要对其进行...

    android gallery

    在Android系统中,原生的Gallery组件已经被弃用,取而代之的是更现代、功能更强大的媒体库API,允许开发者创建自己的媒体浏览界面。下面将详细介绍与"android gallery"和3D浏览相关的Android开发知识点。 1. **...

    Android应用开发揭秘pdf高清版

    最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...

    Gallery竖屏

    原生的Android Gallery组件默认是横向滚动的,但这个实现是针对竖向滑动进行了优化,让用户能够像浏览日期选择器那样垂直浏览内容。 Gallery组件在早期版本的Android SDK中被广泛使用,它提供了一个3D旋转的效果,...

    安卓的伪3D实现,用galler控件实现coverflow,里面都是可以运行的demo

    总的来说,虽然原生的Gallery控件在新版本的Android中已不再推荐使用,但通过自定义和优化,我们依然可以利用它或者其他的视图组件来实现引人注目的Cover Flow效果。这个过程涉及到Android UI编程的多个方面,包括...

    模拟立体翻转效果,非Gallery实现(实用1).zip

    本项目名为“模拟立体翻转效果,非Gallery实现”,表明它提供了一种不同于Android原生Gallery组件的翻转效果实现方法。Gallery组件虽然能实现物品的3D翻转效果,但本项目可能采用自定义View或者自定义动画来达到类似...

Global site tag (gtag.js) - Google Analytics