Created
February 25, 2016 08:24
-
-
Save allco/10d86174c7e497277ffd to your computer and use it in GitHub Desktop.
How to have in one row left and right aligned text simultaniously .
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class RightAlignLastLetterSpan extends ReplacementSpan { | |
@SuppressWarnings("FieldCanBeLocal") private static boolean DEBUG = false; | |
private float textWidth = -1; | |
@Nullable private TextAppearanceSpan spanStyle; | |
@Nullable private String text; | |
@NonNull private TextView tv; | |
protected RightAlignLastLetterSpan(@NonNull TextView tv) {this.tv = tv;} | |
public static boolean attach(@Nullable TextView tv, @Nullable String text, @StyleRes int resourceTextAppearance) { | |
if (tv == null || isEmpty(text)) { | |
logWrongArg(); | |
return false; | |
} | |
RightAlignLastLetterSpan span = new RightAlignLastLetterSpan(tv); | |
span.setSpanStyle(new TextAppearanceSpan(tv.getContext(), resourceTextAppearance)); | |
span.setText(text); | |
SpannableString ss = new SpannableString(new StringBuffer(tv.getText()).append(" _")); | |
ss.setSpan(span, ss.length() - 1, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); | |
tv.setText(ss); | |
return true; | |
} | |
public void setSpanStyle(@Nullable TextAppearanceSpan spanStyle) { | |
textWidth = -1; | |
this.spanStyle = spanStyle; | |
} | |
public void setText(@Nullable String text) { | |
textWidth = -1; | |
this.text = text; | |
} | |
@Override | |
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { | |
if (textWidth < 0) { | |
applyStyle(paint); | |
textWidth = isEmpty(this.text) ? 0 : paint.measureText(this.text); | |
} | |
return Math.round(textWidth); | |
} | |
@Override | |
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { | |
if (textWidth == 0 || this.text == null) { | |
return; | |
} | |
int lineCount = tv.getLineCount(); | |
if (lineCount < 1) {return;} | |
Rect lineBounds = new Rect(); | |
int baseline = tv.getLineBounds(lineCount - 1, lineBounds); | |
lineBounds.offset(-tv.getPaddingLeft(), -tv.getPaddingTop()); | |
baseline -= tv.getPaddingTop(); | |
if (DEBUG) { | |
paint.setColor(Color.argb(100, 100, 255, 100)); | |
canvas.drawRect(lineBounds, paint); | |
paint.setColor(Color.argb(100, 255, 100, 100)); | |
canvas.drawRect(x, top, x + textWidth, bottom, paint); | |
} | |
applyStyle(paint); | |
canvas.drawText(this.text, lineBounds.right - textWidth, baseline, paint); | |
} | |
public void applyStyle(Paint paint) { | |
if (paint instanceof TextPaint && spanStyle != null) { | |
TextPaint tp = (TextPaint) paint; | |
spanStyle.updateDrawState(tp); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment