Я нашел решение после того, как попробовал почти каждый onXXX()
метод.onLayout может быть использован.Вы можете запланировать прокрутку и сделать это позже в onLayout()
.
Расширьте вид прокрутки и добавьте:
private int onLayoutScrollByX = 0;
private int onLayoutScrollByY = 0;
public void planScrollBy(int x, int y) {
onLayoutScrollByX += x;
onLayoutScrollByY += y;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
doPlannedScroll();
}
public void doPlannedScroll() {
if (onLayoutScrollByX != 0 || onLayoutScrollByY != 0) {
scrollBy(onLayoutScrollByX, onLayoutScrollByY);
onLayoutScrollByX = 0;
onLayoutScrollByY = 0;
}
}
Теперь, чтобы использовать это в своем коде, вместо scrollBy(x,y)
используйте planScrollBy(x,y)
.Он будет выполнять прокрутку в то время, когда новый размер дочернего элемента «известен», но еще не отображается на экране.
Когда вы используете горизонтальную или вертикальную прокрутку, конечно, вы можете прокручивать только в одну сторону, так что вам придется немного изменить этот код (или нет, но он будет игнорировать прокрутку на другой оси).Я использовал TwoDScrollView
, вы можете найти его в Интернете.