Last active
May 16, 2017 05:36
-
-
Save samuel22gj/ca430eefb44c36bdd57562bd8c4ec311 to your computer and use it in GitHub Desktop.
with OnScrimVisibilityChangedListener
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class ECCollapsingToolbarLayout extends CollapsingToolbarLayout { | |
private boolean mIsScrimShow; | |
private OnScrimVisibilityChangedListener mOnScrimVisibilityChangedListener; | |
private AppBarLayout.OnOffsetChangedListener mOnOffsetChangedListener; | |
public ECCollapsingToolbarLayout(Context context) { | |
super(context); | |
} | |
public ECCollapsingToolbarLayout(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
} | |
public ECCollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
} | |
/** | |
* @return Whether the scrim is shown. | |
*/ | |
public boolean isScrimShow() { | |
return mIsScrimShow; | |
} | |
/** | |
* Register a callback to be invoked when scrim visibility changed. | |
*/ | |
public void setOnScrimVisibilityChangedListener(@Nullable OnScrimVisibilityChangedListener listener) { | |
mOnScrimVisibilityChangedListener = listener; | |
} | |
@Override | |
protected void onAttachedToWindow() { | |
super.onAttachedToWindow(); | |
final ViewParent parent = getParent(); | |
if (parent instanceof AppBarLayout) { | |
if (mOnOffsetChangedListener == null) { | |
mOnOffsetChangedListener = new OffsetUpdateListener(); | |
} | |
((AppBarLayout) parent).addOnOffsetChangedListener(mOnOffsetChangedListener); | |
} | |
} | |
@Override | |
protected void onDetachedFromWindow() { | |
super.onDetachedFromWindow(); | |
final ViewParent parent = getParent(); | |
if (mOnOffsetChangedListener != null && parent instanceof AppBarLayout) { | |
((AppBarLayout) parent).removeOnOffsetChangedListener(mOnOffsetChangedListener); | |
} | |
} | |
/** | |
* Callback to be invoked when the visibility of scrim changes. | |
*/ | |
public interface OnScrimVisibilityChangedListener { | |
void onShown(ECCollapsingToolbarLayout collapsingToolbarLayout); | |
void onHidden(ECCollapsingToolbarLayout collapsingToolbarLayout); | |
} | |
private class OffsetUpdateListener implements AppBarLayout.OnOffsetChangedListener { | |
OffsetUpdateListener() { | |
} | |
@Override | |
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { | |
if (isScrimVisible(verticalOffset)) { | |
if (mOnScrimVisibilityChangedListener != null && !mIsScrimShow) { | |
mOnScrimVisibilityChangedListener.onShown(ECCollapsingToolbarLayout.this); | |
} | |
mIsScrimShow = true; | |
} else { | |
if (mOnScrimVisibilityChangedListener != null && mIsScrimShow) { | |
mOnScrimVisibilityChangedListener.onHidden(ECCollapsingToolbarLayout.this); | |
} | |
mIsScrimShow = false; | |
} | |
} | |
private boolean isScrimVisible(int verticalOffset) { | |
return getHeight() + verticalOffset < getScrimVisibleHeightTrigger(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment