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

来源:互联网 发布:荣威车质量怎么样知乎 编辑:程序博客网 时间:2024/05/13 17:07

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

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

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

[java] view plaincopyprint?
  1.  mSlotView.setListener(new SlotView.SimpleListener() {  
  2.             @Override  
  3.             public void onDown(int index) {  
  4.                 AlbumSetPage.this.onDown(index);  
  5.             }  
  6.   
  7.             @Override  
  8.             public void onUp(boolean followedByLongPress) {  
  9.                 AlbumSetPage.this.onUp(followedByLongPress);  
  10.             }  
  11.   
  12.             @Override  
  13.             public void onSingleTapUp(int slotIndex) {  
  14.                 AlbumSetPage.this.onSingleTapUp(slotIndex);  
  15.             }  
  16.   
  17.             @Override  
  18.             public void onLongTap(int slotIndex) {  
  19.                 AlbumSetPage.this.onLongTap(slotIndex);  
  20.             }  
  21.         });

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

[java] view plaincopyprint?
  1. public void onSingleTapUp(int slotIndex) {  
  2.         if (!mIsActive) return;  
  3.   
  4. ...  
  5.             mHandler.sendMessage(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0));  
  6.         }  
  7.     }

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

[java] view plaincopyprint?
  1. mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {  
  2.             @Override  
  3.             public void handleMessage(Message message) {  
  4.                 switch (message.what) {  
  5.                     case MSG_PICK_ALBUM: {  
  6.                         pickAlbum(message.arg1);  
  7.                         break;  
  8.                     }  
  9.                     defaultthrow new AssertionError(message.what);  
  10.                 }  
  11.             }  
  12.         };

[java] view plaincopyprint?
  1. private void pickAlbum(int slotIndex) {  
  2.         if (!mIsActive) return;  
  3. ...  
  4.             mActivity.getStateManager().startStateForResult(  
  5.                     AlbumPage.class, REQUEST_DO_ANIMATION, data);  
  6.         }  
  7.    }  
接收到动作消息,启动相册页面AlbumPage对象。另外一个界面的跳转与此相同。我关注的点不在这里,这里我的疑问是SlotView.SimpleListener是我们自定义的监听器,这个监听器是如何实现手势监听的?原来Android系统提供了一套手势监听的接口GestureDetector.OnGestureListener,它们由底层驱动实现,是标准的手势接口,我们调用它实现自己的手势监听。

[java] view plaincopyprint?
  1. public interface Listener {  
  2.         public void onDown(int index);  
  3.         public void onUp(boolean followedByLongPress);  
  4.         public void onSingleTapUp(int index);  
  5.         public void onLongTap(int index);  
  6.         public void onScrollPositionChanged(int position, int total);  
  7.     }  
  8.   
  9.     public static class SimpleListener implements Listener {  
  10.         @Override public void onDown(int index) {}  
  11.         @Override public void onUp(boolean followedByLongPress) {}  
  12.         @Override public void onSingleTapUp(int index) {}  
  13.         @Override public void onLongTap(int index) {}  
  14.         @Override public void onScrollPositionChanged(int position, int total) {}  
  15.     }

[java] view plaincopyprint?
  1.  private class MyGestureListener implements GestureDetector.OnGestureListener {  
  2.         ...  
  3.         @Override  
  4.         public boolean onSingleTapUp(MotionEvent e) {  
  5.             cancelDown(false);  
  6.             if (mDownInScrolling) return true;  
  7.             int index = mLayout.getSlotIndexByPosition(e.getX(), e.getY());  
  8.             if (index != INDEX_NONE) mListener.onSingleTapUp(index);  
  9.             return true;  
  10.         }

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