package skin.support.design.widget; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.design.widget.CollapsingToolbarLayout; import android.support.v4.graphics.drawable.DrawableCompat; import android.util.AttributeSet; import skin.support.content.res.SkinCompatResources; import skin.support.design.R; import skin.support.widget.SkinCompatBackgroundHelper; import skin.support.widget.SkinCompatHelper; import skin.support.widget.SkinCompatSupportable; import static skin.support.widget.SkinCompatHelper.INVALID_ID; /** * Created by ximsfei on 17-3-2. */ public class SkinMaterialCollapsingToolbarLayout extends CollapsingToolbarLayout implements SkinCompatSupportable { private int mContentScrimResId = INVALID_ID; private int mStatusBarScrimResId = INVALID_ID; private SkinCompatBackgroundHelper mBackgroundTintHelper; public SkinMaterialCollapsingToolbarLayout(Context context) { this(context, null); } public SkinMaterialCollapsingToolbarLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SkinMaterialCollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CollapsingToolbarLayout, defStyleAttr, R.style.Widget_Design_CollapsingToolbar); mContentScrimResId = a.getResourceId(R.styleable.CollapsingToolbarLayout_contentScrim, INVALID_ID); mStatusBarScrimResId = a.getResourceId(R.styleable.CollapsingToolbarLayout_statusBarScrim, INVALID_ID); a.recycle(); applyContentScrimResource(); applyStatusBarScrimResource(); mBackgroundTintHelper = new SkinCompatBackgroundHelper(this); mBackgroundTintHelper.loadFromAttributes(attrs, 0); } private void applyStatusBarScrimResource() { mStatusBarScrimResId = SkinCompatHelper.checkResourceId(mStatusBarScrimResId); if (mStatusBarScrimResId != INVALID_ID) { String typeName = getResources().getResourceTypeName(mStatusBarScrimResId); if ("color".equals(typeName)) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { int color = SkinCompatResources.getInstance().getColor(mStatusBarScrimResId); setStatusBarScrimColor(color); } else { ColorStateList colorStateList = SkinCompatResources.getInstance().getColorStateList(mStatusBarScrimResId); Drawable drawable = getStatusBarScrim(); if (drawable != null) { DrawableCompat.setTintList(drawable, colorStateList); setStatusBarScrim(drawable); } else { ColorDrawable colorDrawable = new ColorDrawable(); colorDrawable.setTintList(colorStateList); setStatusBarScrim(colorDrawable); } } } else if ("drawable".equals(typeName)) { Drawable drawable = SkinCompatResources.getInstance().getDrawable(mStatusBarScrimResId); setStatusBarScrim(drawable); } else if ("mipmap".equals(typeName)) { Drawable drawable = SkinCompatResources.getInstance().getMipmap(mStatusBarScrimResId); setStatusBarScrim(drawable); } } } private void applyContentScrimResource() { mContentScrimResId = SkinCompatHelper.checkResourceId(mContentScrimResId); if (mContentScrimResId != INVALID_ID) { String typeName = getResources().getResourceTypeName(mContentScrimResId); if ("color".equals(typeName)) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { int color = SkinCompatResources.getInstance().getColor(mContentScrimResId); setContentScrimColor(color); } else { ColorStateList colorStateList = SkinCompatResources.getInstance().getColorStateList(mContentScrimResId); Drawable drawable = getContentScrim(); if (drawable != null) { DrawableCompat.setTintList(drawable, colorStateList); setContentScrim(drawable); } else { ColorDrawable colorDrawable = new ColorDrawable(); colorDrawable.setTintList(colorStateList); setContentScrim(colorDrawable); } } } else if ("drawable".equals(typeName)) { Drawable drawable = SkinCompatResources.getInstance().getDrawable(mContentScrimResId); setContentScrim(drawable); } else if ("mipmap".equals(typeName)) { Drawable drawable = SkinCompatResources.getInstance().getMipmap(mContentScrimResId); setContentScrim(drawable); } } } @Override public void applySkin() { applyContentScrimResource(); applyStatusBarScrimResource(); if (mBackgroundTintHelper != null) { mBackgroundTintHelper.applySkin(); } } }