Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Bah, that was stupid of me. I just needed to change-up that commented-out line:</p> <pre><code>super.getPaint().getTextBounds(text, 0, text.length(), mTextBounds); </code></pre> <p>In addition, for actually rendering the text, I need to average this view's height and the text's height:</p> <pre><code>// draw everything canvas.drawText(text, super.getWidth() * 0.5f, (super.getHeight() + mTextBounds.height()) * 0.5f, mStrokePaint); </code></pre> <p>The entire code now reads as follows:</p> <pre><code>public class OutlinedTextView extends TextView { /* =========================================================== * Constants * =========================================================== */ private static final float OUTLINE_PROPORTION = 0.1f; /* =========================================================== * Members * =========================================================== */ private final Paint mStrokePaint = new Paint(); private final Rect mTextBounds = new Rect(); private int mOutlineColor = Color.TRANSPARENT; /* =========================================================== * Constructors * =========================================================== */ public OutlinedTextView(Context context) { super(context); this.setupPaint(); } public OutlinedTextView(Context context, AttributeSet attrs) { super(context, attrs); this.setupPaint(); this.setupAttributes(context, attrs); } public OutlinedTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.setupPaint(); this.setupAttributes(context, attrs); } /* =========================================================== * Overrides * =========================================================== */ @Override protected void onDraw(Canvas canvas) { // Get the text to print final float textSize = super.getTextSize(); final String text = super.getText().toString(); // setup stroke mStrokePaint.setColor(mOutlineColor); mStrokePaint.setStrokeWidth(textSize * OUTLINE_PROPORTION); mStrokePaint.setTextSize(textSize); mStrokePaint.setFlags(super.getPaintFlags()); mStrokePaint.setTypeface(super.getTypeface()); // Figure out the drawing coordinates super.getPaint().getTextBounds(text, 0, text.length(), mTextBounds); // draw everything canvas.drawText(text, super.getWidth() * 0.5f, (super.getHeight() + mTextBounds.height()) * 0.5f, mStrokePaint); super.onDraw(canvas); } /* =========================================================== * Private/Protected Methods * =========================================================== */ private final void setupPaint() { mStrokePaint.setAntiAlias(true); mStrokePaint.setStyle(Paint.Style.STROKE); mStrokePaint.setTextAlign(Paint.Align.CENTER); } private final void setupAttributes(Context context, AttributeSet attrs) { final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OutlinedTextView); mOutlineColor = array.getColor( R.styleable.OutlinedTextView_outlineColor, 0x00000000); array.recycle(); // Force this text label to be centered super.setGravity(Gravity.CENTER_HORIZONTAL); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload