unity scrollview不能滑动

2015年02月06日 18:25 0 点赞 1 评论 更新于 2020-01-14 20:32

本文将详细讲解 Unity 中 ScrollView 经常失效、无法正常滑动的问题,希望能对新手朋友有所帮助。

问题解决思路

解决该问题的关键在于,当接近水平滚动时,让 ScrollView 不处理事件,而是将事件交由其子 View(例如这里的 ViewPager)处理。具体实现方式是重写 ScrollView 的 onInterceptTouchEvent 函数。

代码实现

以下是重写 ScrollView 的完整代码:

package cc.newnews.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class VerticalScrollView extends ScrollView {

private GestureDetector mGestureDetector;

public VerticalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, new YScrollDetector());
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev)
&& mGestureDetector.onTouchEvent(ev);
}

class YScrollDetector extends SimpleOnGestureListener {

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
/**
* 如果我们滚动更接近水平方向,返回 false,让子视图来处理它
*/
return (Math.abs(distanceY) > Math.abs(distanceX));
}
}
}

代码解释

  1. VerticalScrollView:继承自 ScrollView,用于重写 onInterceptTouchEvent 方法。
  2. mGestureDetector 对象:用于检测手势,通过 GestureDetector 类创建,传入 YScrollDetector 实例。
  3. onInterceptTouchEvent 方法:调用父类的 onInterceptTouchEvent 方法,并结合 mGestureDetectoronTouchEvent 方法来决定是否拦截触摸事件。
  4. YScrollDetector:继承自 SimpleOnGestureListener,重写 onScroll 方法。在 onScroll 方法中,通过比较 distanceXdistanceY 的绝对值,判断滚动方向。如果更接近垂直方向(Math.abs(distanceY) > Math.abs(distanceX)),则返回 true,表示 ScrollView 处理该事件;否则返回 false,让子视图处理事件。

XML 文件修改

在 XML 文件中,将原来的 <ScrollView> 标签替换为 <xxx.xxx.xxx.VerticalScrollView>,其中 xxx.xxx.xxx 是包名,VerticalScrollView 是重写的 ScrollView 的类名。

适用范围

本方法同样适用于 ScrollView 中包含 ListView 等其他 View 无法滚动的情况。通过上述修改,可以有效解决 ScrollView 及其子 View 无法正常滚动的问题。

作者信息

boke

boke

共发布了 3994 篇文章