Android 7.0 Gallery图库源码分析4 - SlotView手势监听及页面跳转
上篇文章讲了初始化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手势监听及页面跳转的更多相关文章
- Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程
前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...
- Android 7.0 Gallery图库源码分析1 - 初识Gallery源码
分析一个项目的源代码时,第一件事就是查看清单文件,找到程序入口,我们从Gallery2源码的清单文件中可以看到GalleryActivity是此应用的启动Activity. <activity ...
- Android 7.0 Gallery图库源码分析2 - 分析启动流程
前面一讲解了Gallery启动Activity以及界面如何绘制,现在开始讲解启动流程的代码逻辑. GalleryActivity的onCreate方法中调用initializeByIntent()方法 ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- Android7.0 Phone应用源码分析(二) phone来电流程分析
接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...
- Android7.0 Phone应用源码分析(一) phone拨号流程分析
1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...
- Android7.0 Phone应用源码分析(三) phone拒接流程分析
本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...
- Android7.0 Phone应用源码分析(四) phone挂断流程分析
电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...
- 【Android】Handler、Looper源码分析
一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...
随机推荐
- Python数据分析4------------数据变换
1.简单变换: 开方.平方.对数等 2.数据规范化: (1)离差标准化(最小最大标准化):消除量纲(单位)影响以及变异大小因素的影响. x1=(x-min)/(max-min) 代码:data1=(d ...
- [洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- BJOI2012 最多的方案
BJOI2012 最多的方案 Description 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数 ...
- 批量修改Linux系统密码
截取主机IP地址最后一位数.匹配一组定义好的自定义密码.使用chpasswd修改主机账户密码 截图主机IP [root@web01 ~]# ip addr 1: lo: <LOOPBACK,UP ...
- C++学习笔记(转)
http://www.cnblogs.com/maowang1991/p/3290321.html 以下内容为自己一年多的C++学习心得,纯原创,转载请注明源地址. 一年多的C++学习过程中,自己阅读 ...
- gpio_request 原形代码
http://blog.csdn.net/maopig/article/details/7428561 其原型为 int gpio_request(unsigned gpio, const char ...
- 《黑白团团队》第八次团队作业:Alpha冲刺 第五天
项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第五天 日期:2019/6/19 成员 ...
- BA--调试经验笔记
100%的湿度是水蒸气,称做饱和空气,人体的相对湿度范围为20%---60%,当室内的湿度小于20%时,容易产生静电,尤其在计算机上,超过60%就过湿 冬天适宜温度24.5+-1.5,夏天适宜温度22 ...
- pythonWeb -- Django开发- Admin
[第一次使用Admin 要创建超级用户账号] 1.\ python manage.py createsuperuser You have 1 unapplied migration(s). Your ...
- HDU 1042 N!【大数】
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...