作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含 HorizontalScrollView 的自定义 View 。 ScrollView 的宽度是 match_parent,其 subview 的宽度最初是根据自定义 View 的属性值以编程方式设置的。在某些时候, ScrollView 的子级宽度会以编程方式更新(增加)。问题是,更新后,scrollTo方法仍然无法滚动到原始宽度值之上(scrollBy也是如此)。
封闭 View (自定义 View )的左右填充等于屏幕的一半(如果相关的话)。
示例:
相关代码:
自定义 View 初始化:
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是HorizontalScrollView的子级):
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);
}
最佳答案
问题似乎是滚动发生在子级被重绘之前,在调用 requestLayout 之前仅安排 View 的更新在将来的某个时刻执行(与 invalidate() 相同)。
我使用解决方法解决了这个问题,在一段时间后执行scrollTo:
new Handler().postDelayed(() -> ((Activity) getContext()).runOnUiThread(() -> m_horizontalScrollView.scrollTo(currentScrollX, 0)), 200);
我仍然愿意接受更好的解决方案。
关于java - HorizontalScrollView的scrollTo不会滚动到 View 的原始宽度之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112629/
我是一名优秀的程序员,十分优秀!