NestedScrollView + CoodinatorLayout scrollBy() scrollTo() methods do nothing

后端 未结 2 554
甜味超标
甜味超标 2020-12-21 05:53

I have a NestedScrollView being used with CoordinatorLayout + AppBarLayout + CollapsingToolbarLayout with parallax effect similar to this tutorial

I need to scroll t

相关标签:
2条回答
  • 2020-12-21 06:31

    How do I scroll like this programmatically?

    For that scrolling behavior you need collapse or expand CollapsingToolbarLayout no need to scroll your the NestedScrollView

    Here is the sample code for that

    Try this Make some below changes in your Layout

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/rootView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
    
        <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:fitsSystemWindows="true">
    
            <com.google.android.material.appbar.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:expandedTitleMarginEnd="64dp"
                app:expandedTitleMarginStart="48dp"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                <ImageView
                    android:id="@+id/iv_image"
                    android:layout_width="match_parent"
                    android:layout_height="250dp"
                    android:adjustViewBounds="true"
                    android:scaleType="fitXY"
                    android:src="@drawable/goku"
                    app:layout_collapseMode="parallax"
                    app:layout_collapseParallaxMultiplier="0.7" />
    
                <androidx.appcompat.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:contentInsetLeft="0dp"
                    app:contentInsetStart="0dp"
                    app:contentInsetStartWithNavigation="0dp"
                    app:titleTextAppearance="@style/AppTheme.Toolbar.Title"
                    app:popupTheme="@style/AppTheme.PopupOverlay" />
    
            </com.google.android.material.appbar.CollapsingToolbarLayout>
    
        </com.google.android.material.appbar.AppBarLayout>
    
    
        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:background="@color/Boxcolordiabled"
            app:layout_anchor="@id/app_bar"
            app:layout_anchorGravity="bottom|end"
            app:srcCompat="@drawable/ic_favorite" />
    
        <androidx.core.widget.NestedScrollView
            android:id="@+id/nsv_form"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/holo_blue_light"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:animateLayoutChanges="true"
                android:orientation="vertical">
    
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
    
                <Button
                    android:id="@+id/btnColl"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="Expand " />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="10dp"
                    android:text="@string/demo" />
    
    
            </LinearLayout>
    
        </androidx.core.widget.NestedScrollView>
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    

    Activity code

    import android.animation.ValueAnimator;
    import android.os.Bundle;
    import android.view.View;
    import android.view.animation.DecelerateInterpolator;
    import android.widget.Button;
    import android.widget.Toast;
    import com.google.android.material.appbar.AppBarLayout;
    import com.google.android.material.floatingactionbutton.FloatingActionButton;
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    import androidx.coordinatorlayout.widget.CoordinatorLayout;
    import neel.com.bottomappbar.R;
    
    public class MainActivity extends AppCompatActivity {
    
        Toolbar toolbar;
        AppBarLayout app_bar;
        Button btnColl;
        FloatingActionButton fab;
        CoordinatorLayout rootView;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setTitle("Stack Demo");
    
            app_bar = findViewById(R.id.app_bar);
            btnColl = findViewById(R.id.btnColl);
            fab = findViewById(R.id.fab);
            rootView = findViewById(R.id.rootView);
    
    
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    Toast.makeText(MainActivity.this, "Collapse FAB Clicked", Toast.LENGTH_SHORT).show();
    
                    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) app_bar.getLayoutParams();
                    final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
    
                    if (behavior != null) {
                        ValueAnimator valueAnimator = ValueAnimator.ofInt();
                        valueAnimator.setInterpolator(new DecelerateInterpolator());
    
                        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                            @Override
                            public void onAnimationUpdate(ValueAnimator animation) {
                                behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
                                app_bar.requestLayout();
                            }
                        });
    
                        valueAnimator.setIntValues(0, -900);
                        valueAnimator.setDuration(1000);
                        valueAnimator.start();
                    }
                }
            });
    
            btnColl.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    Toast.makeText(MainActivity.this, "Expand btnColl Clicked", Toast.LENGTH_SHORT).show();
    
                    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) app_bar.getLayoutParams();
                    final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
                    if (behavior != null) {
    
                        ValueAnimator valueAnimator = ValueAnimator.ofInt();
                        valueAnimator.setInterpolator(new DecelerateInterpolator());
    
                        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                            @Override
                            public void onAnimationUpdate(ValueAnimator animation) {
                                behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
                                app_bar.requestLayout();
                            }
                        });
    
                        valueAnimator.setIntValues(-900, 0);
                        valueAnimator.setDuration(400);
                        valueAnimator.start();
                    }
    
    
                }
            });
        }
    
    
    }
    

    OUTPUT

    https://www.youtube.com/watch?v=nZY1zPxjRt0

    0 讨论(0)
  • 2020-12-21 06:31

    Scrolls (scrollBy()/scrollTo()/smoothScrollTo()/smoothScrollBy()) needs to be called from UI thread.

    In Kotlin, you can use

    Handler().post {
        nsv_form.scrollBy(0, 300)
    }
    
    0 讨论(0)
提交回复
热议问题