在TextView Android中显示进度

时间:2013-12-04 16:47:11

标签: android graphics textview progress

嗨,我必须在数字本身显示进度。我遇到过Shader,Gradient在TextView中用于文本的横向多色印刷。他们的内置API是否可以绘制字符,如下图所示?

Sample Progress Percentage Image - MSPaint

先谢谢

4 个答案:

答案 0 :(得分:4)

您可以在完全相同的位置创建两个TextView,一个白色和一个绿色。设置一个高度,以便剪切文本,并且只覆盖另一个文本。

<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#990000" >

<TextView
    android:id="@+id/text_green"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_x="58dp"
    android:layout_y="77dp"
    android:text="50"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="#009900"
    android:textSize="100sp" />

<TextView
    android:id="@+id/text_white"
    android:layout_width="wrap_content"
    android:layout_height="60dp"
    android:layout_x="58dp"
    android:layout_y="77dp"
    android:text="50"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="#FFFFFF"
    android:textSize="100sp" />

</AbsoluteLayout>

答案 1 :(得分:4)

使用以下代码制作渐变。

int[] color = {Color.DKGRAY,Color.CYAN};
float[] position = {0, 1};
TileMode tile_mode = TileMode.REPEAT;
LinearGradient lin_grad = new LinearGradient(0, 0, 0, 35, color, position, tile_mode);
Shader shader_gradient = lin_grad;
your_text_view.getPaint().setShader(shader_gradient); //you can change the gradient colour in textview

答案 2 :(得分:0)

如果我是你,我会创建自己的视图类,在onDraw()中使用StaticLayout呈现白色文本,然后在画布上设置PorterDuffXferMode蒙版以屏蔽掉您要避免以绿色绘制的区域。保存图层,使用另一个StaticLayout将文本渲染为绿色,然后使用蒙版恢复图层,以准确剪切到您想要的位置。

答案 3 :(得分:0)

另一个可能的解决方案是改进Arun的答案(未经测试但应该有效):

private void setTextViewShading(TextView view, float percentage) {
    int[] colors = {Color.WHITE, Color.WHITE, Color.GREEN, Color.GREEN};
    float floatPerc = percentage / 100;
    float[] position = {0, floatPerc, floatPerc + 0.0001, 1};
    TileMode tileMode = TileMode.REPEAT;
    LinearGradient linGrad = new LinearGradient(0, 0, 0, view.getHeight(), colors, position, tileMode);
    Shader shaderGradient = linGrad;
    view.getPaint().setShader(shaderGradient);
}