Gallery浏览图片除开编辑界面,主要有三个界面:即起始页,相册簿集合页面(AlbumSetPage);点击某个相册进入该相册的所有图片页面(AlbumPage)和再点击某张具体图片之后的图片浏览页面(PhotoPage)。

我们从起始页面开始,点击某个相册:

一个相册是一个SlotView对象,在onCreate()中初始化了SlotView。并且对SlotView进行了监听:

        mSlotView.setListener(new SlotView.SimpleListener() {@Overridepublic void onDown(int index) {AlbumSetPage.this.onDown(index);}@Overridepublic void onUp(boolean followedByLongPress) {AlbumSetPage.this.onUp(followedByLongPress);}@Overridepublic void onSingleTapUp(int slotIndex) {AlbumSetPage.this.onSingleTapUp(slotIndex);}@Overridepublic void onLongTap(int slotIndex) {AlbumSetPage.this.onLongTap(slotIndex);}});

接下来看onSingleTapUp()中是如何实现的:

    public void onSingleTapUp(int slotIndex) {if (!mIsActive) return;...mHandler.sendMessage(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0));}}

意即这一动作发送了一条消息,消息的处理在onCreate()中进行了实现:

mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {@Overridepublic void handleMessage(Message message) {switch (message.what) {case MSG_PICK_ALBUM: {pickAlbum(message.arg1);break;}default: throw new AssertionError(message.what);}}};
    private void pickAlbum(int slotIndex) {if (!mIsActive) return;
...mActivity.getStateManager().startStateForResult(AlbumPage.class, REQUEST_DO_ANIMATION, data);}}

接收到动作消息,启动相册页面AlbumPage对象。另外一个界面的跳转与此相同。我关注的点不在这里,这里我的疑问是SlotView.SimpleListener是我们自定义的监听器,这个监听器是如何实现手势监听的?原来Android系统提供了一套手势监听的接口GestureDetector.OnGestureListener,它们由底层驱动实现,是标准的手势接口,我们调用它实现自己的手势监听。

    public interface Listener {public void onDown(int index);public void onUp(boolean followedByLongPress);public void onSingleTapUp(int index);public void onLongTap(int index);public void onScrollPositionChanged(int position, int total);}public static class SimpleListener implements Listener {@Override public void onDown(int index) {}@Override public void onUp(boolean followedByLongPress) {}@Override public void onSingleTapUp(int index) {}@Override public void onLongTap(int index) {}@Override public void onScrollPositionChanged(int position, int total) {}}
 private class MyGestureListener implements GestureDetector.OnGestureListener {...@Overridepublic boolean onSingleTapUp(MotionEvent e) {cancelDown(false);if (mDownInScrolling) return true;int index = mLayout.getSlotIndexByPosition(e.getX(), e.getY());if (index != INDEX_NONE) mListener.onSingleTapUp(index);return true;}

mListener是Listener的对象。我们梳理一下这个过程,手指在屏幕上做点击抬起操作,屏幕感应器检测到这一点,交给相应驱动处理,驱动调用本地函数处理,本地函数调用GestureDetector.OnGestureListener的onSingleTapUp()函数,该函数调用了我们自定义的Listener的onSingleTapUp()函数,这个函数的实现则在我们创建的Listener对象中具体实现。这就是回调函数的机制。屏幕能检测到任何我们手指在屏幕上的操作,但是自上倒下没有任何的处理,这些函数里的内容都是空的,当我们在使用的时候把这些空的地方进行相应的填充就有了同一手势的不同实现。

Android4.2.2 Gallery2源码分析(9)——三个界面的跳转相关推荐

  1. Android4.2.2 Gallery2源码分析(1)——从布局入手

    使用的是现有的项目的源码进行分析,它在Android原生源码之上有一些修改,主要是添加了一些功能,但整体部分仍然是原生的架构.从零开始,逐步分析. 点开Gallery,进入该程序查看图片,在手机上看到 ...

  2. android gallery2源码分析,Android4.2.2 Gallery2源码分析(8)——假装的Activity

    两周的奋战,终于对Gallery的结构有了个大致的了解.Gallery是一个很好的Android系统知识的学习源码,不仅仅因为它设计到了多线程,布局优化,Opengl的结合等等内容.还有两点必须说明的 ...

  3. Android4.2.2 Gallery2源码分析(4)——GLCanvas.java

    首先申明,找到这个类是在GLRootView.java中发现的线索.这是一个接口,源码中对该接口作了详细的说明: // // GLCanvas gives a convenient interface ...

  4. Android4.2.2 Gallery2源码分析(2)——发现Gallery.java

    上文中,main.xml是我直接提出来的,并没有说明是怎么找到它的,现在说明发现它的理由: 一般我们分析界面布局会用到hierarchyviewer这个工具,从工具中,我们对应到视图,最主要的视图id ...

  5. hadoop作业初始化过程详解(源码分析第三篇)

    (一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...

  6. Flume 1.7 源码分析(三)程序入口

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

  7. Anbox源码分析(三)——Anbox渲染原理(源码分析)

    Anbox源码分析(三) 上一篇,我们介绍了Anbox视频渲染的原理,这一篇,我们从源码入手,更深入的理解Anbox与渲染的机制和原理 session manager入口 session manage ...

  8. bytebuddy实现原理分析 源码分析 (三)- advice 详解

    advice详解 八.advice 8.1 AsmVisitorWrapper 8.1.1 ForDeclareFields 8.1.1.1 Entry 8.1.1.2 DispatchingVisi ...

  9. ceph-deploy源码分析(三)——mon模块 转

    ceph-deploy源码分析(三)--mon模块 原文: http://www.hl10502.com/2017/06/19/ceph-deploy-mon/#more ceph-deploy的mo ...

最新文章

  1. Android MVC结构的浅见【转】
  2. java基本输入类型数据System.out.println()或System.out.print()
  3. 多线程inline hook
  4. 除了基于模块度之外的其它社团检测算法
  5. phpquery类php,一个基于phpQuery的php通用采集类分享
  6. myeclipse深色模式_完善深色模式的调色板
  7. 什么是跨域(定义理解错误)
  8. MinIO环境搭建及使用
  9. Nature:新发现挑战神经元作用传统理论 [转自科学网]
  10. 专家显身支招 教你如何选购高品质DDR2内存(例)
  11. 星淘惠:我国在国际大变革中迎来国际贸易的发展黄金时期
  12. 了解uni-app只需这一篇就足够了
  13. 台式计算机用什么网卡,台式机没有网卡怎么办
  14. html鼠标指向上面有尾注,插入脚注和尾注的方法
  15. 日版IPhone5完美上3G
  16. 计算机课程培养关键能力,大学生计算机应加强自学能力培养
  17. 电脑公司 GHOST_XP SP3 装机版V2013
  18. 使用R进行描述性统计分析(连续性变量)
  19. 后来的我们都老了——看《后来的我们》
  20. I2C的基础概念和框架

热门文章

  1. Java8中的日期与时间处理
  2. 最完整的Vue教程-从零开始编写可视化大屏
  3. FileProvider无法获取外置SD卡问题解决方案 | Failed to find configured root that contains
  4. python rtsp推流_python处理RSTP视频流过程解析
  5. python 使用google接口实现文本自动翻译功能
  6. 魅族手机刷ubuntu php,国内版魅族pro5刷ubuntu教程
  7. 应急通讯华为完美版 Ubuntu linux GSMS软件ISO文件 2015最新升级版本
  8. STL中的模板类pair 和map http://blog.csdn.net/calvin_zcx/article/details/6072286
  9. 虾皮运营之入职第一周
  10. Mysql隔离性之Read View