package com.dd.processbutton; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.StateListDrawable; import android.os.Build; import android.util.AttributeSet; import android.widget.Button; public class FlatButton extends Button { private StateListDrawable mNormalDrawable; private CharSequence mNormalText; private float cornerRadius; public FlatButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } public FlatButton(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public FlatButton(Context context) { super(context); init(context, null); } private void init(Context context, AttributeSet attrs) { mNormalDrawable = new StateListDrawable(); if (attrs != null) { initAttributes(context, attrs); } mNormalText = getText().toString(); setBackgroundCompat(mNormalDrawable); } private void initAttributes(Context context, AttributeSet attributeSet) { TypedArray attr = getTypedArray(context, attributeSet, R.styleable.FlatButton); if(attr == null) { return; } try { float defValue = getDimension(R.dimen.corner_radius); cornerRadius = attr.getDimension(R.styleable.FlatButton_pb_cornerRadius, defValue); mNormalDrawable.addState(new int[]{android.R.attr.state_pressed}, createPressedDrawable(attr)); mNormalDrawable.addState(new int[] { }, createNormalDrawable(attr)); } finally { attr.recycle(); } } private LayerDrawable createNormalDrawable(TypedArray attr) { LayerDrawable drawableNormal = (LayerDrawable) getDrawable(R.drawable.rect_normal).mutate(); GradientDrawable drawableTop = (GradientDrawable) drawableNormal.getDrawable(0).mutate(); drawableTop.setCornerRadius(getCornerRadius()); int blueDark = getColor(R.color.blue_pressed); int colorPressed = attr.getColor(R.styleable.FlatButton_pb_colorPressed, blueDark); drawableTop.setColor(colorPressed); GradientDrawable drawableBottom = (GradientDrawable) drawableNormal.getDrawable(1).mutate(); drawableBottom.setCornerRadius(getCornerRadius()); int blueNormal = getColor(R.color.blue_normal); int colorNormal = attr.getColor(R.styleable.FlatButton_pb_colorNormal, blueNormal); drawableBottom.setColor(colorNormal); return drawableNormal; } private Drawable createPressedDrawable(TypedArray attr) { GradientDrawable drawablePressed = (GradientDrawable) getDrawable(R.drawable.rect_pressed).mutate(); drawablePressed.setCornerRadius(getCornerRadius()); int blueDark = getColor(R.color.blue_pressed); int colorPressed = attr.getColor(R.styleable.FlatButton_pb_colorPressed, blueDark); drawablePressed.setColor(colorPressed); return drawablePressed; } protected Drawable getDrawable(int id) { return getResources().getDrawable(id); } protected float getDimension(int id) { return getResources().getDimension(id); } protected int getColor(int id) { return getResources().getColor(id); } protected TypedArray getTypedArray(Context context, AttributeSet attributeSet, int[] attr) { return context.obtainStyledAttributes(attributeSet, attr, 0, 0); } public float getCornerRadius() { return cornerRadius; } public StateListDrawable getNormalDrawable() { return mNormalDrawable; } public CharSequence getNormalText() { return mNormalText; } /** * Set the View's background. Masks the API changes made in Jelly Bean. * * @param drawable */ @SuppressWarnings("deprecation") @SuppressLint("NewApi") public void setBackgroundCompat(Drawable drawable) { int pL = getPaddingLeft(); int pT = getPaddingTop(); int pR = getPaddingRight(); int pB = getPaddingBottom(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { setBackground(drawable); } else { setBackgroundDrawable(drawable); } setPadding(pL, pT, pR, pB); } }