Skip to content

Instantly share code, notes, and snippets.

@Savrov
Created May 4, 2018 14:20
Show Gist options
  • Save Savrov/bcd97efce0b445500828b8083e8ae208 to your computer and use it in GitHub Desktop.
Save Savrov/bcd97efce0b445500828b8083e8ae208 to your computer and use it in GitHub Desktop.
CollapsingHeaderView
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
android:fitsSystemWindows="true"
app:contentScrim="@android:color/transparent">
<FrameLayout
android:id="@+id/collapsing_header_view_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="none"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/collapsing_header_view_bottom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<FrameLayout
android:id="@+id/collapsing_header_view_divider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_anchor="@id/collapsing_header_view_bottom"
app:layout_anchorGravity="top"
app:layout_collapseMode="none"/>
</android.support.design.widget.CoordinatorLayout>
package com.savrov.collapsingheaderview
import android.annotation.SuppressLint
import android.content.Context
import android.support.design.widget.AppBarLayout
import android.support.design.widget.CollapsingToolbarLayout
import android.support.design.widget.CoordinatorLayout
import android.support.v4.app.Fragment
import android.support.v7.widget.RecyclerView
import android.util.AttributeSet
import android.util.Log
import android.view.View
import android.widget.FrameLayout
import android.opengl.ETC1.getHeight
import android.view.ViewTreeObserver
import android.R.attr.data
import android.util.TypedValue
import android.view.ViewGroup
import android.widget.LinearLayout
@SuppressLint("LongLogTag")
class CollapsingHeaderView : CoordinatorLayout {
companion object {
private const val TAG = "CollapsingHeaderView::class"
}
lateinit var view: View
lateinit var viewTop: FrameLayout
lateinit var viewBottom: FrameLayout
lateinit var viewDivider: FrameLayout
constructor(context: Context): super(context) {
init(context)
}
constructor(context: Context, attributeSet: AttributeSet): super(context, attributeSet) {
init(context, attributeSet)
}
private fun init(context: Context, attributeSet: AttributeSet? = null) {
view = inflate(context, R.layout.collapsing_header_view, this)
viewTop = view.findViewById<FrameLayout>(R.id.collapsing_header_view_top)
viewDivider = view.findViewById<FrameLayout>(R.id.collapsing_header_view_divider)
viewBottom = view.findViewById<FrameLayout>(R.id.collapsing_header_view_bottom)
}
fun addViewTop(top: View) {
viewTop.addView(top)
}
fun addViewBottom(bottom: View) {
viewBottom.addView(bottom)
}
fun addViewDivider(divider: View) {
viewDivider.apply {
addView(divider)
visibility = View.VISIBLE
viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
viewDivider.viewTreeObserver.removeOnGlobalLayoutListener(this)
val bottomParams = viewBottom.layoutParams as MarginLayoutParams
bottomParams.topMargin = viewDivider.height/2
viewBottom.apply {
layoutParams = bottomParams
setPadding(0, viewDivider.height/2, 0, 0)
requestLayout()
invalidate()
}
}
})
}
}
fun setViewTopScrollFlags(scrollFlags: Int) {
val collapsingToolbar = view.findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar)
val params = collapsingToolbar.layoutParams as AppBarLayout.LayoutParams
params.scrollFlags = scrollFlags
collapsingToolbar.layoutParams = params
}
}
@Savrov
Copy link
Author

Savrov commented May 4, 2018

device-2018-05-04-162111
device-2018-05-04-162134
device-2018-05-04-162148

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment