z odpowiedzi na jedno z pozostałych pytań znalazłem Google Demo of a ListView subclass, który umożliwia zmianę pozycji.Co to jest VerticalScrollExtent w Android ScrollView?
Demo działa świetnie, ale mam problem z jego zrozumieniem: Gdy element jest przeciągany powyżej/poniżej granic ListView, ListView zaczyna przewijać w górę/w dół, aby odsłonić nowe elementy. Niezbędna kalkulacji wykorzystuje różne parametry Scrollview podwładnego:
public boolean handleMobileCellScroll(Rect r) {
int offset = computeVerticalScrollOffset();
int height = getHeight();
int extent = computeVerticalScrollExtent();
int range = computeVerticalScrollRange();
int hoverViewTop = r.top;
int hoverHeight = r.height();
if (hoverViewTop <= 0 && offset > 0) {
smoothScrollBy(-mSmoothScrollAmountAtEdge, 0);
return true;
}
if (hoverViewTop + hoverHeight >= height && (offset + extent) < range) {
smoothScrollBy(mSmoothScrollAmountAtEdge, 0);
return true;
}
return false;
}
height
jest wysokość ListView samegooffset
jest pozycja przewijania = ile jednostek/piksele były przewijane w górę/w dółrange
to wysokość pełnej zawartości.extent
- cóż, co to jest?
ListView
dziedziczy computeVerticalScrollExtent()
z View
i docu mówi:
obliczyć pionowe przesunięcie kciukiem pionowy pasek przewijania w ciągu zakresie poziomym. Ta wartość służy do obliczenia położenia kciuka wewnątrz ścieżki paska przewijania.
Jeśli ktoś patrzy na codecomputeVerticalScrollExtent()
nie jest realizowany przez jednego z sublasses ale tylko bezpośrednio przez View
: To po prostu zwraca wysokość widoku.
Ma to sens: jeśli ListView/ScrollView ma wysokość 500, to część wyświetlanej zawartości przewijania również wynosi 500. Czy to jest znaczenie ScrollExtent? Dlaczego wymagany jest ScrollExtent? Dlaczego po prostu nie użyjesz getHeight() bezpośrednio?
Myślę, że czegoś brakuje i cieszę się z jakiejkolwiek wskazówki!
Czy mieli więcej informacji na temat „przedłużyć”? Jestem trochę blokować na to zbyt –
To jest przykładowy kod, który może pomóc zrozumieć, w jaki sposób dostać się pasek przewijania góra i dół za pomocą computeVerticalScrollExtent: { scrollbarTop = (float) this.computeVerticalScrollExtent()/this.computeVerticalScrollRange() * this.computeVerticalScrollOffset(); scrollbarBottom = (float) this.computeVerticalScrollExtent()/this.computeVerticalScrollRange() * (this.computeVerticalScrollExtent() + this.computeVerticalScrollOffset()); } – Shilpi