Skip to content

Instantly share code, notes, and snippets.

@samuel22gj
Last active May 16, 2017 05:36
Show Gist options
  • Save samuel22gj/ca430eefb44c36bdd57562bd8c4ec311 to your computer and use it in GitHub Desktop.
Save samuel22gj/ca430eefb44c36bdd57562bd8c4ec311 to your computer and use it in GitHub Desktop.
with OnScrimVisibilityChangedListener
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