CollapsingToolbarLayout處于折疊狀態(tài)(Collapsed)狀態(tài)時,所含Toolbar下方默認會出現(xiàn)陰影,該陰影并非內部Toolbar的陰影,而是外部AppLayout的陰影,所以要修改這個陰影就需要處理AppBarLayout。5.0以下的系統(tǒng)可以通過設置app:elevetion來產生陰影,5.0以上系統(tǒng)則沒有效果,設了該屬性反而所有陰影都會消失。
查看AppBarLayout源碼,發(fā)現(xiàn)getTargetElevation()方法已經廢棄了,永遠返回0,setTargetElevation()也廢棄了,看一下說明和所留下的保底實現(xiàn):
* @deprecated target elevation is now deprecated. AppBarLayout's elevation is now
* controlled via a {@link android.animation.StateListAnimator}. If a target
* elevation is set, either by this method or the {@code app:elevation} attribute,
* a new state list animator is created which uses the given {@code elevation} value.
*
* @attr ref android.support.design.R.styleable#AppBarLayout_elevation
*/
@Deprecated
public void setTargetElevation(float elevation) {
if (Build.VERSION.SDK_INT >= 21) {
ViewUtilsLollipop.setDefaultAppBarLayoutStateListAnimator(this, elevation);
}
}
也就是說現(xiàn)在Elevation這個屬性需要通過StateListAnimator的方式來設置。下面的保底方法點進去看一下:
/**
* Creates and sets a {@link StateListAnimator} with a custom elevation value
*/
static void setDefaultAppBarLayoutStateListAnimator(final View view, final float elevation) {
final int dur = view.getResources().getInteger(R.integer.app_bar_elevation_anim_duration);
final StateListAnimator sla = new StateListAnimator();
// 可用并且可折疊但未折疊(展開)狀態(tài)下去掉陰影
// Enabled and collapsible, but not collapsed means not elevated
sla.addState(new int[]{android.R.attr.enabled, R.attr.state_collapsible,
-R.attr.state_collapsed},
ObjectAnimator.ofFloat(view, "elevation", 0f).setDuration(dur));
// 可用狀態(tài)下加上陰影
// Default enabled state
sla.addState(new int[]{android.R.attr.enabled},
ObjectAnimator.ofFloat(view, "elevation", elevation).setDuration(dur));
// 其他狀態(tài)下去掉陰影
// Disabled state
sla.addState(new int[0],
ObjectAnimator.ofFloat(view, "elevation", 0).setDuration(0));
view.setStateListAnimator(sla);
}
我們可以模仿這里的方式,通過5.0后推薦的ObjectAnimator方式添加陰影,如果要在xml中設置的話,就需要新建一個Drawable資源(這里名叫appbar_elevation.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<!--折疊狀態(tài)下的陰影-->
<item app:state_collapsed="true">
<objectAnimator
android:propertyName="elevation"
android:valueTo="5dp"
android:valueType="floatType" />
</item>
<!--展開狀態(tài)下的陰影-->
<item app:state_collapsed="false">
<objectAnimator
android:propertyName="elevation"
android:valueTo="0dp"
android:valueType="floatType" />
</item>
</selector>
然后為AppBarLayout設置stateListAnimator屬性:
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="#FFFFFFFF"
android:stateListAnimator="@drawable/appbar_elevation">
這樣就可以了。