Intereting Posts
LinearLayout addView не работает должным образом Почему мой SVG не загружается в Vector Asset Studio RequestLocationUpdates не обновляется с интервалом в Android Отключение автоматического вращения в фрагменте Сделать Folder в sdcard с защитой паролем: android Как распаковать, отредактировать и закрепить андроид apk Когда я могу сначала измерить представление? Android: java.land.NoSuchFieldError после обновления до SDK 23 Разработка для iPhone / Android и WPF Определите, работает ли сенсор, когда экран выключен в android Возвращаемая ошибка от перехватчика OKHttp (с использованием модификации) Пользовательский вид, который разбивает макет по диагонали с различными представлениями для детей Как получить путь к папке lib для установленного пакета Сбой сборки после обновления инструментов для Android L Попытка вызвать виртуальный метод 'void android.widget.Button.setOnClickListener (android.view.View $ OnClickListener)' на ссылке нулевого объекта

Как добавить прокрутку для пользовательского представления в Android

Я только начал писать пользовательский вид в Android (в первый раз), и я понял, что мне нужно реализовать прокрутку.

Пользовательский вид также использует заголовок, содержащий некоторый текст (который должен оставаться фиксированным, а не прокручивать).

Я прочитал документацию по GestureDetector.SimpleOnGestureListener и Scroller . Я также прочитал документацию по анимации жестов прокрутки, но я нашел примеры трудными для понимания. Я также рассмотрел другие вопросы о переполнении стека, которые помогли немного.

Используя то, что я понял из документации с ответом «Переполнение стека» в качестве ссылки для руководства, я добавил следующее к своему пользовательскому представлению:

Переменные и поля:

 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); } 

Результатом этих дополнений является пользовательское представление, которое может прокручиваться по вертикали (а не по горизонтали), однако есть несколько проблем:

  1. Я могу прокрутить еще дальше, что нарисовано
  2. Эффект эффекта ребра отсутствует, так как я ScrollView до конца пользовательского представления (я имею в виду как RecyclerView или ScrollView )
  3. Все пользовательские свитки просмотров, а не только некоторые его части
  4. Я не совсем понимаю, что происходит

Может ли кто-нибудь объяснить, как прокрутка работает в пользовательском представлении и как правильно ее реализовать с помощью этих функций?

Могу ли я предложить простой макет, который имеет фиксированный заголовок и вертикально прокручиваемый контент, который звучит так, как будто он будет делать то, что вы хотите, и не требует сложного программирования? Это может избавить вас от необходимости тратить часы исследований и программирования в долгосрочной перспективе:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/header" android:layout_width="match_parent" android:layout_height="wrap_content"/> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:fillViewport="true"> <FrameLayout android:id="@+id/scrolling_content" android:layout_width="match_parent" android:layout_height="wrap_content"/> </android.support.v4.widget.NestedScrollView> </LinearLayout> 

Используя этот макет, вы должны заменить или вставить внутри FrameLayout с «заголовком» идентификатора с фиксированным заголовком. Затем вы помещаете свой файл scolling внутри FrameLayout с идентификатором «scrolling_content». NestedScrollingView будет располагаться непосредственно под вашим фиксированным заголовком и автоматически дает вам поведение прокрутки, которое вы хотите, без какого-либо дополнительного кода.