很久没有更新了,从今天开始来一系列关于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`组件是一种用于展示一系列图像或项目的视图控件,它提供了平滑的滚动体验,用户可以通过左右滑动来浏览项目。在Android早期版本中,`Gallery`被广泛用来创建类似相册的3D效果,尽管在API ...
在Android平台上,"android ...总的来说,"android gallery3D" 是一个结合了3D视觉效果、性能优化和用户体验设计的Android应用实例,对于希望学习Android高级图像处理和3D渲染的开发者来说,这是一个值得研究的项目。
总结,通过对"Gallery3D"在Android 4.0版本的源代码分析,我们可以学习到高级的图像处理技术、高效的资源管理和优化策略,以及良好的用户交互设计。这对于任何希望在Android平台上开发高质量图像应用的开发者来说,...
在性能上,Gallery3D优化了对大型媒体文件的加载速度,即使在内存有限的设备上也能流畅运行。这得益于其高效的缓存机制和后台加载技术,使得用户在滚动浏览图片时几乎感觉不到延迟。同时,对于高清图片的处理,...
在Android开发中,`Gallery`组件是一个非常有用的控件,它可以用来展示一系列的图片或其它内容,用户可以左右滑动来浏览。然而,原生的`Gallery`在Android API Level 16(Jelly Bean)之后已被废弃。尽管如此,...
本项目"Android-3D画廊"就是一个很好的实例,它通过继承原生的Gallery组件,实现了一个具有3D效果的图片浏览画廊。下面我们将深入探讨这个3D画廊的实现原理和关键知识点。 首先,Gallery是Android SDK提供的一种...
然而,原生的Gallery组件不支持3D效果,因此需要自定义实现。自定义的Gallery可能包含以下几个关键部分: 1. **3D渲染**:实现3D效果的关键是通过OpenGL ES进行渲染。这包括设置相机视角、光照效果、纹理映射等,以...
在Android原生SDK中,Gallery组件曾被用来创建类似照片墙的效果,但自API 16(Android 4.1)起,Gallery已被废弃,推荐使用GridView或RecyclerView等替代。这个Demo可能提供了新的实现方式,以克服Gallery的局限性,...
然而,原生的Gallery组件并不支持3D效果。因此,要实现类似iPhone的3D相册,我们需要自定义这个组件。 1. **自定义View**: 开发者通常会继承`Gallery`类或者使用`RecyclerView`来创建自定义的3D相册。在这个过程...
在Android原生的gallery控件已经不再推荐使用的背景下,这样的自定义解决方案显得尤为重要。 Android的Gallery控件在早期版本中被广泛使用,用于展示一系列可横向滑动的项目,如图片或图标。然而,随着Android设计...
通过对Gallery3D源码的学习,开发者可以深入了解Android应用的性能优化、资源管理、UI设计、图形渲染等多个方面,这对于提升个人的Android开发技能和解决实际问题具有重要意义。在实际开发中,我们可以借鉴这些优秀...
在本案例中,"Gallery实现了3D效果"意味着开发者通过自定义或者利用第三方库对原生`Gallery`进行了扩展,增加了立体、动态的视觉体验,使得图片浏览变得更加生动和吸引人。 首先,我们来详细了解一下`Gallery`的...
在Android系统中,Gallery3D是一款高性能的图片浏览器,尤其在froyo(Android 2.2)版本中,它的源码设计与实现揭示了许多Android图形处理和性能优化的精髓。今天我们将深入探讨froyo版Gallery3D的源码,理解其背后...
本文将深入探讨Android原生图库浏览的源码,包括`Gallery`、`Gallery2`以及`Gallery3D`这三个组件,它们在不同时期为Android提供了图像浏览功能。 1. **Gallery组件** `Gallery`是早期Android版本中用于展示图片和...
首先,3D相册的核心在于对原生Gallery组件的重写。Gallery是Android提供的一个内置控件,用于展示一系列可滚动的项目,通常用于展示图片或选择日期等。然而,原生的Gallery组件并不支持3D效果,因此我们需要对其进行...
在Android系统中,原生的Gallery组件已经被弃用,取而代之的是更现代、功能更强大的媒体库API,允许开发者创建自己的媒体浏览界面。下面将详细介绍与"android gallery"和3D浏览相关的Android开发知识点。 1. **...
最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...
原生的Android Gallery组件默认是横向滚动的,但这个实现是针对竖向滑动进行了优化,让用户能够像浏览日期选择器那样垂直浏览内容。 Gallery组件在早期版本的Android SDK中被广泛使用,它提供了一个3D旋转的效果,...
总的来说,虽然原生的Gallery控件在新版本的Android中已不再推荐使用,但通过自定义和优化,我们依然可以利用它或者其他的视图组件来实现引人注目的Cover Flow效果。这个过程涉及到Android UI编程的多个方面,包括...
本项目名为“模拟立体翻转效果,非Gallery实现”,表明它提供了一种不同于Android原生Gallery组件的翻转效果实现方法。Gallery组件虽然能实现物品的3D翻转效果,但本项目可能采用自定义View或者自定义动画来达到类似...