Я только начал писать пользовательский вид в Android (в первый раз), и я понял, что мне нужно реализовать функцию прокрутки.Как добавить прокрутку для пользовательского представления в Android
В пользовательском представлении также используется заголовок, содержащий некоторый текст (который должен оставаться фиксированным, а не прокручиваться).
Я прочитал документацию по GestureDetector.SimpleOnGestureListener
и Scroller
. Я также прочитал документацию по Animating a Scroll Gesture, но я нашел примеры, которые трудно понять. Я также рассмотрел другие вопросы о переполнении стека, которые помогли немного.
Используя то, что я понял из документации с the Stack Overflow answer в качестве ссылки, чтобы вести меня, я добавил следующее моей настраиваемое представление:
переменных и полей:
private OverScroller mScroller;
private final GestureDetector mGestureDetector =
new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
// Note 0 as the x-distance to prevent horizontal scrolling
scrollBy(0, (int) distanceY);
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
final int maxScrollX = 0;
// wholeViewHeight is height of everything that is drawn
int wholeViewHeight = calculateWholeHeight();
int visibleHeight = getHeight();
final int maxScrollY = wholeViewHeight - visibleHeight;
mScroller.forceFinished(true);
mScroller.fling(0, // No startX as there is no horizontal scrolling
getScrollY(),
0, // No velocityX as there is no horizontal scrolling
- (int) velocityY,
0,
maxScrollX,
0,
maxScrollY);
invalidate();
return true;
}
@Override
public boolean onDown(MotionEvent e) {
if (!mScroller.isFinished()) {
mScroller.forceFinished(true);
}
return true;
}
});
Инициализация mScroller
:
// Called from the constructor
private void init() {
mScroller = new OverScroller(getContext(), new FastOutLinearInInterpolator());
...
}
Материал в onDraw()
:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
...
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
}
}
Материал в onTouchEvent()
:
@Override
public boolean onTouchEvent(MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
В результате этих дополнений является пользовательский вид, который может прокручивать вертикально (а не по горизонтали), тем не менее существует несколько вопросов:
- Я могу прокрутить дальше мимо того, что нарисовано
- Там нет никакого эффекта края свечения, как я дойти до конца пользовательского вида (я имею в виду, как
RecyclerView
илиScrollView
) - Все пользовательские зрения свитков, а не просто некоторая часть его
- Я не Полностью понять, что происходит
Может ли кто-нибудь объяснить, как прокрутка работает в пользовательском представлении и как правильно ее реализовать с помощью этих функций?
Здравствуйте, Фарбод Саламат-Заде. Вы нашли решение для этого? Я также придерживался той же проблемы.е; «Я могу прокрутить дальше мимо того, что нарисовано» –
@AdeelShahzad Пока нет. Если вы придумаете решение, сообщите мне об этом. :) –
Привет, Фарбод. Я не мог придумать решение, поэтому просто бросил ScrollView внутри ViewPager. –