决定滚动是用户发起的还是程序触发的?
Decide wether scroll was user initiated or programmatically triggered?
只有当 HorizontalScrollView
被用户滚动时,一些逻辑才需要在 HorizontalScrollView
侦听器中执行,而不是我在其他代码部分调用 horizontalScrollView.scrollBy(dx, 0);
方法。
带有标志 - 程序调用已启动,已完成 - 无法真正解决问题,因为 scrollBy
方法调用和触发事件处理程序之间存在一小段延迟。但在这个时间范围内,甚至用户也可以触摸和滚动 HorizontalScrollView
。
您建议采用哪种方法?
horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (horizontalState == 0) {
horizontalState = 2;
}
if (horizontalState == 2) {
int d = ...;
if (d != 0) {
userSettingRecycleView.scrollBy(d , 0);
} else {
horizontalState = 0;
}
}
}
});
userSettingRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy){
if (horizontalState == 1) {
super.onScrolled(recyclerView, dx, dy);
horizontalScrollView.scrollBy(dx, 0);
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
ItemUserSettingRatingActivity.horizontalState = 1;
}
if (newState == RecyclerView.SCROLL_STATE_IDLE || newState == RecyclerView.SCROLL_STATE_SETTLING) {
ItemUserSettingRatingActivity.horizontalState = 0;
}
}
});
我建议在您的程序 scrool
事件之间的范围内禁用用户触摸。也就是说,使用 those 类 创建您的自定义 HorisontalScrollView
并 enable/disable 以编程方式点击“捕获”。
使用SCROLL_STATE_DRAGGING
private val scrollListener = object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == SCROLL_STATE_DRAGGING) ViewHelpers.hideKeyboard(activity)
}
}
只有当 HorizontalScrollView
被用户滚动时,一些逻辑才需要在 HorizontalScrollView
侦听器中执行,而不是我在其他代码部分调用 horizontalScrollView.scrollBy(dx, 0);
方法。
带有标志 - 程序调用已启动,已完成 - 无法真正解决问题,因为 scrollBy
方法调用和触发事件处理程序之间存在一小段延迟。但在这个时间范围内,甚至用户也可以触摸和滚动 HorizontalScrollView
。
您建议采用哪种方法?
horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (horizontalState == 0) {
horizontalState = 2;
}
if (horizontalState == 2) {
int d = ...;
if (d != 0) {
userSettingRecycleView.scrollBy(d , 0);
} else {
horizontalState = 0;
}
}
}
});
userSettingRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy){
if (horizontalState == 1) {
super.onScrolled(recyclerView, dx, dy);
horizontalScrollView.scrollBy(dx, 0);
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
ItemUserSettingRatingActivity.horizontalState = 1;
}
if (newState == RecyclerView.SCROLL_STATE_IDLE || newState == RecyclerView.SCROLL_STATE_SETTLING) {
ItemUserSettingRatingActivity.horizontalState = 0;
}
}
});
我建议在您的程序 scrool
事件之间的范围内禁用用户触摸。也就是说,使用 those 类 创建您的自定义 HorisontalScrollView
并 enable/disable 以编程方式点击“捕获”。
使用SCROLL_STATE_DRAGGING
private val scrollListener = object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == SCROLL_STATE_DRAGGING) ViewHelpers.hideKeyboard(activity)
}
}