修改CollapsingToolbarLayout折疊時候的陰影

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">

這樣就可以了。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容