于今腐草无萤火,终古垂杨有暮鸦。这篇文章主要讲述Android 7.0 Gallery图库源码分析4 - SlotView手势监听及页面跳转相关的知识,希望能为你提供帮助。
上篇文章讲了初始化View时会实例化一个SlotView并监听其事件,至于它是怎么实现的,用的是android自带的GestureDetector。
GestureDetector是Android自带的用来监听各种用户手势的的一个类,比如监听单击、双击和长按等操作。关于GestureDetector的详解可以参考此文章用户手势检测-GestureDetector使用详解
SlotView中定义了一个GestureDetector。
1 private final GestureDetector mGestureDetector; 2 3 public SlotView(AbstractGalleryActivity activity, Spec spec) { 4//给GestureDetector传入我们自定义的Listener接口 5mGestureDetector = new GestureDetector(activity, new MyGestureListener()); 6...... 7}
然后在onTouch中拦截SlotView的触摸事件并交给GestureDetector处理
1@Override 2protected boolean onTouch(MotionEvent event) { 3...... 4mGestureDetector.onTouchEvent(event); 5...... 6//必须返回true,不然监听不到完整事件 7return true; 8}
至于GestureDetector的监听事件怎么和SlotView的Listener绑定到一起的?我们看一下自定义的MyGestureListener接口,它就是实现了GestureDetector的OnGestureListener接口。
1 private class MyGestureListener implements GestureDetector.OnGestureListener { 2...... 3//点击一次 4@Override 5public boolean onSingleTapUp(MotionEvent e) { 6...... 7//获取点击的相册索引 8int index = mLayout.getSlotIndexByPosition(e.getX(), e.getY()); 9//处理点击事件 10if (index != INDEX_NONE) mListener.onSingleTapUp(index); 11return true; 12} 13 }
从上述代码可以看出当GestureDetector监测到点击事件时会回调onSingleTapUp方法,在这个方法里我们对点击事件进行处理。上面的mListener就是SlotView中的Listener接口,这样就将GestureDetector的监听事件和SlotView的Listener绑定到一起了。所以每次接收到触摸事件时最终都会传给SlotView的Listener处理,至于SlotView的Listener具体怎么实现每个ActivityState页面都不一样,比如AlbumSetPage中就是如下实现的,最后会调用AlbumSetPage对应的方法来处理触摸事件
1 private void initializeViews() { 2mSlotView.setListener(new SlotView.SimpleListener() { 3@Override 4public void onDown(int index) { 5AlbumSetPage.this.onDown(index); 6} 7 8@Override 9public void onUp(boolean followedByLongPress) { 10AlbumSetPage.this.onUp(followedByLongPress); 11} 12 13@Override 14public void onSingleTapUp(int slotIndex) { 15AlbumSetPage.this.onSingleTapUp(slotIndex); 16} 17 18@Override 19public void onLongTap(int slotIndex) { 20AlbumSetPage.this.onLongTap(slotIndex); 21} 22}); 23 }
现在手势监听流程已经讲解完了,下面讲一下界面的跳转,我们找到AlbumSetPage的onSingleTapUp方法
1 public void onSingleTapUp(int slotIndex) { 2if (mSelectionManager.inSelectionMode()) { 3...... 4} else { 5//显示动画 6mAlbumSetView.setPressedIndex(slotIndex); 7mAlbumSetView.setPressedUp(); 8//通过Handler发送消息,msg.arg1是slotIndex,也就是点击的相册索引 9mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0), 10FadeTexture.DURATION); 11} 12}
Handler的handleMessage方法在AlbumSetPage的onCreate方法中
1 mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 2@Override 3public void handleMessage(Message message) { 4switch (message.what) { 5case MSG_PICK_ALBUM: { 6//跳转到相册 7pickAlbum(message.arg1); 8break; 9} 10default: throw new AssertionError(message.what); 11} 12} 13};
我们看一下pickAlbum的代码,
1 private void pickAlbum(int slotIndex) { 2...... 3if (mGetAlbum & & targetSet.isLeafAlbum()) { 4...... 5} else if (targetSet.getSubMediaSetCount() > 0) { 6...... 7} else { 8...... 9data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath); 10 11// We only show cluster menu in the first AlbumPage in stack 12boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 13data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum); 14//通过StateManager跳转到AlbumPage类中,跟应用的启动流程差不多 15mActivity.getStateManager().startStateForResult( 16AlbumPage.class, REQUEST_DO_ANIMATION, data); 17} 18 }
【Android 7.0 Gallery图库源码分析4 - SlotView手势监听及页面跳转】通过上述代码可以看出页面Gallery的页面跳转都是通过StateManager来管理的。如果从相册点击进入某一张图片,跳转逻辑也跟着一样,看下AlbumPage的handleMessage方法就知道了。
推荐阅读
- Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程
- Android 7.0 Gallery图库源码分析1 - 初识Gallery源码
- App压力测试MonkeyRunner整理
- rhel6.5搭建mantis时报错“INTERNAL APPLICATION ERROR”
- Qt Widgets Application可执行程序发布方式
- spring boot application.properties文件外部配置
- 微信空气质量如何查询?微信空气质量查询办法介绍_微信
- 微信邀请函怎样做?微信邀请函自制办法列表_微信
- 微信朋友圈封面怎样换?朋友圈封面更改图文详细教程_微信