You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ViewPager2中使用PhotoDraweeView横向缩放触发页面滑动怎么解决

冲突原因

ViewPager2默认会优先拦截横向滑动事件,双指缩放时若伴随横向位移,触摸事件会直接被ViewPager2消费,导致PhotoDraweeView无法接收事件触发缩放逻辑。

解决方案

通过动态控制触摸事件拦截规则实现,不影响正常翻页逻辑,仅在缩放/图片放大状态下禁用ViewPager2滑动:

  1. 先给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" />
  1. 在展示图片的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:00:00