Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
来源:互联网 发布:荣威车质量怎么样知乎 编辑:程序博客网 时间:2024/05/13 17:07
Gallery浏览图片除开编辑界面,主要有三个界面:即起始页,相册簿集合页面(AlbumSetPage);点击某个相册进入该相册的所有图片页面(AlbumPage)和再点击某张具体图片之后的图片浏览页面(PhotoPage)。
我们从起始页面开始,点击某个相册:
一个相册是一个SlotView对象,在onCreate()中初始化了SlotView。并且对SlotView进行了监听:
- 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);
- }
- });
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); } });
接下来看onSingleTapUp()中是如何实现的:
- public void onSingleTapUp(int slotIndex) {
- if (!mIsActive) return;
- ...
- mHandler.sendMessage(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0));
- }
- }
public void onSingleTapUp(int slotIndex) { if (!mIsActive) return;... mHandler.sendMessage(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0)); } }
意即这一动作发送了一条消息,消息的处理在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);
- }
- }
- };
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); } } };
- private void pickAlbum(int slotIndex) {
- if (!mIsActive) return;
- ...
- mActivity.getStateManager().startStateForResult(
- AlbumPage.class, REQUEST_DO_ANIMATION, data);
- }
- }
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) {}
- }
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 {
- ...
- @Override
- public 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;
- }
private class MyGestureListener implements GestureDetector.OnGestureListener { ... @Override public 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)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(4)——GLCanvas.java
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
- Android4.2.2 Gallery2源码分析(6)——GLView.java
- Android4.2.2 Gallery2源码分析(4)——GLCanvas.java
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
- Android4.2.2 Gallery2源码分析(6)——GLView.java
- Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
- Android4.2.2 Gallery2源码分析(8)——假装的Activity
- Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
- Android4.2.2 Gallery2源码分析(11)——Gallery的层次结构图
- Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
- Android4.2.2 Gallery2源码分析(8)——假装的Activity
- Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
- Android4.2.2 Gallery2源码分析(11)——Gallery的层次结构图
- Android4.2.2 Gallery2源码分析(3)——分析Gallery.java
- Androidpn-server数据库更换为mysql
- 小伙伴整理的mysql命令操作
- 一分钟搞定java源程序编译成JAR包
- ubuntu12.04安装ant1.9.2
- Android ListView onitemclick事件无响应
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- 为myeclipse打造自己的配色方案
- 关于JavaScript在Android4.0平台以上的混淆问题
- 用c语言实现归并排序
- 轻松掌握SQL Sever中各种语句的完整语法
- Oracle OS认证以及口令文件
- win7下搭建qt+opencv编程环境详细步骤...我的血泪史,希望能帮到正在学习的人!
- lua的FFI库--alien
- 看小米魅族对比视频想到的