package com.llamacorp.equate.view; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.widget.Button; import com.llamacorp.equate.R; class SecondaryTextButton extends Button { protected static final int SECONDARY_FONT_PERCENTAGE = 70; protected float mTextX; protected float mTextY; protected float mTextSize = 0f; protected Paint mSecondaryPaint; protected String mSecondaryText; protected int mSecondaryTextColor; protected float mSecondaryTextSize; //the following are used to determine where to place the secondary text protected float mButtonHeight; protected float mButtonWidth; protected float mSecTextWidth; protected float mSecAdditionalXOffset; protected float mSecTextHeight; protected float mSecAdditionalYOffset; //x and y coordinates for the secondary text protected float mSecXCord; protected float mSecYCord; public SecondaryTextButton(Context context, AttributeSet attrs) { super(context, attrs); int secTextPct = SECONDARY_FONT_PERCENTAGE; //grab custom resource variable TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SecondaryTextButton, 0, 0); try { mSecondaryText = ta.getString(R.styleable.SecondaryTextButton_secondary_text); secTextPct = ta.getInteger(R.styleable.SecondaryTextButton_secondary_text_font_size_percentage, SECONDARY_FONT_PERCENTAGE); mSecondaryTextColor = ta.getColor(R.styleable.SecondaryTextButton_secondary_text_color, ContextCompat.getColor(context, R.color.button_secondary_text)); } finally { ta.recycle(); } mSecondaryTextSize = getPaint().getTextSize() * secTextPct / 100f; mSecondaryPaint = new Paint(getPaint()); } /** * Set secondary text string */ public void setSecondaryText(String text) { mSecondaryText = text; } @Override protected void onTextChanged(CharSequence text, int start, int before, int after) { super.onTextChanged(text, start, before, after); layoutText(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (changed) layoutText(); } /** * Helper method to size text */ protected void layoutText() { Paint paint = getPaint(); if (mTextSize != 0f) paint.setTextSize(mTextSize); float textWidth = paint.measureText(getText().toString()); float boxWidth = getWidth() - getPaddingLeft() - getPaddingRight(); float textSize = getTextSize(); if (textWidth > boxWidth){ paint.setTextSize(textSize * boxWidth / textWidth); mTextX = getPaddingLeft(); mTextSize = textSize; } else { mTextX = (getWidth() - textWidth) / 2; } mTextY = (getHeight() - paint.ascent() - paint.descent()) / 2; if (mSecondaryPaint != null) mSecondaryPaint.setTextSize(mSecondaryTextSize); } @Override protected void onDraw(Canvas canvas) { if (mSecondaryText != null){ //draw the text in the upper corner mSecondaryPaint.setColor(mSecondaryTextColor); mButtonHeight = getHeight(); // - getPaddingTop() - getPaddingBottom(); mButtonWidth = getWidth(); // - getPaddingLeft() - getPaddingRight(); mSecTextWidth = mSecondaryPaint.measureText(mSecondaryText); mSecAdditionalXOffset = getContext().getResources() .getDimensionPixelSize(R.dimen.button_ellipses_additional_offset_x); mSecTextHeight = mSecondaryPaint.getTextSize(); mSecAdditionalYOffset = getContext().getResources() .getDimensionPixelSize(R.dimen.button_ellipses_additional_offset_y); findSecondaryTextCoordinates(); canvas.drawText(mSecondaryText, 0, mSecondaryText.length(), mSecXCord, mSecYCord, mSecondaryPaint); } drawMainText(canvas); } /** * Helper function to draw secondary text */ protected void drawMainText(Canvas canvas) { getPaint().setColor(getCurrentTextColor()); canvas.drawText(getPrimaryText(), 0, getPrimaryText().length(), mTextX, mTextY, getPaint()); } protected String getPrimaryText() { return getText().toString(); } /** * Calculate where to put secondary text * This method should get overridden to change text location */ protected void findSecondaryTextCoordinates() { mSecXCord = mButtonWidth - mSecTextWidth - mSecAdditionalXOffset; mSecYCord = mButtonHeight - 0 - mSecAdditionalYOffset; } }