转自: http://www.eoeandroid.com/thread-83538-1-1.html

lists 的各个 list 里包含的各个 layer 如下所示:

Layer提供了update(....),renderOpaque(....),renderBlended(....)接口,这些接口会在RenderView的onDrawFrame绘制代码中被调用。GridLayer 中有个 GridDrawManager,专门负责绘制,在前面的那几个接口中会调用到GridDrawManager的一些具体绘制函数实现真正的画图工作如:
drawDisplayItem(view, gl, displayItem, texture, PASS_THUMBNAIL_CONTENT,placeholder, displayItem.mAnimatedPlaceholderFade); 画缩略图的
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);画源来源图标的(相机或一般文件夹)

事件机制

由于所有界面都同属于一个activity,所以所有的事件触发动作都来源于主线程,实际上是主线程中的RenderView的onTouchEvent:

public boolean onTouchEvent(MotionEvent event) {
// Ignore events received before thesurface is created to avoid
// deadlocking with GLSurfaceView'sneedToWait().
if (mGL == null) {
returnfalse;
}
// Wait for the render thread toprocess this event.
if (mTouchEventQueue.size() > 8&& event.getAction() == MotionEvent.ACTION_MOVE)
return true;
synchronized (mTouchEventQueue) {
MotionEventeventCopy = MotionEvent.obtain(event);
mTouchEventQueue.addLast(eventCopy);
requestRender();
}
return true;
}

在这里它将所有的触屏事件放在一个待处理的事件队列里面,当队列里面的事件数大于8或者该事件属于拖动事件的时候它将等待,否则会将该事件加入队列,并调用requestRender()请求绘制。于是会重新调用RenderView的onDrawFrame绘制代码,其中有个函数processTouchEvent(),这个函数的主要功能是负责处理事件队列中的事件,查找该事件来源于哪个控件(对应具体的某个Layer子类),然后将事件分发给该控件处理,控件接受到事件的时候会调用自身的onTouchEvent()函数,在这里会根据事件的不同设置一些不同的数据主要是给绘制的时候要用的,最终会调用到真正的事件处理类GestureDetector.Java的相关方法包括对是否是双击阿单击阿等。在这里需要说明一下,它并没有把响应事件的具体实现放在每个layer的子类中,而是提取出了一个类GestureDetector.Java专门负责响应事件。以上就是整个事件的响应流程,事件统一由RenderView负责创建,然后根据条件的不同下发给相应的控件响应。

切换界面流程
       相册界面,缩略图界面,以及图片浏览界面等,这些界面的跳转不同于activity之间的跳转,因为它们并不是每个都对应一个单独的activity而是共享一个activity。Gallery3D里面用不同的状态来标识不同的界面,这些状态定义在GridLayer里面如下:

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;

状态的变化引起界面的变化,Gallery3D里面采用了通知模式,状态变化的接口为GridLayer中的public void setState(int state),通知接口为HudLayer中的public void onGridStateChanged()。界面的切换是由事件发起的,因此在事件的响应函数里面会对用户的触屏动作分解成一个个的状态,如刚进入Gallery3D的时候会通过调用setState(STATE_MEDIA_SETS)设置状态为STATE_MEDIA_SETS,并发送通知即调用onGridStateChanged()最后调用HudLayer的updateViews()方法进行绘制与更新,从而进入相册界面;同样当用户点击相册的时候,会改变状态为STATE_GRID_VIEW,然后重新绘制界面进入缩略图界面,其他界面的切换也是同样的道理,当状态没有发生变化的时候将不会执行回调函数setState()和onGridStateChanged()。

Android Gallery3D源码分析(二)相关推荐

  1. android 3d城市源码,[转载]android Gallery3D源码分析

    一.布局 gallery3d的界面生成和普通的应用程序不一样.普通程序一般一个界面就是一个activity,布局用xml或代码都可以实现,界面切换是activity的切换方式:而gallery3d没有 ...

  2. Android Gallery3D源码分析

    [转]原文地址http://blog.csdn.net/giegie/article/details/6830225 Gallery3D概述 Gallery3D的界面生成和普通的应用程序不一样.普通程 ...

  3. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  4. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

  5. Android ADB 源码分析(三)

    前言 之前分析的两篇文章 Android Adb 源码分析(一) 嵌入式Linux:Android root破解原理(二) 写完之后,都没有写到相关的实现代码,这篇文章写下ADB的通信流程的一些细节 ...

  6. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  7. 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序

    [Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...

  8. Android 音频源码分析——AndroidRecord录音(一)

    Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...

  9. Android 音频源码分析——AudioTrack设备选择

    Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...

  10. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我们又有一 个耗时任务需要执行,我们不得不重新创建 ...

最新文章

  1. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图、箱图显示主效应
  2. 中流程图快速制作_GitMind教程 | 业务流程图怎么做?
  3. php时间戳与日期互转
  4. 深入ASP.NET数据绑定(中)——数据双向绑定机理
  5. TSS描述符表的作用
  6. Google发布Anthos:Google背书,宣告多集群多云Kubernetes时代已来
  7. mysql表引擎修改
  8. perl 的mail严格正则表达式到底要怎么写?
  9. composer升级_Composer-命令简介
  10. LeetCode:922. 按奇偶排序数组 II
  11. 第四次博客作业:bookstore缺陷报告
  12. vs2008保存超级慢
  13. 巩固——React中如何使用判断?
  14. 【图像配准】基于matlab GUI光流场模型图像配准【含Matlab源码 831期】
  15. centos安装tree命令
  16. 莫烦Python代码实践(四)——DQN基础算法工程化解析
  17. Android数据库升级,android开发艺术探索pdf百度网盘
  18. html+css实现星系图
  19. DID会固定年份吗_双重差分方法(DID)解析、影响机制分析与三重差分方法(DDD)...
  20. 易岸公考:国考公务员高频常识

热门文章

  1. mysql数据怎么提取出来分析_Mysql数据提取器
  2. ChinaPay银联电子支付-退款功能
  3. 细菌完成图+比较基因组学助力沙门氏菌毒力因子研究
  4. 机器学习数学基础--偏导数
  5. python书籍下载网站_Python 精品开源电子书网站
  6. “2021年度全球十大人工智能治理事件”:数据、算法、伦理受关注,AI发展需治理同行
  7. html语言pre,【已解决】html代码中用pre还是code表示程序代码以及如何指定代码的语音种类...
  8. 如何速成java_极*Java速成教程 - (2)
  9. Axure RP 9 for mac 高保真原型图 - 案例18 【导航栏-展开、收起】导入元件库
  10. 一年代码功能点的创新性怎么写_创新项目计划书模板