package com.stardust.widget; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.stardust.scriptdroid.R; /** * Created by Stardust on 2017/1/29. */ public class ToolbarMenuItem extends LinearLayout { private static final int COLOR_DISABLED = 0X77e0e0e0; private ImageView mImageView; private TextView mTextView; private Drawable mEnabledDrawable, mDisabledDrawable; public ToolbarMenuItem(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); } public ToolbarMenuItem(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ToolbarMenuItem(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(attrs); } private void init(AttributeSet attrs) { inflate(getContext(), R.layout.toolbar_menu_item, this); TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToolbarMenuItem); String text = a.getString(R.styleable.ToolbarMenuItem_text); int iconResId = a.getResourceId(R.styleable.ToolbarMenuItem_icon, 0); int iconColor = a.getColor(R.styleable.ToolbarMenuItem_icon_color, Color.TRANSPARENT); a.recycle(); mImageView = (ImageView) findViewById(R.id.icon); mTextView = (TextView) findViewById(R.id.text); mTextView.setText(text); mImageView.setImageResource(iconResId); if (iconColor != Color.TRANSPARENT) { mImageView.setImageDrawable(convertDrawableToGrayScale(mImageView.getDrawable(), iconColor)); } } @Override public void setEnabled(boolean enabled) { if (enabled == isEnabled()) return; super.setEnabled(enabled); ensureEnabledDrawable(); ensureDisabledDrawable(); mImageView.setImageDrawable(enabled ? mEnabledDrawable : mDisabledDrawable); mTextView.setTextColor(enabled ? Color.WHITE : COLOR_DISABLED); } private void ensureDisabledDrawable() { if (mDisabledDrawable == null) { mDisabledDrawable = convertDrawableToGrayScale(mEnabledDrawable, COLOR_DISABLED); } } private void ensureEnabledDrawable() { if (mEnabledDrawable == null) { mEnabledDrawable = mImageView.getDrawable(); } } public static Drawable convertDrawableToGrayScale(Drawable drawable, int color) { if (drawable == null || drawable.getConstantState() == null) return null; Drawable res = drawable.getConstantState().newDrawable().mutate(); res.setColorFilter(color, PorterDuff.Mode.SRC_IN); return res; } }