Может быть проще использовать Spanned мысли android.text.HTML
Так что-то вроде этого:
Spanned text = HTML.fromHtml("Sp<span style=\"color:red\">ann</span>able");
textView.setText(text);
Его также можно использовать для добавления изображений, но это немного сложнее.
UPDATE
Я перечитал ваш вопрос и подумал над решением. Вы можете создать пользовательский вид, который имеет два textView
в FrameLayout
(друг на друга), а затем изменить размер одного сверху относительно процентного соотношения. Примерно так:
import android.content.Context;
import android.content.res.ColorStateList;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import android.widget.TextView;
public class ProgressTextView extends FrameLayout {
private TextView backgroundTextView;
private TextView foregroundTextView;
private CharSequence text;
private ProgressTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
private ProgressTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private ProgressTextView(Context context) {
super(context);
init(context, null);
}
private void init(Context context, AttributeSet attrs) {
backgroundTextView = new TextView(context);
foregroundTextView = new TextView(context);
addView(backgroundTextView);
addView(foregroundTextView);
// process custom attributeSet from xml to set the colours
}
public void setBackgroundTextColor(int color) {
backgroundTextView.setTextColor(color);
}
public void setBackgroundTextColor(ColorStateList colors) {
backgroundTextView.setTextColor(colors);
}
public void setForegroundTextColor(int color) {
backgroundTextView.setTextColor(color);
}
public void setForegroundTextColor(ColorStateList colors) {
backgroundTextView.setTextColor(colors);
}
public void setPercentage(float per) {
foregroundTextView.setWidth((((float) backgroundTextView.getWidth()) / 100f) * per);
}
public void setText(CharSequence text) {
this.text = text;
backgroundTextView.setText(text);
foregroundTextView.setText(text);
}
public CharSequence getText() {
return text;
}
}
PS: не проверял;) просто идея
БОЛЬШЕ ОБНОВЛЕНИЯ
Очевидно, с помощью этого метода текст сокращается, а не просто обрезается, как я ожидал. Возможно при создании foregroundTextView вы можете сделать это:
foregroundTextView = new TextView(context) {
@Override
protected void onDraw (Canvas canvas) {
super.onDraw(canvas);
Rect bounds = canvas.getClipBounds();
bounds.right (((float) bounds.right) / 100.0f) * per;
canvas.clipRect(bounds);
}
};
А также добавьте переменную per
и измените setPercentage(float per)
, чтобы он был просто сеттером:
private float per = 0.0f;
public void setPercentage(float per) {
this.per = per;
}
Надеюсь, что это работает;)