使用滚动视图时onScroll手势

时间:2015-10-25 12:33:09

标签: android android-scrollview android-gesture

我有一个滚动视图女巫因某些原因我不想自动滚动!!我想先测量滚动距离,然后进行一些计算,然后使用scrollView.scrollBy()函数进行滚动。此外,当我到达scrollView的结尾时,我仍然想捕捉滚动手势。我无法使用scrollView滚动侦听器,因为

  • First Scroll Happens,然后我会收到通知,而不是相反的通知
  • 第二,如果我到达卷轴的末尾,我不知道我错过了多少卷轴。例如,如果我在滚动视图中有内容,我会滚动600px,但由于我接近结束,我只得到100px滚动。我需要知道额外500px做一些动画)。

我创建了一个不带滚动的自定义滚动视图,方法是触摸事件而不调用父级。然后我使用手势检测器来检测滚动量,我定义了一个监听器,将此距离发送回使用滚动视图的活动。之后我使用scrollview.scrollBy()滚动该数量。这一切都有效,除了屏幕滞后和滚动都不平滑!那么我在这里失踪了什么?

这是我自定义scrollview的代码

public class CustomScrollView extends ScrollView implements GestureDetector.OnGestureListener {

public interface ScrollGestureListener {
    void onScrollGesture(int dy);
}

private GestureDetectorCompat gestureDetector;
private ScrollGestureListener listener;


public CustomScrollView(Context context) {
    super(context);
    init();
}

public CustomScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
}


private void init(){
    gestureDetector = new GestureDetectorCompat(getContext(), this);
}

public void setScrollGestureListener(ScrollGestureListener listener) {
    this.listener = listener;
}

@Override
public boolean onInterceptTouchEvent(@NonNull MotionEvent ev) {
    boolean result = super.onInterceptTouchEvent(ev);
    if (gestureDetector.onTouchEvent(ev)) {
        return true;
    }
    else {
        return false;
    }
}

@Override
public boolean onTouchEvent(@NonNull MotionEvent ev) {
    gestureDetector.onTouchEvent(ev);
    return true;
    //return super.onTouchEvent(ev);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);
    SLog.d("l: " + l + " t: " + t);
}

@Override
public boolean onDown(MotionEvent event) {
//        SLog.d("onDown: " + event.toString());
    return true;
}

@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
                       float velocityX, float velocityY) {
//        SLog.d( "onFling: " + event1.toString() + event2.toString());
    return true;
}

@Override
public void onLongPress(MotionEvent event) {
//        SLog.d( "onLongPress: " + event.toString());
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                        float distanceY) {
    SLog.d( "onScroll: " + distanceY + " -- " + e1.toString()+e2.toString());

    if(listener != null)
        listener.onScrollGesture((int) distanceY);

    return true;
}

@Override
public void onShowPress(MotionEvent event) {
//        SLog.d( "onShowPress: " + event.toString());
}

@Override
public boolean onSingleTapUp(MotionEvent event) {
//        SLog.d( "onSingleTapUp: " + event.toString());
    return true;
}

这是我使用此滚动视图的活动代码

public class TestActivity extends AppCompatActivity implements CustomScrollView.ScrollGestureListener {
private GestureDetectorCompat mDetector;
private CustomScrollView scrollView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    scrollView = (CustomScrollView) findViewById(R.id.test_scroll_view);
    scrollView.setScrollGestureListener(this);
}

@Override
public void onScrollGesture(int dy) {
    scrollView.smoothScrollBy(0, dy);
}

}

1 个答案:

答案 0 :(得分:0)

不要修改滚动视图的行为。引擎盖下有很多优化使滚动顺畅。 作为解决方法,您可以在scrollView顶部覆盖透明视图。例如。视图 sOverlay 覆盖在xml文件中的scrollView之上。覆盖触摸式监听器&返回false。应用你的手势监听器& sOverlay视图的算法。要了解scrollView将要执行的行程量,请获取scrollView的顶部位置 Y1 和scrollView的底部位置 Y2

Y1 = scrollView.getScrollY();
Y2 = scrollView.getScrollY() + scrollView.getHeight();