2016-10-13 33 views
4

我有一個自定義標題與自定義行爲,與協調器佈局進行交互。這個頭文件依賴於一個包含collapsingToolbarLayout和一個工具欄的appBarLayout。當工具欄佈局崩潰時,自定義標題會調整其屬性並按照我想要的方式進行定位,但第二次達到佈局的最小高度時,appBarLayout會重疊自定義標題,直到我開始展開爲止。AppBarLayout與我的自定義視圖重疊layout_behavior

enter image description here

enter image description here

這是佈局的代碼:

<?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.support.design.widget.AppBarLayout 
    android:id="@+id/toolbar_layout" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/mk_appbar_height"> 

    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/toolbar_collapse" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:minHeight="@dimen/mt_toolbar_height" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed" 
     app:titleEnabled="false"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      style="@style/ToolbarStyle" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/mt_toolbar_height" 
      app:layout_collapseMode="pin" 
      /> 

    </android.support.design.widget.CollapsingToolbarLayout> 

</android.support.design.widget.AppBarLayout> 

<!-- This is a layout intended for containing MonkeyChatFragment and/or MonkeyConversationsFragment 
RelativeLayout has an issue that doesn't render the RecyclerView with the whole size of its 
container linear layout. 
The only viable solution is FrameLayout --> 
<FrameLayout 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 
<FrameLayout 
    android:id="@+id/viewStatus" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/status_height" 
    android:layout_marginTop="@dimen/status_inverse_height" 
    android:background="@color/mk_status_connected"/> 

<com.criptext.monkeykitui.toolbar.HeaderView 
    android:id="@+id/custom_toolbar" 
    layout="@layout/custom_toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="56dp" 
    app:layout_behavior="com.criptext.monkeykitui.toolbar.HeaderViewBehavior" 
    app:behavior_overlapTop="64dp" 
    /></android.support.design.widget.CoordinatorLayout> 

,這是layout_behavior的代碼:

class HeaderViewBehavior(context: Context, attrs: AttributeSet? = null) : CoordinatorLayout.Behavior<HeaderView>(context, attrs){ 

private val MIN_AVATAR_PERCENTAGE_SIZE = 0.3f 
private val EXTRA_FINAL_AVATAR_PADDING = 80 

private val TAG = "behavior" 
private val mContext: Context = context 

private val mCustomFinalHeight: Float = 0.toFloat() 

private var mStartToolbarPosition: Float = 0.toFloat() 
private var mStartYPosition: Int = 0 
private var mFinalYPosition: Int = 0 
private var mStartHeight: Int = 0 
private var mfontSize: Float = 20.toFloat() 
private var mChangeBehaviorPoint: Float = 0.toFloat() 

override fun layoutDependsOn(parent: CoordinatorLayout?, child: HeaderView?, dependency: View?): Boolean { 
    var hello = (dependency is AppBarLayout) 
    return hello 
} 

override fun onDependentViewChanged(parent: CoordinatorLayout, child: HeaderView, dependency: View): Boolean { 
    maybeInitProperties(child, dependency) 

    val maxScrollDistance = - mContext.resources.getDimension(R.dimen.mk_header_scroll) 
    val expandedPercentageFactor = dependency.y/maxScrollDistance 
    Log.d("TEST", dependency.y.toString()) 
    Log.d("TEST", maxScrollDistance.toString()) 


    if (expandedPercentageFactor < mChangeBehaviorPoint) { 
     val heightFactor = (mChangeBehaviorPoint - expandedPercentageFactor)/mChangeBehaviorPoint 

     val distanceYToSubtract = (mStartYPosition - mFinalYPosition) * (1f - expandedPercentageFactor) + child.getHeight()/2 

     child.setY(mStartYPosition - distanceYToSubtract) 

     val heightToSubtract = (mStartHeight - mCustomFinalHeight) * heightFactor 

     val lp = child.layoutParams as CoordinatorLayout.LayoutParams 

     child.layoutParams = lp 
    } else { 
     val distanceYToSubtract = (mStartYPosition - mFinalYPosition) * (1f - expandedPercentageFactor) 

     child.setY(mStartYPosition - distanceYToSubtract) 

     if(mStartYPosition - distanceYToSubtract < mStartYPosition){ 
      child.setY(mStartYPosition.toFloat()) 
     }else if(mStartYPosition - distanceYToSubtract > mFinalYPosition){ 
      child.setY(mFinalYPosition.toFloat()) 
     } 

     child.title.textSize = mfontSize - (mfontSize - 25) * (1f - expandedPercentageFactor) 
     child.subtitle.textSize = 15 - (15 - 20) * (1f - expandedPercentageFactor) 

     child.imageView.layoutParams.height = (126 - (126 - 226) * (1f - expandedPercentageFactor)).toInt() 
     child.imageView.layoutParams.width = (126 - (126 - 226) * (1f - expandedPercentageFactor)).toInt() 

    } 
    return true 
} 

private fun maybeInitProperties(child: HeaderView, dependency: View) { 
    if (mStartYPosition === 0) 
     mStartYPosition = 0 

    if (mFinalYPosition === 0) 
     mFinalYPosition = mContext.resources.getDimension(R.dimen.mk_header_scroll).toInt() 

    if (mStartHeight === 0) 
     mStartHeight = child.getHeight() 

    if (mStartToolbarPosition === 0.toFloat()) 
     mStartToolbarPosition = dependency.y 

    if (mChangeBehaviorPoint === 0.toFloat()) 
     mChangeBehaviorPoint = (child.height - mCustomFinalHeight)/(2f * (mStartYPosition - mFinalYPosition)) 
} 
} 
+1

你有沒有發現一些有用的東西,解決辦法? – MiguelHincapieC

回答

0

以防萬一別人正在尋找我可以說我找到的相同答案解決方案在另一個SO問題後,直接浪費6個小時嘗試各種解決方案無濟於事。

爲了View明顯覆蓋AppBarLayout後者已經倒塌後你需要添加android:elevation="8dp"(或更高值)屬性來覆蓋View

因此,在需要改變問題的代碼的部分是:

<com.criptext.monkeykitui.toolbar.HeaderView 
    android:id="@+id/custom_toolbar" 
    layout="@layout/custom_toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="56dp" 
    app:layout_behavior="com.criptext.monkeykitui.toolbar.HeaderViewBehavior" 
    app:behavior_overlapTop="64dp" 
/> 

到:

<com.criptext.monkeykitui.toolbar.HeaderView 
    android:id="@+id/custom_toolbar" 
    layout="@layout/custom_toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="56dp" 
    app:layout_behavior="com.criptext.monkeykitui.toolbar.HeaderViewBehavior" 
    app:behavior_overlapTop="64dp" 
    android:elevation="8dp" 
/> 

所有學分去@kris larson的答案在這裏:CoordinatorLayout custom behavior with AppBarLayout