代码拉取完成,页面将自动刷新
由于在ohos中,我们无法重写系统控件的触摸事件,只能通过setTouchListener来设置一个回调,这意味着我们无法侵入到ohos系统控件原有的滚动处理逻辑内。因此我们如果需要实现NestedScrollingChild接口,就需要重写控件的滚动逻辑。
ScrollHelper类封装了一套比较通用的滚动处理逻辑,并且内部维护了NestedScrollingChildHelper实例对象,自定义控件只需要实现ScrollingView与NestedScrollingChild等接口,并转发NestedScrollingChild中的函数至ScrollHelper的同名函数即可重写滚动逻辑。
注意:ScrollHelper仅仅处理滚动相关的逻辑,比如事件分发、触摸事件处理、嵌套滚动,其主要作用是帮助现有的可滚动的组件实现嵌套滚动。如果想要实现滚动本身,可以借助ScrollApiHelper
public class NestedListContainer extends ListContainer
implements Component.TouchEventListener, ViewGroup,
NestedScrollingChild, ScrollingView
private final ScrollHelper helper;
helper = new ScrollHelper(this);
setTouchEventListener(this);
@Override
public boolean onTouchEvent(Component component, TouchEvent ev) {
return helper.onTouchEvent(component, ev);
}
// ViewGroup
@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
helper.requestDisallowInterceptTouchEvent(disallowIntercept);
}
@Override
public boolean onInterceptTouchEvent(TouchEvent ev) {
return helper.onInterceptTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(TouchEvent ev) {
return helper.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(TouchEvent ev) {
return helper.onTouchEvent(ev);
}
@Override
public boolean isConsumed() {
return helper.isConsumed();
}
// NestedScrollingChild
@Override
public void setNestedScrollingEnabled(boolean enabled) {
helper.setNestedScrollingEnabled(enabled);
}
@Override
public boolean isNestedScrollingEnabled() {
return helper.isNestedScrollingEnabled();
}
@Override
public boolean startNestedScroll(int axes, int type) {
return helper.startNestedScroll(axes, type);
}
@Override
public void stopNestedScroll(int type) {
helper.stopNestedScroll(type);
}
@Override
public boolean hasNestedScrollingParent(int type) {
return helper.hasNestedScrollingParent(type);
}
@Override
public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow, int type, int[] consumed) {
return helper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
offsetInWindow, type, consumed);
}
@Override
public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow, int type) {
return helper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, type);
}
@Override
public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
return helper.dispatchNestedFling(velocityX, velocityY, consumed);
}
@Override
public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
return helper.dispatchNestedPreFling(velocityX, velocityY);
}
// ScrollingView
@Override
public ComponentContainer getContainer() {
return this;
}
@Override
public int getScrollY() {
return scrollY;
}
@Override
public int getScrollX() {
return scrollX;
}
@Override
public int getDirection() {
return getOrientation() + 1;
}
@Override
public void scrollByInternal(int deltaX, int deltaY) {
// 需要自行计算scrollX、scrollY,因为有时候getScrollValue函数返回有异常
if (getDirection() == NestedScrollingHelper.SCROLL_AXIS_VERTICAL) {
scrollY += deltaY;
if (scrollY < 0) {
scrollY = 0;
}
} else {
scrollX += deltaX;
if (scrollX < 0) {
scrollX = 0;
}
}
scrollTo(scrollX, scrollY);
if (scrollY > getScrollValue(VERTICAL)) {
scrollY = getScrollValue(VERTICAL);
}
if (scrollX > getScrollValue(HORIZONTAL)) {
scrollX = getScrollValue(HORIZONTAL);
}
}
@Override
public boolean disallowInterceptWhenMoving() {
return true;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。