package com.hkm.ui.processbutton; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Typeface; 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.support.annotation.ColorRes; import android.support.annotation.DrawableRes; import android.support.annotation.StyleableRes; import android.util.AttributeSet; import android.util.Log; import android.widget.Button; public class FlatButton extends Button { public static final int BUTTON_BOTTOM_PAD = 1, BUTTON_FLAT = 2, BUTTON_EXTENSION = 3; private StateListDrawable mNormalDrawable; private GradientDrawable mDisabledDrawable; protected CharSequence mNormalText; private float cornerRadius; protected TypedArray mAttr; protected int defBorderWidth; private int button_presentation; private LayerDrawable drawableNormal; protected int defColor_blue, defColor_blue_dark, defColor_white; private String font_name; 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); getFont(context); } /** * only for extended program for specific modifications. exposing the parameter for the button configuration * * @param button_pres the constant for the button presentation * @return number */ protected int extension_button_presentation(int button_pres) { return button_pres; } protected void initAttributesExtension(Context c, AttributeSet t) { } private void initAttributes(Context context, AttributeSet attributeSet) { mAttr = getTypedArray(context, attributeSet, R.styleable.FlatButton); if (mAttr == null) { return; } try { defColor_blue = getResources().getColor(R.color.blue_normal); defColor_blue_dark = getResources().getColor(R.color.blue_pressed); defBorderWidth = context.getResources().getDimensionPixelOffset(R.dimen.border_width); defColor_white = context.getResources().getColor(R.color.grey_disabled); float defValue = getDimension(R.dimen.corner_radius); cornerRadius = mAttr.getDimension(R.styleable.FlatButton_pb_cornerRadius, defValue); font_name = mAttr.getString(R.styleable.FlatButton_pb_fontName); button_presentation = extension_button_presentation(mAttr.getInt(R.styleable.FlatButton_pb_presentation, BUTTON_BOTTOM_PAD)); initAttributesExtension(context, attributeSet); constructNormalDrawable(mNormalDrawable); } finally { mAttr.recycle(); } } protected void getFont(Context context) { if (font_name != null) { try { Typeface typeface = Typeface.createFromAsset(context.getAssets(), "fonts/" + font_name); if (typeface != null) { setTypeface(typeface); } } catch (Exception e) { Log.d("fonrloading", e.getMessage()); } } } protected void constructNormalDrawable(StateListDrawable list) { list.addState(new int[]{android.R.attr.state_pressed}, createPressedDrawable()); list.addState(new int[]{android.R.attr.state_focused}, createPressedDrawable()); list.addState(new int[]{android.R.attr.state_selected}, createPressedDrawable()); list.addState(new int[]{-android.R.attr.state_enabled}, createDisabledDrawable()); list.addState(new int[]{}, createNormalDrawable()); } /** * maded for extension: please write your own extension in here * * @return the layer drawable in here */ protected LayerDrawable drawable_button_extended() { return drawble_pad_button(); } protected LayerDrawable getLayersById(@DrawableRes int id) { return (LayerDrawable) getDrawable(id).mutate(); } protected GradientDrawable getFromLayer(final LayerDrawable draw, final int number_layer) { if (draw.getNumberOfLayers() > number_layer) { return (GradientDrawable) draw.getDrawable(number_layer).mutate(); } else { return null; } } private int getColorXML(@ColorRes int colorResId, @StyleableRes int styleIdColor) { int default_color = getResources().getColor(colorResId); return mAttr.getColor(styleIdColor, default_color); } public void setDisableDrawable(GradientDrawable disableDrawable) { mDisabledDrawable = disableDrawable; } private LayerDrawable drawble_pad_button() { final LayerDrawable drawableNormal = getLayersById(R.drawable.rect_normal); final GradientDrawable drawableTop = getFromLayer(drawableNormal, 0); drawableTop.setCornerRadius(getCornerRadius()); int colorPressed = mAttr.getColor(R.styleable.FlatButton_pb_colorPressed, defColor_blue_dark); drawableTop.setColor(colorPressed); final GradientDrawable drawableBottom = getFromLayer(drawableNormal, 1); drawableBottom.setCornerRadius(getCornerRadius()); int colorNormal = mAttr.getColor(R.styleable.FlatButton_pb_colorNormal, defColor_blue); drawableBottom.setColor(colorNormal); return drawableNormal; } private LayerDrawable drawble_flat_button() { final LayerDrawable drawableNormal = getLayersById(R.drawable.rect_stroke); GradientDrawable drawableBottom = getFromLayer(drawableNormal, 0); drawableBottom.setCornerRadius(getCornerRadius()); int colorNormal = mAttr.getColor(R.styleable.FlatButton_pb_colorNormal, defColor_blue); drawableBottom.setColor(colorNormal); int colorStroke = mAttr.getColor(R.styleable.FlatButton_pb_colorBorder, defColor_blue); int strokeWidth = mAttr.getDimensionPixelOffset(R.styleable.FlatButton_pb_borderWidth, defBorderWidth); drawableBottom.setStroke(strokeWidth, colorStroke); return drawableNormal; } private LayerDrawable createNormalDrawable() { switch (button_presentation) { case BUTTON_BOTTOM_PAD: return drawble_pad_button(); case BUTTON_FLAT: return drawble_flat_button(); default: return drawable_button_extended(); } } public LayerDrawable creatNormalDrawable(int top_color_id, int bottom_color_id) { LayerDrawable drawableNormal = (LayerDrawable) getDrawable(R.drawable.rect_normal).mutate(); GradientDrawable drawableTop = getFromLayer(drawableNormal, 0); drawableTop.setCornerRadius(getCornerRadius()); drawableTop.setColor(getResources().getColor(top_color_id)); GradientDrawable drawableBottom = getFromLayer(drawableNormal, 1); drawableBottom.setCornerRadius(getCornerRadius()); drawableBottom.setColor(getResources().getColor(bottom_color_id)); return drawableNormal; } protected LayerDrawable createDisabledDrawable() { LayerDrawable normal = (LayerDrawable) getDrawable(R.drawable.rect_disable).mutate(); GradientDrawable layer1 = getFromLayer(normal, 1); layer1.setCornerRadius(getCornerRadius()); GradientDrawable layer0 = getFromLayer(normal, 0); layer0.setCornerRadius(getCornerRadius()); layer0.setColor(getColorXML(R.color.grey_disabled, R.styleable.FlatButton_pb_colorDisabled)); return normal; } protected Drawable createPressedDrawable() { GradientDrawable drawablePressed = (GradientDrawable) getDrawable(R.drawable.rect_pressed).mutate(); drawablePressed.setCornerRadius(getCornerRadius()); drawablePressed.setColor(getColorXML(R.color.blue_pressed, R.styleable.FlatButton_pb_colorPressed)); return drawablePressed; } protected Drawable getDrawable(int id) { Drawable drawable; drawable = getResources().getDrawable(id); return drawable; } protected float getDimension(int id) { return getResources().getDimension(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 draw the drawable */ @SuppressWarnings("deprecation") @SuppressLint("NewApi") public void setBackgroundCompat(Drawable draw) { int pL = getPaddingLeft(); int pT = getPaddingTop(); int pR = getPaddingRight(); int pB = getPaddingBottom(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { setBackground(draw); } else { setBackgroundDrawable(draw); } setPadding(pL, pT, pR, pB); } }