上篇文章讲了初始化View时会实例化一个SlotView并监听其事件,至于它是怎么实现的,用的是Android自带的GestureDetector。

GestureDetector是Android自带的用来监听各种用户手势的的一个类,比如监听单击、双击和长按等操作。关于GestureDetector的详解可以参考此文章用户手势检测-GestureDetector使用详解

SlotView中定义了一个GestureDetector。

 private final GestureDetector mGestureDetector;

 public SlotView(AbstractGalleryActivity activity, Spec spec) {
//给GestureDetector传入我们自定义的Listener接口
mGestureDetector = new GestureDetector(activity, new MyGestureListener());
......
}

然后在onTouch中拦截SlotView的触摸事件并交给GestureDetector处理

    @Override
protected boolean onTouch(MotionEvent event) {
......
mGestureDetector.onTouchEvent(event);
......
//必须返回true,不然监听不到完整事件
return true;
}

至于GestureDetector的监听事件怎么和SlotView的Listener绑定到一起的?我们看一下自定义的MyGestureListener接口,它就是实现了GestureDetector的OnGestureListener接口。

 private class MyGestureListener implements GestureDetector.OnGestureListener {
......
//点击一次
@Override
public boolean onSingleTapUp(MotionEvent e) {
......
//获取点击的相册索引
int index = mLayout.getSlotIndexByPosition(e.getX(), e.getY());
//处理点击事件
if (index != INDEX_NONE) mListener.onSingleTapUp(index);
return true;
}
}

从上述代码可以看出当GestureDetector监测到点击事件时会回调onSingleTapUp方法,在这个方法里我们对点击事件进行处理。上面的mListener就是SlotView中的Listener接口,这样就将GestureDetector的监听事件和SlotView的Listener绑定到一起了。所以每次接收到触摸事件时最终都会传给SlotView的Listener处理,至于SlotView的Listener具体怎么实现每个ActivityState页面都不一样,比如AlbumSetPage中就是如下实现的,最后会调用AlbumSetPage对应的方法来处理触摸事件

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

现在手势监听流程已经讲解完了,下面讲一下界面的跳转,我们找到AlbumSetPage的onSingleTapUp方法

 public void onSingleTapUp(int slotIndex) {
if (mSelectionManager.inSelectionMode()) {
......
} else {
//显示动画
mAlbumSetView.setPressedIndex(slotIndex);
mAlbumSetView.setPressedUp();
//通过Handler发送消息,msg.arg1是slotIndex,也就是点击的相册索引
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0),
FadeTexture.DURATION);
}
}

Handler的handleMessage方法在AlbumSetPage的onCreate方法中

 mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case MSG_PICK_ALBUM: {
//跳转到相册
pickAlbum(message.arg1);
break;
}
default: throw new AssertionError(message.what);
}
}
};

我们看一下pickAlbum的代码,

 private void pickAlbum(int slotIndex) {
......
if (mGetAlbum && targetSet.isLeafAlbum()) {
......
} else if (targetSet.getSubMediaSetCount() > 0) {
......
} else {
......
data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath); // We only show cluster menu in the first AlbumPage in stack
boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum);
//通过StateManager跳转到AlbumPage类中,跟应用的启动流程差不多
mActivity.getStateManager().startStateForResult(
AlbumPage.class, REQUEST_DO_ANIMATION, data);
}
}

通过上述代码可以看出页面Gallery的页面跳转都是通过StateManager来管理的。如果从相册点击进入某一张图片,跳转逻辑也跟着一样,看下AlbumPage的handleMessage方法就知道了。

Android 7.0 Gallery图库源码分析4 - SlotView手势监听及页面跳转的更多相关文章

  1. Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程

    前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...

  2. Android 7.0 Gallery图库源码分析1 - 初识Gallery源码

    分析一个项目的源代码时,第一件事就是查看清单文件,找到程序入口,我们从Gallery2源码的清单文件中可以看到GalleryActivity是此应用的启动Activity. <activity ...

  3. Android 7.0 Gallery图库源码分析2 - 分析启动流程

    前面一讲解了Gallery启动Activity以及界面如何绘制,现在开始讲解启动流程的代码逻辑. GalleryActivity的onCreate方法中调用initializeByIntent()方法 ...

  4. Android Small插件化框架源码分析

    Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...

  5. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  6. Android7.0 Phone应用源码分析(一) phone拨号流程分析

    1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...

  7. Android7.0 Phone应用源码分析(三) phone拒接流程分析

    本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...

  8. Android7.0 Phone应用源码分析(四) phone挂断流程分析

    电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...

  9. 【Android】Handler、Looper源码分析

    一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...

随机推荐

  1. selenium的显示等待和隐式等待区别

    1.selenium的显示等待 原理:显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.(简而言之:就 ...

  2. 序列模型(3)---LSTM(长短时记忆)

    摘自https://www.cnblogs.com/pinard/p/6519110.html 一.RNN回顾 略去上面三层,即o,L,y,则RNN的模型可以简化成如下图的形式: 二.LSTM模型结构 ...

  3. ApacheBench 测试性能并使用 GnuPlot 绘制图表

    转自:http://blog.csdn.net/fdipzone/article/details/18827069 ApacheBench 测试性能并使用 GnuPlot 绘制图表 Apache Be ...

  4. 2016年工作中遇到的问题1-10:select-for-update锁表

    1.select... for update锁表.注意事项:事务下使用,@Transactional如果用主键,只锁住1行记录如果不用主键,会锁住多条记录,mysql下测试,查询1条,锁住1行,查询2 ...

  5. tomcat 内存溢出问题(OutOfMemoryError: PermGen space)

    导入公司项目的时候出现的问题,在此记录处理方法. tomcat在启动的时候报错:OutOfMemoryError: PermGen space PermGen space的全称是Permanent G ...

  6. 02023_Arrays类的方法练习

    1.定义一个方法,接收一个数组,数组中存储10个学生考试分数,该方法要求返回考试分数最低的后三名考试分数. public static int[] method(double[] arr){ Arra ...

  7. 【POJ】3122 Pie [二分查找]

    题目地址:http://poj.org/problem?id=3122 二分每块饼的体积.为了保证精度,可以先二分半径的平方r*r,最后再乘以PI.要注意一点,要分的人数要包括自己,及f+1. #in ...

  8. C#--职业路线图

    非常好的一个C#的职业技术路线图

  9. HDU 3886

    一开始又往打表想了....不过,打表确实不好处理,转DFS. DFS有几个要注意的问题,1.对于枚举以零开始的数.我纠结了很久,最终学习别人的方法,设一个BOOL,并且假设最高一位有零,很方便.2.当 ...

  10. oracle rac下调节redo log file 文件大小

    rac下调节redo log file 文件大小 (1)查看当前日志信息: select * from v$logfile; (步骤2中得路径能够在这里MEMBER列看到,redo文件名称自己命名.比 ...