Решение состоит в том, чтобы иметь 3 вида: один для первой буквы, другой для (максимум) двух строк и еще один для остального текста. При измерении представления вы можете определить, преодолели ли вы ограничение в 2 строки, которое вы хотите наложить, и если это так, разорвите текст и установите оставшуюся часть текста в 3-м представлении. Вам также нужно будет преодолеть внутреннее заполнение шрифта первой буквы, чтобы достичь желаемого результата, следовательно, представление BottomAlignedTextView.
Вот код:
Боттомалигнедтекствиев.java
public class BottomAlignedTextView extends TextView {
public BottomAlignedTextView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
float offset = getTextSize() - getLineHeight();
canvas.translate(0, -offset);
super.onDraw(canvas);
}
}
view_reader_title.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.shellanoo.newsbot.ui.views.BottomAlignedTextView
android:id="@+id/first_letter_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="serif"
android:background="@null"
android:gravity="bottom"
android:includeFontPadding="false"
android:textSize="92dp"
tools:text="B"/>
<TextView
android:id="@+id/two_lines_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/first_letter_tv"
android:layout_toEndOf="@+id/first_letter_tv"
android:layout_toRightOf="@+id/first_letter_tv"
android:gravity="bottom"
android:includeFontPadding="false"
android:lineSpacingMultiplier="0.9"
android:textColor="@color/black"
android:textSize="30dp"
tools:text="eyonce to write and star in a film"/>
</RelativeLayout>
<TextView
android:id="@+id/remainder_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:includeFontPadding="false"
android:textColor="@color/black"
android:textSize="30dp"
tools:text="about Saartjie Baartman"/>
</LinearLayout>
ReaderTitleView.java
public class ReaderTitleView extends FrameLayout {
@BindView(R.id.first_letter_tv)
TextView firstLetterTv;
@BindView(R.id.two_lines_tv)
TextView twoLinesTv;
@BindView(R.id.remainder_tv)
TextView remainderTv;
@ColorInt
private int mFirstWordColor;
private String mText;
public ReaderTitleView(Context context) {
this(context, null);
}
public ReaderTitleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ReaderTitleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
private void init(AttributeSet attrs) {
View view = inflate(getContext(), R.layout.view_reader_title, this);
ButterKnife.bind(this, view);
TypedArray a = getContext().getTheme().obtainStyledAttributes(
attrs,
R.styleable.ReaderTitleView,
0, 0);
mText = a.getString(R.styleable.ReaderTitleView_rtv_text);
if (mText == null) {
mText = "";
}
mFirstWordColor = a.getColor(R.styleable.ReaderTitleView_rtv_first_word_color, -1);
updateTextViews();
}
private void updateTextViews() {
if (!TextUtils.isEmpty(mText)) {
String firstLetter = mText.substring(0, 1);
firstLetter = firstLetter.toUpperCase();
String restText = mText.substring(1, mText.length());
firstLetterTv.setText(firstLetter);
twoLinesTv.setText(restText);
colorifyFirstWord();
} else {
firstLetterTv.setText("");
twoLinesTv.setText("");
remainderTv.setText("");
}
}
private void colorifyFirstWord() {
if (mFirstWordColor != -1) {
CharSequence text = twoLinesTv.getText();
Spannable s;
if (text instanceof Spannable) {
s = (Spannable) text;
} else {
s = new SpannableString(text);
}
String[] split = s.toString().split(" ", 2);
int start = 0;
int end = start + split[0].length();
s.setSpan(new ForegroundColorSpan(mFirstWordColor), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
twoLinesTv.setText(s, TextView.BufferType.SPANNABLE);
firstLetterTv.setTextColor(mFirstWordColor);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (twoLinesTv.getLineCount() > 2) {
String text = twoLinesTv.getText().toString();
int secondLineEnd = twoLinesTv.getLayout().getLineEnd(1);
String twoLines = text.substring(0, secondLineEnd);
String remainder = text.substring(secondLineEnd, text.length());
twoLinesTv.setText(twoLines);
remainderTv.setText(remainder);
colorifyFirstWord();
}
}
public void setText(String text) {
mText = text;
updateTextViews();
}
public String getText() {
return mText;
}
}
person
sahar
schedule
29.06.2016
HTML.fromHtml()
устарело на уровне API 24. - person   schedule 19.06.2016