我有一个滚动视图女巫因某些原因我不想自动滚动!!我想先测量滚动距离,然后进行一些计算,然后使用scrollView.scrollBy()函数进行滚动。此外,当我到达scrollView的结尾时,我仍然想捕捉滚动手势。我无法使用scrollView滚动侦听器,因为
我创建了一个不带滚动的自定义滚动视图,方法是触摸事件而不调用父级。然后我使用手势检测器来检测滚动量,我定义了一个监听器,将此距离发送回使用滚动视图的活动。之后我使用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);
}
}
答案 0 :(得分:0)
不要修改滚动视图的行为。引擎盖下有很多优化使滚动顺畅。 作为解决方法,您可以在scrollView顶部覆盖透明视图。例如。视图 sOverlay 覆盖在xml文件中的scrollView之上。覆盖触摸式监听器&返回false。应用你的手势监听器& sOverlay视图的算法。要了解scrollView将要执行的行程量,请获取scrollView的顶部位置 Y1 和scrollView的底部位置 Y2 。
Y1 = scrollView.getScrollY();
Y2 = scrollView.getScrollY() + scrollView.getHeight();