Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.design.widget.CoordinatorLayout
- ...>
- <android.support.design.widget.AppBarLayout
- ...>
- <android.support.design.widget.CollapsingToolbarLayout
- ...>
- <android.support.v7.widget.Toolbar
- .../>
- </android.support.design.widget.CollapsingToolbarLayout>
- </android.support.design.widget.AppBarLayout>
- <include layout="@layout/content_scrolling"/>
- <Button
- android:id="@+id/my_button"
- android:layout_width="match_parent"
- android:layout_height="40dp"
- android:text="my sticky button"
- android:background="#ff0000"
- android:layout_gravity="center_horizontal"
- app:layout_anchor="@id/anchor"
- app:layout_anchorGravity="top"/>
- <android.support.design.widget.FloatingActionButton
- .../>
- </android.support.design.widget.CoordinatorLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <TextView
- android:layout_width="match_parent"
- android:layout_height="1000dp"
- .../>
- <View
- android:id="@+id/anchor"
- android:layout_height="40dp"
- android:layout_width="match_parent"/>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="200dp"
- .../>
- </LinearLayout>
- public class StickyBottomBehavior extends CoordinatorLayout.Behavior {
- private Integer mInitialMargin = 100;
- @Override
- public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull
- View child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) {
- return (axes == SCROLL_AXIS_VERTICAL);
- }
- @Override
- public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View
- child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) {
- super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
- updateMargin(coordinatorLayout, child);
- }
- private void updateMargin(CoordinatorLayout coordinatorLayout, View child) {
- int coordBottom = coordinatorLayout.getBottom();
- //Get anchored View to know its position
- int id = ((CoordinatorLayout.LayoutParams) child.getLayoutParams()).getAnchorId();
- View anchor = coordinatorLayout.findViewById(id);
- int[] anchorLocation = new int[2];
- anchor.getLocationInWindow(anchorLocation);
- int diff = Math.max(coordBottom - anchorLocation[1], 0);
- //add margins according to how close the child is from the bottom
- ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) child.getLayoutParams();
- layoutParams.leftMargin = Math.min(diff/2, mInitialMargin);
- layoutParams.rightMargin = Math.min(diff/2, mInitialMargin);
- child.setLayoutParams(layoutParams);
- }
Add Comment
Please, Sign In to add comment