package io.rover.ui; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Typeface; import android.os.Build; import android.text.Html; import android.text.Layout; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.SpannedString; import android.text.StaticLayout; import android.text.TextPaint; import android.util.TypedValue; import io.rover.model.Alignment; import io.rover.model.Offset; import io.rover.model.Unit; /** * Created by ata_n on 2016-07-06. */ public class TextBlockView extends BlockView { private Spanned mText; // TODO: This is to be changed to an inset property at the Block level private Offset mTextOffset; private Alignment mAlignment; private TextPaint mPaint; private StaticLayout mLayout; public TextBlockView(Context context) { super(context); mPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); if (Build.VERSION.SDK_INT > 20) { //mPaint.setElegantTextHeight(true); } mPaint.setTextSize(49); //Default createLayout(); } public void setText(Spanned text) { mText = text; createLayout(); } public void setTextOffset(Offset offset) { mTextOffset = offset; createLayout(); } public void setTextSize(float size) { mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, size, getResources().getDisplayMetrics())); createLayout(); } public void setTypeface(Typeface typeface) { mPaint.setTypeface(typeface); createLayout(); } public void setTextColor(int color) { mPaint.setColor(color); createLayout(); } public void setTextAlignment(Alignment alignment) { mAlignment = alignment; mPaint.setTextAlign(getHorizontalAlignment()); createLayout(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); createLayout(); } private void createLayout() { if (mText == null) { mText = new SpannedString(""); } int width = getWidth(); double textWidth = width - getPaddingLeft() - getPaddingRight() - getLeftInset() - getRightInset(); if (textWidth > 0) { mLayout = new StaticLayout(mText, mPaint, (int) textWidth, Layout.Alignment.ALIGN_NORMAL, 1f, 0f, false); } } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); if (mLayout != null) { canvas.save(); int yPos = 0; switch (getVerticalAlignment()) { case Middle: { yPos = (canvas.getHeight() / 2) - (mLayout.getHeight() / 2); break; } case Bottom: { yPos = canvas.getHeight() - mLayout.getHeight(); break; } } int xPos = 0; switch (getHorizontalAlignment()) { case CENTER: { xPos = mLayout.getWidth() / 2; break; } case RIGHT: { xPos = mLayout.getWidth(); break; } } canvas.translate(xPos + getPaddingLeft() + getLeftInset() ,yPos + getPaddingTop() + getTopInset()); mLayout.draw(canvas); canvas.restore(); } } private Paint.Align getHorizontalAlignment() { if (mAlignment == null) { return Paint.Align.LEFT; } switch (mAlignment.getHorizontal()) { case Right: { return Paint.Align.RIGHT; } case Center: { return Paint.Align.CENTER; } default: return Paint.Align.LEFT; } } private Alignment.Vertical getVerticalAlignment() { if (mAlignment == null) { return Alignment.Vertical.Top; } if (mAlignment.getVertical() != null) { return mAlignment.getVertical(); } return Alignment.Vertical.Top; } private float getLeftInset() { if (mTextOffset != null) { return (float) getValueFromUnit(mTextOffset.getLeft()); } return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) mInset.left, getResources().getDisplayMetrics()); } private float getRightInset() { if (mTextOffset != null) { return (float) getValueFromUnit(mTextOffset.getRight()); } return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) mInset.right, getResources().getDisplayMetrics()); } private float getTopInset() { if (mTextOffset != null) { return (float) getValueFromUnit(mTextOffset.getTop()); } return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) mInset.top, getResources().getDisplayMetrics()); } private float getBottomInset() { if (mTextOffset != null) { return (float) getValueFromUnit(mTextOffset.getBottom()); } return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) mInset.bottom, getResources().getDisplayMetrics()); } private double getValueFromUnit(Unit unit) { if (unit != null) { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) unit.getValue(), getResources().getDisplayMetrics()); } return 0; } }