ViewPager2中使用PhotoDraweeView横向缩放触发页面滑动怎么解决
冲突原因
ViewPager2默认会优先拦截横向滑动事件,双指缩放时若伴随横向位移,触摸事件会直接被ViewPager2消费,导致PhotoDraweeView无法接收事件触发缩放逻辑。
解决方案
通过动态控制触摸事件拦截规则实现,不影响正常翻页逻辑,仅在缩放/图片放大状态下禁用ViewPager2滑动:
- 先给
fragment_photo布局中的PhotoDraweeView添加id:
<?xml version="1.0" encoding="utf-8"?> <me.relex.photodraweeview.PhotoDraweeView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/photo_view" android:layout_width="match_parent" android:layout_height="match_parent" />
- 在展示图片的Fragment中给
PhotoDraweeView设置触摸监听,动态通知父布局是否拦截事件:
photoView.setOnTouchListener { v, event -> when (event.actionMasked) { // 按下时先禁止父布局拦截,避免快速操作被抢事件 MotionEvent.ACTION_DOWN -> v.parent.requestDisallowInterceptTouchEvent(true) // 多点触摸判定为缩放操作,完全禁止父布局拦截 MotionEvent.ACTION_POINTER_DOWN -> v.parent.requestDisallowInterceptTouchEvent(true) MotionEvent.ACTION_MOVE -> { val curScale = photoView.scale // 判断当前图片是否还能横向滚动(未到左右边缘) val canScrollHorizontally = photoView.canScrollHorizontally(-1) || photoView.canScrollHorizontally(1) if (curScale > 1f && canScrollHorizontally) { // 图片已放大且未滑到边缘,禁止父布局拦截 v.parent.requestDisallowInterceptTouchEvent(true) } else { // 图片为原始大小或已滑到边缘,允许父布局拦截实现翻页 v.parent.requestDisallowInterceptTouchEvent(false) } } // 事件结束恢复父布局拦截能力 MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> v.parent.requestDisallowInterceptTouchEvent(false) } // 不消费事件,交给PhotoDraweeView本身处理缩放/滑动逻辑 false }
如果用Java实现逻辑完全一致,对应修改语法即可。
注意事项
不推荐直接设置viewPager2.isUserInputEnabled = false,该方案会完全禁用ViewPager2的翻页能力,体验极差。
内容的提问来源于stack exchange,提问作者Hussein Yaqoobi
相关产品推荐
相关产品推荐

