2013-12-04 2 views
1

Привет, мне нужно показать прогресс в самом номере. Я встретил Shader, Gradient, используемый в TextView для горизонтального многоцветного текста. Являются ли они такими встроенными в API для рисования символов, как показано на рисунке ниже?Показать прогресс в TextView Android

Sample Progress Percentage Image - MSPaint

Заранее спасибо

ответ

4

Вы можете создать два TextViews, один белый и один зеленый в точно таком же положении. Установите высоту одного так, чтобы текст был обрезан, и он лишь частично покрывает другой.

<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> 
+0

Спасибо! Но мне нужен точный контроль над белым текстом !! – Ahamed

+0

Я рекомендую начать с этого типа макета, а затем написать код Java, чтобы изменить высоту белого TextView. –

+0

Я пробовал, пространство между текстом и макетом top/bottom мешает вычислению. – Ahamed

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 
+0

Где мы контролируем высоту здесь? Пожалуйста, объясни. – Ahamed

0

Если бы я тебя, я хотел бы создать свой собственный класс представления, что в onDraw(), визуализирует белый текст с помощью StaticLayout, затем устанавливает PorterDuffXferMode маску на холсте, чтобы замаскировать область, которую вы хотите, чтобы избежать втягивания зеленый. Сохраните слой, используйте другой файл StaticLayout, чтобы отобразить текст в зеленом цвете, затем восстановите слой с помощью маски, чтобы получить отрезок точно там, где вы хотите.

0

Другим возможным решением, улучшая ответ Аруна это (непроверенные, но должно работать):

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); 
} 
+0

Не работает :( – hrules6872

Смежные вопросы