Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mastering Coordinator Layout

Mastering Coordinator Layout

If you ever used Collapsing Toolbar you also had to use Coordinator Layout. But, did you know that Coordinator Layout can be used to implement custom advanced View interactions? We are going to go through a real-life example and see how awesome Coordinator Layout is.

Domagoj Korman

October 04, 2017
Tweet

More Decks by Domagoj Korman

Other Decks in Education

Transcript

  1. // React on view changes layoutDependsOn(); onDependentViewChanged(); // Touch events

    onInterceptTouchEvent(); onTouchEvent(); // Scroll events onNestedPreScroll(); onNestedScroll(); // Fling events onNestedPreFling(); onNestedFling();
  2. AVATAR TOOLBAR NAME RECYCLER F T F fun layoutDependsOn( parent:

    CoordinatorLayout?, child: ImageView?, dependency: View?) : Boolean { return R.id.toolbar == dependency?.id }
  3. override fun onMeasureChild( parent: CoordinatorLayout?, child: RecyclerView?, parentWidthMeasureSpec: Int, widthUsed:

    Int, parentHeightMeasureSpec: Int, heightUsed: Int): Boolean { //Calculate new view height ... parent.onMeasureChild(child, parentWidthMeasureSpec, widthUsed, newHeightMeasureSpec, heightUsed) return true }
  4. override fun onDependentViewChanged( parent: CoordinatorLayout?, child: ImageView?, dependency: View?): Boolean

    { // MATH SKILLS! child.layoutParams = lp child.y = newY child.x = newX return true }
  5. override fun onNestedPreScroll( coordinatorLayout: CoordinatorLayout, child: RecyclerView, target: View, dx:

    Int, dy: Int, consumed: IntArray, type: Int) { //Animate layout changes based on DY scroll(coordinatorLayout, child, dy) }
  6. override fun onNestedPreScroll( coordinatorLayout: CoordinatorLayout, child: RecyclerView, target: View, dx:

    Int, dy: Int, consumed: IntArray, type: Int) { //Animate layout changes based on DY consumed[1] = scroll(coordinatorLayout, child, dy) }
  7. override fun onNestedPreFling( coordinatorLayout: CoordinatorLayout, child: RecyclerView, target: View, velocityX:

    Float, velocityY: Float): Boolean override fun onNestedFling( coordinatorLayout: CoordinatorLayout, child: RecyclerView, target: View, velocityX: Float, velocityY: Float, consumed: Boolean): Boolean
  8. override fun onNestedPreScroll( coordinatorLayout: CoordinatorLayout, child: RecyclerView, target: View, dx:

    Int, dy: Int, consumed: IntArray, type: Int) { //Animate layout changes based on DY consumed[1] = scroll(coordinatorLayout, child, dy) }
  9. override fun onInterceptTouchEvent( parent: CoordinatorLayout, child: RecyclerView, ev: MotionEvent?): Boolean

    override fun onTouchEvent( parent: CoordinatorLayout, child: RecyclerView, ev: MotionEvent?): Boolean
  10. override fun onScroll( e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY:

    Float): Boolean { isScrolling = true scroll(distanceY.toInt()) return true }
  11. override fun onInterceptTouchEvent(...): Boolean { gestureDetector.onTouchEvent(ev) return isScrolling } override

    fun onTouchEvent(...): Boolean { val eventConsumed = detector.onTouchEvent(ev) if (ev?.action == MotionEvent.ACTION_UP) { isScrolling = false } return eventConsumed }
  12. override fun onInterceptTouchEvent(...): Boolean { gestureDetector.onTouchEvent(ev) return isScrolling } override

    fun onTouchEvent(...): Boolean { val eventConsumed = detector.onTouchEvent(ev) if (ev?.action == MotionEvent.ACTION_UP) { isScrolling = false } return eventConsumed }
  13. override fun onInterceptTouchEvent(...): Boolean { gestureDetector.onTouchEvent(ev) return isScrolling } override

    fun onTouchEvent(...): Boolean { val eventConsumed = detector.onTouchEvent(ev) if (ev?.action == MotionEvent.ACTION_UP) { isScrolling = false } return eventConsumed }
  14. override fun onInterceptTouchEvent(...): Boolean { gestureDetector.onTouchEvent(ev) return isScrolling } override

    fun onTouchEvent(...): Boolean { val eventConsumed = detector.onTouchEvent(ev) if (ev?.action == MotionEvent.ACTION_UP) { isScrolling = false } return eventConsumed }
  15. COORDINATOR LAYOUT IS AWESOME • Dynamically react to dependant View

    change • Allows implementation of custom Animations
 • Multiple approaches when creating Animations