- 浏览: 926424 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
此函数控制相册表格页、相片表格页、时间分类表格页的展示,非常重要。以下以相册表格页为例进行讲解,其他的就举一反三吧。
准备输入参数
- final GridDrawables drawables = mDrawables;
- final DisplayList displayList = mDisplayList;
- final DisplayItem[] displayItems = mDisplayItems;
- final int firstBufferedVisibleSlot = mBufferedVisibleRange.begin;
- final int lastBufferedVisibleSlot = mBufferedVisibleRange.end;
- final int firstVisibleSlot = mVisibleRange.begin;
- final int lastVisibleSlot = mVisibleRange.end;
- final int selectedSlotIndex = mSelectedSlot;
- final int currentFocusSlot = mCurrentFocusSlot;
- final int currentScaleSlot = mCurrentScaleSlot;
- final DisplayItem[] itemsDrawn = mItemsDrawn;
- itemsDrawn[0] = null; // No items drawn yet.
- int drawnCounter = 0;
- final GridQuad grid = GridDrawables.sGrid;
- grid.bindArrays(gl);
- int numTexturesQueued = 0;
- Context context = view.getContext();
通
过之前的computeVisibleItems(),已得到显示元素列表,显示元素缓冲数组,缓存可见槽位的范围,可见槽位的范围;得到当前选中的槽位
索引selectedSlotIndex、当前焦点槽位索引currentFocusSlot和缩放槽位索引currentScaleSlot。
已画元素的缓存数组,绑定表格类材质。selectedSlotIndex、currentFocusSlot、currentScaleSlot在不进行任何操作时都是-1.
遍历缓存可见槽位范围中的每一个槽位
- for (int itrSlotIndex = firstBufferedVisibleSlot; itrSlotIndex <= lastBufferedVisibleSlot; ++itrSlotIndex) {
- int index = itrSlotIndex;
- ...
- }
即遍历每个相册,index是相册序号。
为每个相册分别计算“需要绘制“的最开头那张照片的序号
- boolean priority = !(index < firstVisibleSlot || index > lastVisibleSlot);
- int startSlotIndex = 0;
- final int maxDisplayedItemsPerSlot = (index == mCurrentScaleSlot) ? GridLayer.MAX_DISPLAYED_ITEMS_PER_FOCUSED_SLOT
- : GridLayer.MAX_DISPLAYED_ITEMS_PER_SLOT;
- if (index != mCurrentScaleSlot) {
- for (int j = maxDisplayedItemsPerSlot - 1; j >= 0; --j) {
- DisplayItem displayItem =
displayItems[(index - firstBufferedVisibleSlot) *
GridLayer.MAX_ITEMS_PER_SLOT + j];
- if (displayItem == null) {
- continue;
- } else {
- Texture texture = displayItem.getThumbnailImage(context, sThumbnailConfig);
- if (texture != null && texture.isLoaded() == false) {
- startSlotIndex = j;
- break;
- }
- }
- }
- }
priority表示当前槽位在[firstVisibleSlot,lastVisibleSlot]范围中,则为高优先级,可见槽位上的自然是最高优先级喽;
maxDisplayedItemsPerSlot表示每个槽位中最多的显示项目,即每个相册封面的最大缩略图数,此处为4;
startSlotIndex是当前帧
每个相册中“需要绘制“的最开头那张照片的序号(取值在0-3之间),注意“需要绘制“的最开头那张照片往往不是相册中的第一张照片,帧动画开始时它通常
是第四张照片(第四张被依次压在321张照片下面嘛,因此绘制加载材质都要按照第四张向首张的次序),随着动画和材质逐步加载,它慢慢变为第三张、第二
张、第一张。
从第四张向第一张加载材质
- // Prime the textures in the reverse order.
- for (int j = 0; j < maxDisplayedItemsPerSlot; ++j) {
- int stackIndex = (index == mCurrentScaleSlot) ? maxDisplayedItemsPerSlot - j - 1 : j;
- DisplayItem displayItem = displayItems[(index - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT
- + stackIndex];
- if (displayItem == null) {
- continue;
- } else {
- displayItem.mCurrentSlotIndex = index;
- if (selectedSlotIndex != Shared.INVALID
&& (index <= selectedSlotIndex - 2 || index >=
selectedSlotIndex + 2)) {
- displayItem.clearScreennailImage();
- }
- Texture texture = displayItem.getThumbnailImage(context, sThumbnailConfig);
- if (index == mCurrentScaleSlot && texture != null && !texture.isLoaded()) {
- view.prime(texture, true);
- view.bind(texture);
- } else if (texture != null && !texture.isLoaded() /*&& numTexturesQueued <= 6*/) {
- /*boolean isCached = texture.isCached();*/
- view.prime(texture, priority);
- view.bind(texture);
- /*if (priority && isCached && texture.mState != Texture.STATE_ERROR)
- ++numTexturesQueued;*/
- }
- }
- }
因为是正序的处理4个元素,插入队头,因此是按照从第四张向第一张的次序加载材质。无用的代码已经注释掉了。
准备一些变量
- if (itrSlotIndex == selectedSlotIndex) {
- continue;
- }
- view.prime(drawables.mTexturePlaceholder, true);
- Texture placeholder = (state == GridLayer.STATE_GRID_VIEW) ? drawables.mTexturePlaceholder : null;
- final boolean pushDown = (state == GridLayer.STATE_GRID_VIEW || state == GridLayer.STATE_FULL_SCREEN) ? false : true;
加载占位材质,自己找找看是那个图标;如果是相片表格视图,则占位材质使用这个图标,否则占位材质为空;如果是相片表格视图,则长按选中后向上弹起,否则向下陷下去。
调整显示项目和相机的偏移量
- for (int j = 0; j < GridLayer.MAX_ITEMS_PER_SLOT; ++j) {
- DisplayItem displayItem = displayItems[(index - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT + j];
- if (displayItem == null)
- continue;
- Texture texture = displayItem.getThumbnailImage(context, sThumbnailConfig);
- if (texture == null || !texture.isLoaded()) {
- if (currentScaleSlot != index) {
- if (j == 0) {
- final MediaSet parentSet = displayItem.mItemRef.mParentMediaSet;
- if (parentSet != null && parentSet.getNumItems() <= 1) {
- displayList.setAlive(displayItem, false);
- }
- } else {
- displayList.setAlive(displayItem, false);
- }
- }
- }
- final float dx1 = mScaleGestureDetector.getTopFingerDeltaX();
- final float dy1 = mScaleGestureDetector.getTopFingerDeltaY();
- final float dx2 = mScaleGestureDetector.getBottomFingerDeltaX();
- final float dy2 = mScaleGestureDetector.getBottomFingerDeltaY();
- final float span = mScaleGestureDetector.getCurrentSpan();
- if (state == GridLayer.STATE_FULL_SCREEN) {
- displayList.setOffset(displayItem, false, true, span, dx1, dy1, dx2, dy2);
- } else {
- if (!mHoldPosition) {
- if (state != GridLayer.STATE_GRID_VIEW) {
- if (currentScaleSlot == index) {
- displayList.setOffset(displayItem, true, false, span, dx1, dy1, dx2, dy2);
- } else if (currentScaleSlot != Shared.INVALID) {
- displayList.setOffset(displayItem, true, true, span, dx1, dy1, dx2, dy2);
- } else {
- displayList.setOffset(displayItem, false, false, span, dx1, dy1, dx2, dy2);
- }
- } else {
- float minVal = -1.0f;
- float maxVal = GridCamera.EYE_Z * 0.5f;
- float zVal = minVal + mSpreadValue;
- zVal = FloatUtils.clamp(zVal, minVal, maxVal);
- if (Float.isInfinite(zVal) || Float.isNaN(zVal)) {
- mCamera.moveZTo(0);
- } else {
- mCamera.moveZTo(-zVal);
- }
- }
- }
- }
- }
第一部分每太看懂,第二部分是得到多点触碰的输入信息,第三部分根据视图调整了照片偏移量和相机距离。
绘制缩略图显示项目
- for (int j = startSlotIndex; j < GridLayer.MAX_ITEMS_PER_SLOT; ++j) {
- DisplayItem displayItem = displayItems[(index - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT + j];
- if (displayItem == null) {
- break;
- } else {
- if (currentFocusSlot == index) {
- displayList.setHasFocus(displayItem, true, pushDown);
- mTargetFocusMixRatio = 1.0f;
- } else {
- displayList.setHasFocus(displayItem, false, pushDown);
- }
- if (j >= maxDisplayedItemsPerSlot)
- continue;
- Texture texture = displayItem.getThumbnailImage(view.getContext(), sThumbnailConfig);
- if (texture != null) {
- if (index == mCurrentScaleSlot)
- displayItem.mAlive = true;
- if ((!displayItem.isAnimating() || !texture.isLoaded())
- && displayItem.getStackIndex() > GridLayer.MAX_ITEMS_PER_SLOT) {
- displayList.setAlive(displayItem, true);
- continue;
- }
- if (index < firstVisibleSlot || index > lastVisibleSlot) {
- if (view.bind(texture)) {
- displayList.setAlive(displayItem, true);
- }
- continue;
- }
- drawDisplayItem(view, gl, displayItem, texture, PASS_THUMBNAIL_CONTENT, placeholder,
- displayItem.mAnimatedPlaceholderFade);
- } else {
- // Move on to the next stack.
- break;
- }
- if (drawnCounter >= GridLayer.MAX_ITEMS_DRAWABLE - 1 || drawnCounter < 0) {
- break;
- }
- // Insert in order of z.
- itemsDrawn[drawnCounter++] = displayItem;
- itemsDrawn[drawnCounter] = null;
- }
- }
如果是当前选中,则根据当前视图选择下陷还是弹起;绘制缩略图(其中的displayList.setAlive还没有看懂有什么用);记录已绘制的items。
发表评论
-
Android JNI 编程常见小问题
2015-09-08 11:31 1228extern "C" { jint Jav ... -
Android ServiceManager注册自定义service
2015-08-19 09:53 4174当我们要使用android的系统服务时,一般都是使用Conte ... -
Android ALMP 架设web服务器配置
2014-10-08 18:48 1498随着信息时代的发展,智能手机已经越来越普及。下面本文将带大家把 ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10035一、一个BUG引发的问题 ... -
Android XP MTP支持
2014-03-18 16:41 2336家里电脑是win7,连上直接豌豆荚装驱动就好了。但单位的XP却 ... -
Android Launcher2 icon大小修改
2012-08-16 19:12 6070不同分辨率、不同屏幕的不同设备,android 原生的Laun ... -
android 浏览器APN切换
2012-04-16 16:42 2354业务需求:有些链接需 ... -
android 浏览器全屏显示
2012-04-16 16:40 4921业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在 ... -
Android MD5校验码的生成与算法实现
2012-03-05 15:05 20388在Java中,java.security.MessageDi ... -
Android View的xml属性
2012-02-27 13:25 2836java.lang.Object andro ... -
Android Gallery3D源码学习总结(三)——Cache缓存及数据处理流程
2011-12-29 11:04 4702第一,在应用程序中有三个线程存在:主线程(随activity的 ... -
Android Gallery 3D 特效精华
2011-12-29 10:45 5338Android Gallery 3D 特效精华 一、布 ... -
Android Gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-12-29 10:42 2747显示单张图片相关的输入变量 int selecte ... -
Android:AppWidget,PendingIntent,RemoteViews用法
2011-11-25 10:09 5931什么是AppWidget?AppWidget就是我们平常在 ... -
Android软件汉化/精简/去广告教程
2011-08-23 12:32 2939前言: 现在随处都可以找到功能强大的汉化工具,操作简 ... -
Android ListView页眉页脚效果
2011-07-06 14:07 2685大家都知道,在我们调用ListView的addFooterVi ... -
Android 获取设备信息
2011-06-22 21:09 7972)android 获取设备型号、OS版本号: imp ... -
Android 应用安装设置
2011-05-31 16:18 1914应用程序的默认安装位置以及是否可移动取决于该程序的开发者的配置 ... -
Android Activity去除标题栏和状态栏
2011-05-31 13:10 40490一、在代码中设置 public void onCreate( ... -
Android最佳实践之响应灵敏性
2011-05-16 14:44 1367Android最佳实践之响应灵敏性 可能会存在这样 ...
相关推荐
总之,Android Gallery3D的源码是一个丰富的学习资源,它涵盖了Android开发的多个关键领域,包括3D图形编程、数据管理、性能优化、用户交互设计以及项目构建。对于希望提升Android开发技能的工程师来说,深入研究这...
"gallery3d源码学习总结(二)——绘制流程drawThumbnails"可能涵盖了如何绘制缩略图的步骤,这对于实现3D滚动效果至关重要。 在"gallery3d源码学习总结(三)——Cache缓存及数据处理流程"中,可能讲解了如何有效...
总结,Gallery3D作为Android平台上的一个开源项目,其源码为我们揭示了高效3D图片浏览应用的实现原理,包括数据加载、3D渲染、UI设计和性能优化等多个方面的知识。通过深入学习和理解,开发者不仅能提升自己的...
《深入剖析Android Gallery3D源码》 在Android操作系统中,Gallery3D是一款经典的图片浏览应用,它以其高效、流畅的用户体验而广受好评。本文将深入探讨Gallery3D的源码,帮助开发者理解其背后的实现原理,进一步...
《Gallery3D源码解析——打造高效且直观的图库应用》 Gallery3D是一款流行的开源图库应用程序,以其高性能和用户友好的界面而受到广大开发者和用户的喜爱。本文将深入探讨Gallery3D的源码,揭示其在图像处理、性能...
本文将深入剖析Android 2.3.3版本中的图库应用——Gallery3D的源码,帮助开发者了解其工作原理,从而更好地运用到自己的项目中。 Gallery3D是一款高性能、优化过的图片浏览应用,它展示了Android平台上的3D图像处理...
**Android Gellary3D 源码解析** Android Gellary3D 是一个用于展示图像的3D画廊应用,它提供了丰富的用户体验,让用户能够以立体的方式浏览和管理手机中的图片。源代码中包含了实现这一功能的核心算法、UI设计以及...
详情请参阅 在Eclipse中编译运行Android4.3应用源码——Launcher2和Gallery2 http://blog.csdn.net/klpchan/article/details/11843295
android gallery3d源码,我测试过了,可以正常运行,希望对大家有用。
Gallery3D源码分析
总结来说,Gallery3D作为Android平台的一款经典应用,其源码提供了丰富的学习资源,涵盖了Android应用开发的多个重要方面,包括UI设计、数据管理、图形渲染、性能优化等。深入研究并实践这些知识点,对于任何Android...
《安卓Android源码——Gallery2解析》 在安卓开发领域,深入理解源码是提升技能的重要途径之一。这里我们关注的是“Gallery2”模块,它是Android系统中的一个图像浏览应用,主要用于展示和管理用户的照片。Gallery2...
**Android的Gallery3D详解** Gallery3D是Android操作系统中的一款强大的3D图像查看应用,专为用户提供了独特的三维浏览体验。它不仅是一款高效的图片管理工具,还利用了Android设备的硬件加速功能,实现了流畅的3D...
《安卓Android源码——Gallery3D深度解析》 在安卓Android的世界里,源码是开发者探索系统奥秘、提升应用性能、实现个性化定制的关键。本文将深入探讨“Gallery3D”这一组件的源码,帮助读者理解其工作原理,从而在...
Gallery应用作为系统内置的图片查看器,它的源码对于我们理解Android图像处理、UI设计以及性能优化具有极高的学习价值。本文将深入探讨Android 4.0 Gallery源码,揭示其内部的工作机制和设计思想。 1. **架构设计**...
在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...
3. **自定义View**:由于原生的`Gallery`组件在新版本中不再支持3D效果,开发者需要创建一个自定义的`View`或者继承`ViewGroup`,并重写`onDraw()`方法来绘制3D效果。在这个过程中,可能需要用到`Canvas`的旋转方法`...
通过学习这个源码,开发者不仅可以掌握如何在Android上实现3D相册,还能深入理解Android的图形编程和UI定制,这对于提升Android开发技能大有裨益。同时,对于想要在自己的应用中加入类似功能的开发者来说,这是一个...
Android 4.0 Gallery3D源码分析 Gallery3D是Android系统中一个经典的3D图像浏览应用,尤其在Android 4.0(冰淇淋三明治)版本中,它提供了流畅且富有视觉冲击力的用户体验。这个源码是开发者深入理解Android 3D图像...
在Android平台上,"android ...总的来说,"android gallery3D" 是一个结合了3D视觉效果、性能优化和用户体验设计的Android应用实例,对于希望学习Android高级图像处理和3D渲染的开发者来说,这是一个值得研究的项目。