package com.hkm.ui.processbutton.iml;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.ScaleDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.support.annotation.DrawableRes;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.Gravity;
import com.hkm.ui.processbutton.ProcessButton;
import com.hkm.ui.processbutton.R;
import com.hkm.ui.processbutton.Util.ProgressBar;
/**
* Created by hesk on 15/10/15.
*/
public class ArrowButton extends ProcessButton {
public static int NO_ID = 0;
private ProgressBar mProgressBar;
private Mode mMode;
private int
mColor1,
mColor2,
mColor3,
mColor4,
icon_size_text_padding,
defIconSize,
resIcon,
resIconSize,
strokeWidth,
colorStroke,
colorArrow,
colorPressed,
colorNormal,
resArrow,
colorDisable,
mDrawableSize,
topBorder, bottomBorder,
vertical_padding;
private RectF reface_Rect;
public enum Mode {
PROGRESS, ENDLESS;
}
public ArrowButton(Context context) {
super(context);
init(context);
}
public ArrowButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ArrowButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(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
*/
@Override
protected int extension_button_presentation(int button_pres) {
return BUTTON_EXTENSION;
}
private LayerDrawable getDefault() {
ShapeDrawable border = new ShapeDrawable();
border.getPaint().setColor(Color.WHITE);
ShapeDrawable background = new ShapeDrawable();
background.getPaint().setColor(Color.BLACK);
ShapeDrawable clip = new ShapeDrawable();
clip.getPaint().setColor(Color.YELLOW);
Drawable[] layers = new Drawable[]{background, border, clip};
LayerDrawable layerDrawable = new LayerDrawable(layers);
layerDrawable.setLayerInset(0, 0, 0, 0, 0);
layerDrawable.setLayerInset(1, 1, 0, 1, 1);
layerDrawable.setLayerInset(2, 0, 0, 0, 10);
return layerDrawable;
}
private LayerDrawable basic_drawble_render(@ColorInt final int faceColor, @DrawableRes final int asset_drawable) {
final LayerDrawable drawableNormal = getLayersById(asset_drawable);
GradientDrawable drawableTop = getFromLayer(drawableNormal, 0);
drawableTop.setCornerRadius(getCornerRadius());
drawableTop.setColor(colorStroke);
GradientDrawable drawableBottom = getFromLayer(drawableNormal, 1);
drawableBottom.setCornerRadius(getCornerRadius());
drawableBottom.setColor(faceColor);
drawableNormal.setLayerInset(1, 0, topBorder, 0, bottomBorder);
return drawableNormal;
}
/**
* @return StateListDrawable
*/
protected StateListDrawable createFillDrawable() {
StateListDrawable drawable = new StateListDrawable();
drawable.addState(new int[]{android.R.attr.state_pressed},
basic_drawble_render(colorPressed, R.drawable.rect_list_item));
drawable.addState(new int[]{android.R.attr.state_focused},
basic_drawble_render(colorPressed, R.drawable.rect_list_item));
drawable.addState(new int[]{android.R.attr.state_selected},
basic_drawble_render(colorPressed, R.drawable.rect_list_item));
drawable.addState(new int[]{}, basic_drawble_render(colorNormal,
R.drawable.rect_list_item));
return drawable;
}
protected LayerDrawable createCommonFace() {
if (resIcon != -1) {
LayerDrawable ly = afterProcessLayerDrawable(new LayerDrawable(
new Drawable[]{
createFillDrawable(),
getArrow(),
getIcon()
}));
ly.setLayerInset(2, icon_size_text_padding, 0, 0, 0);
return ly;
} else {
return afterProcessLayerDrawable(new LayerDrawable(
new Drawable[]{
createFillDrawable(),
getArrow()
}));
}
}
protected LayerDrawable afterProcessLayerDrawable(LayerDrawable ld) {
ld.setLayerInset(ld.getNumberOfLayers() - 1, 0, vertical_padding, 0, vertical_padding);
return ld;
}
public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(
bm, 0, 0, width, height, matrix, false);
bm.recycle();
return resizedBitmap;
}
protected Drawable getIcon() {
Drawable drawable;
/*
try {
BitmapDrawable draw = (BitmapDrawable) getDrawable(resIcon).mutate();
Bitmap scaled = Bitmap.createScaledBitmap(draw.getBitmap(), resIconSize, resIconSize, true);
drawable = new BitmapDrawable(getContext().getResources(), scaled);
return drawable;
} catch (ClassCastException e) {
e.fillInStackTrace();
Drawable drawable = ContextCompat.getDrawable(getContext(), resIcon);
((BitmapDrawable) drawable).setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
return drawable;
} catch (Resources.NotFoundException e) {
e.fillInStackTrace();
}*/
// ScaleDrawable sized = new ScaleDrawable(getDrawable(resIcon), Gravity.CENTER, resIconSize, resIconSize);
// sized.setBounds(0, 0, resIconSize, resIconSize);
//BitmapDrawable draw = (BitmapDrawable) sized.getDrawable();
// drawable.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
Drawable draw = ContextCompat.getDrawable(getContext(), resIcon);
Bitmap scaled = Bitmap.createScaledBitmap(((BitmapDrawable)draw).getBitmap(), resIconSize, resIconSize, true);
drawable = new BitmapDrawable(getContext().getResources(), scaled);
setPadding(resIconSize + (int) (icon_size_text_padding * 2), 0, 0, 0);
return drawable;
}
protected Drawable getArrow() {
BitmapDrawable draw = (BitmapDrawable) getDrawable(resArrow).mutate();
if (colorArrow != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
draw.setTint(colorArrow);
}
draw.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
return draw;
}
private void init(Context context) {
Resources res = context.getResources();
mMode = Mode.ENDLESS;
mColor1 = res.getColor(R.color.holo_blue_bright);
mColor2 = res.getColor(R.color.holo_green_light);
mColor3 = res.getColor(R.color.holo_orange_light);
mColor4 = res.getColor(R.color.holo_red_light);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setStateListAnimator(null);
}
}
/**
* Set the View's background. Masks the API changes made in Jelly Bean.
*
* @param draw the drawable
*/
@Override
public void setBackgroundCompat(Drawable draw) {
super.setBackgroundCompat(createCommonFace());
}
@Override
protected void initAttributesExtension(Context c, AttributeSet t) {
defIconSize = c.getResources().getDimensionPixelOffset(R.dimen.icon_size_def);
icon_size_text_padding = c.getResources().getDimensionPixelOffset(R.dimen.icon_size_text_padding_xl);
icon_size_text_padding = mAttr.getDimensionPixelOffset(R.styleable.ArrowButton_pb_IconPadding
, icon_size_text_padding);
strokeWidth = mAttr.getDimensionPixelOffset(R.styleable.FlatButton_pb_borderWidth, defBorderWidth);
colorStroke = mAttr.getColor(R.styleable.FlatButton_pb_colorBorder, defColor_blue);
colorPressed = mAttr.getColor(R.styleable.FlatButton_pb_colorPressed, defColor_blue_dark);
colorNormal = mAttr.getColor(R.styleable.FlatButton_pb_colorNormal, defColor_blue);
colorDisable = mAttr.getColor(R.styleable.FlatButton_pb_colorDisabled, defColor_white);
TypedArray a = getTypedArray(c, t, R.styleable.ArrowButton);
colorArrow = a.getColor(R.styleable.ArrowButton_pb_colorArrow, defColor_blue_dark);
resArrow = a.getResourceId(R.styleable.ArrowButton_pb_arrowRes, R.drawable.ic_arrow_to_right);
vertical_padding = a.getDimensionPixelOffset(R.styleable.ArrowButton_pb_verticalPadding, defBorderWidth);
bottomBorder = a.getDimensionPixelOffset(R.styleable.ArrowButton_pb_bottomLineThickness, strokeWidth);
topBorder = a.getDimensionPixelOffset(R.styleable.ArrowButton_pb_topLineThickness, strokeWidth);
resIcon = a.getResourceId(R.styleable.ArrowButton_pb_IconRes, -1);
resIconSize = a.getDimensionPixelOffset(R.styleable.ArrowButton_pb_IconSize, defIconSize);
mDrawableSize = 90;
}
public void setMode(Mode mode) {
mMode = mode;
}
@Override
public float getCornerRadius() {
return 0f;
}
@Override
public void drawProgress(Canvas canvas) {
if (getBackground() != getNormalDrawable()) {
setBackgroundDrawable(getNormalDrawable());
}
switch (mMode) {
case ENDLESS:
drawEndlessProgress(canvas);
break;
case PROGRESS:
drawLineProgress(canvas);
break;
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mProgressBar != null) {
setupProgressBarBounds();
}
}
private void drawLineProgress(Canvas canvas) {
float scale = (float) getProgress() / (float) getMaxProgress();
float indicatorWidth = (float) getMeasuredWidth() * scale;
double indicatorHeightPercent = 0.05; // 5%
int bottom = (int) (getMeasuredHeight() - getMeasuredHeight() * indicatorHeightPercent);
getProgressDrawable().setBounds(0, bottom, (int) indicatorWidth, getMeasuredHeight());
getProgressDrawable().draw(canvas);
}
private void drawEndlessProgress(Canvas canvas) {
if (mProgressBar == null) {
mProgressBar = new ProgressBar(this);
setupProgressBarBounds();
mProgressBar.setColorScheme(mColor1, mColor2, mColor3, mColor4);
mProgressBar.start();
}
if (getProgress() > 0) {
mProgressBar.draw(canvas);
}
}
private void setupProgressBarBounds() {
double indicatorHeight = getDimension(R.dimen.layer_padding);
int bottom = (int) (getMeasuredHeight() - indicatorHeight);
mProgressBar.setBounds(0, bottom, getMeasuredWidth(), getMeasuredHeight());
}
}