diff options
Diffstat (limited to 'library/main/src/com/android/setupwizardlib/view/StickyHeaderScrollView.java')
-rw-r--r-- | library/main/src/com/android/setupwizardlib/view/StickyHeaderScrollView.java | 125 |
1 files changed, 63 insertions, 62 deletions
diff --git a/library/main/src/com/android/setupwizardlib/view/StickyHeaderScrollView.java b/library/main/src/com/android/setupwizardlib/view/StickyHeaderScrollView.java index ca47446..9fd7b0c 100644 --- a/library/main/src/com/android/setupwizardlib/view/StickyHeaderScrollView.java +++ b/library/main/src/com/android/setupwizardlib/view/StickyHeaderScrollView.java @@ -30,12 +30,13 @@ import android.view.WindowInsets; * drawn when the sticky element hits the top of the view. * * <p>There are a few things to note: + * * <ol> * <li>The two supported scenarios are StickyHeaderScrollView -> subview (stickyContainer) -> - * sticky, and StickyHeaderScrollView -> container -> subview (sticky). - * The arrow (->) represents parent/child relationship and must be immediate child. + * sticky, and StickyHeaderScrollView -> container -> subview (sticky). The arrow (->) + * represents parent/child relationship and must be immediate child. * <li>If fitsSystemWindows is true, then this will offset the sticking position by the height of - * the system decorations at the top of the screen. + * the system decorations at the top of the screen. * <li>For versions before Honeycomb, this will behave like a regular ScrollView. * </ol> * @@ -43,75 +44,75 @@ import android.view.WindowInsets; */ public class StickyHeaderScrollView extends BottomScrollView { - private View mSticky; - private View mStickyContainer; - private int mStatusBarInset = 0; + private View sticky; + private View stickyContainer; + private int statusBarInset = 0; - public StickyHeaderScrollView(Context context) { - super(context); - } + public StickyHeaderScrollView(Context context) { + super(context); + } - public StickyHeaderScrollView(Context context, AttributeSet attrs) { - super(context, attrs); - } + public StickyHeaderScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } - public StickyHeaderScrollView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } + public StickyHeaderScrollView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - super.onLayout(changed, l, t, r, b); - if (mSticky == null) { - updateStickyView(); - } - updateStickyHeaderPosition(); + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + if (sticky == null) { + updateStickyView(); } + updateStickyHeaderPosition(); + } - public void updateStickyView() { - mSticky = findViewWithTag("sticky"); - mStickyContainer = findViewWithTag("stickyContainer"); - } + public void updateStickyView() { + sticky = findViewWithTag("sticky"); + stickyContainer = findViewWithTag("stickyContainer"); + } - private void updateStickyHeaderPosition() { - // Note: for pre-Honeycomb the header will not be moved, so this ScrollView essentially - // behaves like a normal BottomScrollView. - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - if (mSticky != null) { - // The view to draw when sticking to the top - final View drawTarget = mStickyContainer != null ? mStickyContainer : mSticky; - // The offset to draw the view at when sticky - final int drawOffset = mStickyContainer != null ? mSticky.getTop() : 0; - // Position of the draw target, relative to the outside of the scrollView - final int drawTop = drawTarget.getTop() - getScrollY(); - if (drawTop + drawOffset < mStatusBarInset || !drawTarget.isShown()) { - // ScrollView translates the whole canvas so we have to compensate for that - drawTarget.setTranslationY(getScrollY() - drawOffset); - } else { - drawTarget.setTranslationY(0); - } - } + private void updateStickyHeaderPosition() { + // Note: for pre-Honeycomb the header will not be moved, so this ScrollView essentially + // behaves like a normal BottomScrollView. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (sticky != null) { + // The view to draw when sticking to the top + final View drawTarget = stickyContainer != null ? stickyContainer : sticky; + // The offset to draw the view at when sticky + final int drawOffset = stickyContainer != null ? sticky.getTop() : 0; + // Position of the draw target, relative to the outside of the scrollView + final int drawTop = drawTarget.getTop() - getScrollY(); + if (drawTop + drawOffset < statusBarInset || !drawTarget.isShown()) { + // ScrollView translates the whole canvas so we have to compensate for that + drawTarget.setTranslationY(getScrollY() - drawOffset); + } else { + drawTarget.setTranslationY(0); } + } } + } - @Override - protected void onScrollChanged(int l, int t, int oldl, int oldt) { - super.onScrollChanged(l, t, oldl, oldt); - updateStickyHeaderPosition(); - } + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + updateStickyHeaderPosition(); + } - @Override - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public WindowInsets onApplyWindowInsets(WindowInsets insets) { - if (getFitsSystemWindows()) { - mStatusBarInset = insets.getSystemWindowInsetTop(); - insets = insets.replaceSystemWindowInsets( - insets.getSystemWindowInsetLeft(), - 0, /* top */ - insets.getSystemWindowInsetRight(), - insets.getSystemWindowInsetBottom() - ); - } - return insets; + @Override + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + if (getFitsSystemWindows()) { + statusBarInset = insets.getSystemWindowInsetTop(); + insets = + insets.replaceSystemWindowInsets( + insets.getSystemWindowInsetLeft(), + 0, /* top */ + insets.getSystemWindowInsetRight(), + insets.getSystemWindowInsetBottom()); } + return insets; + } } |