NestedScrollView requestRectangleOnScreen 不将视图滚动到中心
NestedScrollView requestRectangleOnScreen not scrolling view to center
目前我正在开发一个屏幕,它将根据响应动态生成视图,它涉及很多情况,我应该将滚动视图的 focus/position 更改为所选视图。到目前为止,当视图在屏幕上不可见时,我已经通过使用此方法解决了大部分问题:
fun View.requestViewOnScreen() {
val rect = Rect(0, 0, width, height)
requestRectangleOnScreen(rect, false)
}
问题是我有一个嵌套视图的层次结构,当视图可见时,它停留在我调用上面代码时的位置,即使我用下面的代码尝试它(也有延迟) :
scrollView.smoothScrollTo(0, view.top)
层次结构如下:
- 嵌套滚动视图
- 约束布局
- 自定义视图
- 线性布局
- 我想将其放置在屏幕 top/center 上的视图
滚动视图小部件:
<androidx.core.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/stickyCtaView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible">
知道如何调整我的代码以使 NestedScrollView 滚动并将请求的视图定位在中心吗?我还想指出,我有一个对视图对象本身的引用。提前致谢!
view.top
returns 视图相对于其直接父级的顶部位置,在您的情况下,它是相对于更大父级的顶部位置是必需的,因为您可以使用类似的方法以下聚合视图相对于 scrollView 的顶部位置并滚动到它
private fun ScrollView.scrollTo(target: View) {
var topPosition = 0
var view = target
while (view !== this) {
topPosition += view.top
view = view.parent as View
}
smoothScrollTo(0, topPosition)
}
因此要滚动到您刚刚调用的任何视图 scrollView.scrollTo(view)
如果你想将视图滚动到滚动视图的中心。这个可重用的方法平滑地将视图滚动到 HorizontalScrollView 的可见中心。
private final void focusOnView(final HorizontalScrollView scroll, final View view) {
new Handler().post(new Runnable() {
@Override
public void run() {
int vLeft = view.getLeft();
int vRight = view.getRight();
int sWidth = scroll.getWidth();
scroll.smoothScrollTo(((vLeft + vRight - sWidth) / 2), 0);
}
});
}
对于垂直 ScrollView 使用
...
int vTop = view.getTop();
int vBottom = view.getBottom();
int sHeight = scroll.getBottom();
scroll.smoothScrollTo(((vTop + vBottom - sHeight) / 2), 0);
目前我正在开发一个屏幕,它将根据响应动态生成视图,它涉及很多情况,我应该将滚动视图的 focus/position 更改为所选视图。到目前为止,当视图在屏幕上不可见时,我已经通过使用此方法解决了大部分问题:
fun View.requestViewOnScreen() {
val rect = Rect(0, 0, width, height)
requestRectangleOnScreen(rect, false)
}
问题是我有一个嵌套视图的层次结构,当视图可见时,它停留在我调用上面代码时的位置,即使我用下面的代码尝试它(也有延迟) :
scrollView.smoothScrollTo(0, view.top)
层次结构如下:
- 嵌套滚动视图
- 约束布局
- 自定义视图
- 线性布局
- 我想将其放置在屏幕 top/center 上的视图
滚动视图小部件:
<androidx.core.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/stickyCtaView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible">
知道如何调整我的代码以使 NestedScrollView 滚动并将请求的视图定位在中心吗?我还想指出,我有一个对视图对象本身的引用。提前致谢!
view.top
returns 视图相对于其直接父级的顶部位置,在您的情况下,它是相对于更大父级的顶部位置是必需的,因为您可以使用类似的方法以下聚合视图相对于 scrollView 的顶部位置并滚动到它
private fun ScrollView.scrollTo(target: View) {
var topPosition = 0
var view = target
while (view !== this) {
topPosition += view.top
view = view.parent as View
}
smoothScrollTo(0, topPosition)
}
因此要滚动到您刚刚调用的任何视图 scrollView.scrollTo(view)
如果你想将视图滚动到滚动视图的中心。这个可重用的方法平滑地将视图滚动到 HorizontalScrollView 的可见中心。
private final void focusOnView(final HorizontalScrollView scroll, final View view) {
new Handler().post(new Runnable() {
@Override
public void run() {
int vLeft = view.getLeft();
int vRight = view.getRight();
int sWidth = scroll.getWidth();
scroll.smoothScrollTo(((vLeft + vRight - sWidth) / 2), 0);
}
});
}
对于垂直 ScrollView 使用
...
int vTop = view.getTop();
int vBottom = view.getBottom();
int sHeight = scroll.getBottom();
scroll.smoothScrollTo(((vTop + vBottom - sHeight) / 2), 0);