嗨,我必须在数字本身显示进度。我遇到过Shader,Gradient在TextView中用于文本的横向多色印刷。他们的内置API是否可以绘制字符,如下图所示?
先谢谢
答案 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);
}