Horizo ntalScrollView scrollTo不会滚动到视图的原始宽度之上

问题描述 投票:0回答:1

我有一个包含Horizo​​ntalScrollView的自定义视图。滚动视图的宽度为match_parent,其子项的宽度最初是根据自定义视图的属性值以编程方式设置的。在某些时候,滚动视图的子级的宽度以编程方式进行更新(增加)。问题在于,更新后,scrollTo方法仍然无法滚动到原始宽度值以上(与scrollBy相同)。

包围的视图(自定义视图)的左右边距等于屏幕的一半,如果相关的话。

实施例:

  • 初始Horizo​​ntalScrollView的子级宽度:1000;
  • Horizo​​ntalScrollView的父级宽度:1080;
  • Horizo​​ntalScrollView的左/右填充= 540;
  • [New Horizo​​ntalScrollView的子级宽度:2000;
  • scrollTo(1100,0)= scrollTo(1000,0);

相关代码:

自定义视图初始化:

private void init(AttributeSet attrs, int defStyle) {
    inflate(getContext(), R.layout.timeline_view, this);

    // Load attributes
    final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TimelineView, defStyle, 0);

    m_timelineInitialLength = a.getDimension(R.styleable.TimelineView_timelineInitialLength, DEFAULT_LENGTH);

    a.recycle();

    DisplayMetrics displayMetrics = new DisplayMetrics();
    ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    LinearLayout timelineWidget = findViewById(R.id.timeline_widget);
    int horizontalPadding = displayMetrics.widthPixels / 2;
    timelineWidget.setPadding(horizontalPadding, 0, horizontalPadding, 0);

    m_horizontalScrollView = findViewById(R.id.scroll_view);
    m_horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            m_currentScrollX = m_horizontalScrollView.getScrollX();
        }
    });
    m_currentScrollX = m_horizontalScrollView.getScrollX();

    update(m_timelineInitialLength, m_timelineInitialStepWidth, m_currentScrollX);
}

Update和scrollTo(在初始化结束时也会调用此方法。m_rulerView和m_timelineLayout是Horizo​​ntalScrollView的子级:]

private void update(float timelineLength, float timelineStepWidth, int currentScrollX) {
    m_rulerView = findViewById(R.id.ruler);
    m_rulerView.setIndicator(null);
    m_rulerView.getLayoutParams().width = (int) timelineLength;
    m_rulerView.requestLayout();

    m_timelineLayout = findViewById(R.id.timeline);
    m_timelineLayout.getLayoutParams().width = (int) timelineLength;
    m_timelineLayout.requestLayout();

    m_horizontalScrollView.scrollTo(currentScrollX, 0);
}
java android scroll android-custom-view horizontalscrollview
1个回答
0
投票

问题似乎是滚动发生在重绘子级之前,在调用requestLayout之前仅计划了在将来某个时候执行的视图更新(invalidate()相同。]

我经过一段时间后执行scrollTo解决了使用变通方法的问题:

new Handler().postDelayed(() -> ((Activity) getContext()).runOnUiThread(() -> m_horizontalScrollView.scrollTo(currentScrollX, 0)), 200);

我仍然愿意寻求更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.