как вы окрашиваете процент текстового просмотра в Android? - PullRequest
2 голосов
/ 21 декабря 2011

Я знаю, что Spannable может помочь мне раскрасить любые конкретные буквы в текстовом представлении.Однако возможно ли раскрасить 1/2 или 1/3 буквы.Я хотел раскрасить текст в текстовом просмотре по процентам, а не по буквам.Спасибо за чтение, и, пожалуйста, дайте мне знать, если у вас есть идея или решение для этого.

спасибо

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

Может быть проще использовать 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;
}

Надеюсь, что это работает;)

2 голосов
/ 21 декабря 2011

Вы можете нарисовать буквы самостоятельно на холсте. Каждая буква состоит из множества взаимосвязанных дуг, так что вы можете оформить каждую индивидуально.

Рисование каждой буквы было бы весьма кропотливым, хотя, например, paint.setColor (), canvas.drawArc (), paint.setColor (), canvas.drawArc () и т. Д. *

0 голосов
/ 21 декабря 2011

создайте drawable и переопределяйте его метод onDraw и рисуйте холст, как вы хотите, и устанавливайте его в качестве фона для вашего textview

...