Плавная прокрутка и пролистывание с помощью NestedScrollView, AppBarLayout и CoordinatorLayout

Я работаю над приложением, в котором я использую AppBarLayout с CollapsingToolbarLayout и NestedScrollView. Я успешно реализовал это, и он работает нормально.

Теперь я пытаюсь сделать так, чтобы при броске (быстрое движение вверх) в Nestedscrollview он полностью прокручивался вверх. Аналогичным образом, при быстром пролистывании вниз по экрану он должен плавно прокручиваться до самого дна. Однако теперь, это только застревает между, который заставляет это выглядеть уродливым. Я перепробовал множество доступных решений, но у меня ничего не получалось. Моя текущая настройка ниже.

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:zhy="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="RtlHardcoded">

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/main.collapsing"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:id="@+id/placeholder"
            android:layout_width="match_parent"
            android:layout_height="246dp"
            android:scaleType="fitXY"
            android:tint="#11000000"
            app:layout_collapseMode="parallax"
            app:layout_collapseParallaxMultiplier="0.9" />


        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:padding="10dp">


            <FrameLayout
                android:id="@+id/back_frame"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left|center_vertical"
                android:paddingBottom="5dp"
                android:paddingLeft="5dp"
                android:paddingRight="10dp"
                android:paddingTop="5dp">

                <ImageView
                    android:id="@+id/back_image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:src="@drawable/abc_ic_ab_back_mtrl_am_alpha" />
            </FrameLayout>


            <FrameLayout
                android:id="@+id/frameLayoutheart"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:layout_gravity="right|center_vertical"
                android:paddingBottom="5dp"
                android:paddingLeft="10dp"
                android:paddingRight="5dp"
                android:paddingTop="5dp">

                <ImageView
                    android:id="@+id/favbtnicon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:src="@drawable/heart_profile" />
            </FrameLayout>


        </FrameLayout>

        <FrameLayout
            android:id="@+id/main.framelayout.title"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:layout_gravity="bottom|center_horizontal"
            android:orientation="vertical"

            app:layout_collapseMode="parallax"
            app:layout_collapseParallaxMultiplier="0.3">

            <LinearLayout
                android:id="@+id/main.linearlayout.title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:gravity="top"
                android:orientation="vertical">


                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"

                    android:orientation="horizontal">

                    <TextView
                        android:id="@+id/profileName"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="25dp"
                        android:inputType="textNoSuggestions"
                        android:singleLine="true"
                        android:text="Ankita arora"
                        android:textColor="@android:color/white"
                        android:textSize="25sp"
                        android:textStyle="bold" />


                    <ImageView
                        android:id="@+id/onlinestatus"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="29dp"
                        android:src="@drawable/online"
                        android:visibility="visible" />
                </LinearLayout>


                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:orientation="horizontal">

                    <TextView
                        android:id="@+id/age"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_horizontal"
                        android:inputType="textCapSentences"
                        android:text="asdas"
                        android:textColor="@android:color/white"
                        android:textSize="13sp" />


                    <TextView
                        android:layout_width="4dp"
                        android:layout_height="4dp"
                        android:layout_gravity="center"

                        android:layout_marginLeft="4dp"
                        android:layout_marginRight="4dp"
                        android:background="@drawable/white_dot" />

                    <TextView
                        android:id="@+id/sex"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_horizontal"
                        android:inputType="textCapSentences"
                        android:text="asdas"
                        android:textColor="@android:color/white"
                        android:textSize="13sp" />


                    <TextView
                        android:id="@+id/loc_point"
                        android:layout_width="4dp"
                        android:layout_height="4dp"
                        android:layout_gravity="center"

                        android:layout_marginLeft="4dp"
                        android:layout_marginRight="4dp"
                        android:background="@drawable/white_dot" />


                    <TextView
                        android:id="@+id/loc"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_horizontal"
                        android:inputType="textCapSentences"
                        android:text="asdas"
                        android:textColor="@android:color/white"
                        android:textSize="13sp" />

                </LinearLayout>


            </LinearLayout>
        </FrameLayout>
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>


<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    app:behavior_overlapTop="10dp"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"

    >

    ------content--------------


     </android.support.v4.widget.NestedScrollView>


<android.support.v7.widget.Toolbar
    android:id="@+id/main.toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/pinkColor"
    android:visibility="invisible"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp"
    app:layout_anchor="@id/main.framelayout.title"
    app:theme="@style/ThemeOverlay.AppCompat.Dark"
    app:title="">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/back"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="4dp"
            android:src="@drawable/abc_ic_ab_back_mtrl_am_alpha"
            android:visibility="invisible" />

        <Space
            android:layout_width="@dimen/image_final_width"
            android:layout_height="@dimen/image_final_width" />


        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:id="@+id/main.textview.title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:layout_gravity="left"
                android:text="@string/quila_name2"
                android:textColor="@android:color/white"
                android:textSize="20sp" />

            <TextView
                android:id="@+id/status"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:layout_marginTop="-4dp"
                android:text="@string/quila_name2"
                android:textColor="@android:color/white"
                android:textSize="12sp" />


        </LinearLayout>

    </LinearLayout>
</android.support.v7.widget.Toolbar>

<de.hdodenhof.circleimageview.CircleImageView
    android:id="@+id/profileimg"
    android:layout_width="@dimen/image_width"
    android:layout_height="@dimen/image_width"
    android:layout_gravity="center_horizontal"

    app:border_color="@android:color/white"
    app:border_width="2dp"
    app:finalHeight="@dimen/image_final_width"
    app:finalYPosition="2dp"
    app:layout_behavior="com.sdl.apps.yaarri.views.AvatarImageBehavior"
    app:startHeight="2dp"
    app:startToolbarPosition="2dp"
    app:startXPosition="2dp" />

Один из наиболее приемлемых ответов, показанный ниже, мне тоже не помог.

Невозможно плавно прокрутить AppBarLayout и сворачивающуюся панель инструментов с помощью NestedScrollView

 Harry Sharma30 июн. 2016 г., 12:16
Никакая панель инструментов не находится внутри nestedScrollView. Есть обычные виды, которые находятся внутри нее. Когда я бросаю вызов Nestedscrollview, он должен полностью прокрутиться до вершины, а Appbarlayout должен полностью развалиться, но здесь он застревает между ними. Dat означает, что он не полностью прокручивается до вершины.
 himanshu149630 июн. 2016 г., 12:09
Можете ли вы объяснить ваши требования в деталях? вы сказалиNestedscrollview it should scroll completely to top and same should work towards downside smoothly but it gets stuck in between но что застревает ?? это твойtoolbar или содержимое внутриnestedScrollView?
 jeldrik schmuch27 июн. 2017 г., 09:03
я использовалэтот и работает отлично и никакой внешней библиотеки не нужно;)

Ответы на вопрос(2)

Решение Вопроса

https://github.com/henrytao-me/smooth-app-bar-layout

Согласно которому поведение можно улучшить, выполнив следующие действия:

1.Change

 android.support.design.widget.AppBarLayout

в

 me.henrytao.smoothappbarlayout.SmoothAppBarLayout and set android:id

2.Remove

 app:layout_behavior="@string/appbar_scrolling_view_behavior"

3. Добавьте заголовок к вашему NestedScrollView или RecyclerView

Что на самом деле заставило его работать как шарм.

Окончательная настройка выглядит как

                <android.support.design.widget.CoordinatorLayout 
                 xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent">

                  <android.support.v4.widget.NestedScrollView
                    android:id="@+id/nested_scroll_view"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <LinearLayout
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:orientation="vertical"
                      android:paddingLeft="16dp"
                      android:paddingRight="16dp"
                      android:paddingTop="@dimen/app_bar_height">

                      <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="16dp"
                        android:layout_marginTop="16dp"
                        android:text="@string/text_short" />

                      <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="16dp"
                        android:text="@string/text_long" />
                    </LinearLayout>
                  </android.support.v4.widget.NestedScrollView>

                  <me.henrytao.smoothappbarlayout.SmoothAppBarLayout
                    android:id="@+id/smooth_app_bar_layout"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/app_bar_height">

                    <android.support.design.widget.CollapsingToolbarLayout
                      android:id="@+id/collapsing_toolbar_layout"
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      app:layout_scrollFlags="scroll|exitUntilCollapsed">

                      <android.support.v7.widget.Toolbar
                        android:id="@+id/toolbar"
                        app:layout_collapseMode="pin"
                        app:navigationIcon="@drawable/ic_menu_arrow_back"
                        style="@style/AppStyle.MdToolbar" />
                    </android.support.design.widget.CollapsingToolbarLayout>
                  </me.henrytao.smoothappbarlayout.SmoothAppBarLayout>
                </android.support.design.widget.CoordinatorLayout> 

Если вы все еще сталкиваетесь с какой-либо проблемой при реализации этого вопроса, я хотел бы помочь и отметить это, если этот ответ поможет.

 Harry Sharma20 нояб. 2016 г., 11:45
Вы запускали образцы, данные на github? Запустите их, не внося никаких изменений ... Они работают отлично ... Если проблема не устранена, напишите мне по адресу [email protected] ... Я сделаю так, чтобы он работал ... :) Happy
 Harry Sharma12 дек. 2016 г., 06:18
Да, попробуй ... это тоже поможет другим :)
 Raphael Royer-Rivard17 нояб. 2016 г., 23:53
Все хорошо, я рад, что ты даже подумал помочь мне, ха-ха. Я использую nestedscrollview
 Raphael Royer-Rivard18 нояб. 2016 г., 19:51
Под заголовком вы имеете в виду paddingTop дочернего макета?
 Raphael Royer-Rivard15 нояб. 2016 г., 16:37
Но что вы имеете в виду на своем шаге 2? Вы сказали, чтобы удалить layout_behavior
 Harry Sharma20 февр. 2017 г., 06:11
Я попробовал также несколько других подходов ... но ни один из них не был таким гладким, как этот ...
 Raphael Royer-Rivard15 нояб. 2016 г., 03:18
Я попробовал ваше решение, но когда я удаляю layout_behavior, панель приложений исчезает ... Знаете почему?
 Raphael Royer-Rivard19 нояб. 2016 г., 01:49
Я также заметил, что в примерах вашего github мне не хватало SmoothCollapsingToolbarLayout, но при добавлении его исчезнувший AppBar не появился.
 Raphael Royer-Rivard21 нояб. 2016 г., 17:01
Я не ... Наконец я решил создать свой собственный AppBarLayout.Behavior и применить его к NestedScrollView. И это работает отлично :) Если вам интересно, вы можете проверить это наstackoverflow.com/a/40711920/1084822
 Raphael Royer-Rivard06 дек. 2016 г., 21:14
@ChadMx О, я вижу, это звучит честно. Но я до сих пор не понимаю, почему Гарри Шарма просит удалить приложение: layout_behavior, пока у него все еще есть высота NestedScrollView как match_parent ...
 Jimit Patel18 февр. 2017 г., 13:30
Любое другое решение, кроме использования сторонней библиотеки?
 Harry Sharma15 нояб. 2016 г., 06:01
Вы не должны удалять это. Это говорит представлению, как вести себя на свитке.
 Harry Sharma16 нояб. 2016 г., 06:17
Ой, извини, я скучаю по твоему вопросу .. ты используешь это с nestedscrollview или recyclerview ... ??
 Harry Sharma18 нояб. 2016 г., 06:27
Вы добавили заголовок .. в nestedscrollview ..? Как я уже упоминал .. Если до сих пор неясно ... пройти через данный образец ... он работает отлично ... Я уверен, что вы что-то упустили ... :)
 Juan Mendez12 дек. 2016 г., 02:41
Я даже закончил учебник, связанный с appbarlayout / nestedscrolllayout, и я хочу попробовать упомянутую вами стороннюю библиотеку. :)
 Harry Sharma08 дек. 2016 г., 06:07
@ RaphaelRoyer-Rivard, потому что я реализовал со своим собственным поведением .. см. Рабочий пример. Он работает без каких-либо недостатков ..
 Chad Mx02 дек. 2016 г., 22:45
@ RaphaelRoyer-Rivard Ваш AppBarLayout исчезает, потому что вы удалили app: layout_behaviour. Одна из вещей, которые делает это объявление, - это указать вашему координатору макета, чтобы вы поместили представление прокрутки ниже вашего AppBarLayout. Поскольку у вас есть высота вашего nestscrollview в виде match_parent, и вы убрали замедление поведения, в вашем AppBarLayout нет места в родительском представлении.

Эта проблема была решена Google из библиотеки поддержки после версии 26.0.0

https://developer.android.com/topic/libraries/support-library/revisions.html#26-0-1

Ваш ответ на вопрос