你如何在android中对textview的百分比进行着色?

时间:2011-12-20 22:32:19

标签: android colors textview

我知道Spannable可以帮助我为textview中的任何特定字母着色。但是,是否可以为字母的1/2或1/3着色。我希望在文本视图中按百分比而不是字母为文本着色。感谢您阅读,如果您对此有任何想法或解决方案,请告诉我。

感谢

3 个答案:

答案 0 :(得分:3)

使用跨越思维android.text.HTML

可能更容易

这样的事情:

Spanned text = HTML.fromHtml("Sp<span style=\"color:red\">ann</span>able");
textView.setText(text);

它也可用于添加图像,但有点复杂。


<强>更新

我重新阅读了你的问题并想到了一个解决方案。您可以创建一个自定义视图,其中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;
}

希望这个有效;)

答案 1 :(得分:2)

你可以在画布上自己画字母。每个字母由一堆相互连接的弧组成,这样你就可以单独设置每个弧的样式。

必须绘制每个字母都是相当费力的,例如paint.setColor(),canvas.drawArc(),paint.setColor(),canvas.drawArc()等等......

答案 2 :(得分:-1)

创建一个drawable并覆盖它的onDraw方法并绘制画布的方式并将其设置为textview的背景