2013-12-08 2 views
0

Я пытаюсь покрасить только гласные в свой цвет 1 (например, красный), а не гласные другие (например: синий). Но метод SpansableString setSpan() несовместим при итерации через каждый символ. Функция обнаружение обетов и не-обетов правильно, как я проверил выход вошел, за исключением того, что окраска не является правильной:Непоследовательная окраска SpannableString setSpan()?

//ColorLogic.java: 
public SpannableString colorString(String myStr) 
    { 
     SpannableString spnStr=new SpannableString(myStr); 
     ForegroundColorSpan vowColor=new ForegroundColorSpan(Color.RED); 
     ForegroundColorSpan conColor=new ForegroundColorSpan(Color.BLUE); 
     int strLen=myStr.length(); 
     for(int i=0; i< strLen; i++) 
     { 
      if (vowSet.contains(Character.toLowerCase(myStr.charAt(i)))) 
      //if (i%2==0) 
      { 
       Log.v(DTAG, "vow"+myStr.charAt(i)); 
       spnStr.setSpan(vowColor, i, i, 0); 

      } 
      else 
      { 
       Log.v(DTAG, "cons"+myStr.charAt(i)); 
       spnStr.setSpan(conColor, i, i, 0); 
      } 
     } 
     return spnStr; 
    } 

    //In my OnCreate of my activity class: 
    //PASS 
    //Log.v(DTAG, message); 
    // Create the text view 
    TextView textView = new TextView(this); 
    textView.setTextSize(50); 

    //Call Color Logic to color each letter individually 
    ColorLogic myColorTxt=new ColorLogic(); 
    SpannableString spnMsg=myColorTxt.colorString(message); 
    //Log.v(DTAG, "spnMsg: "+spnMsg.toString()); 

    textView.setText(spnMsg, BufferType.SPANNABLE); 
    //textView.setTextColor(Color.GREEN); 
    setContentView(textView); 
    } 


     ![Vows Only its correct (non-vowels only is correct as well)][1] 
      ![With cons and vows, 2 letters then its incorrect!][2] 

Alternating vows and cons is incorrect as well

+2

создать новый пролет для каждого vovel/non vovel – pskink

ответ

1

Вы не можете повторно использовать объекты пролетных. Как показывает pskink, пожалуйста, используйте различные ForegroundColorSpan объектов для каждого звонка setSpan().

Кроме того, вы можете использовать меньше пролетов в целом. Хотя ваш образец («abibobu») требует максимально возможного количества пролетов, большинство слов имеют согласные и гласные, нанизанные вместе. Например, слово «согласный» имеет два двухсогласных промежутка («ns» и «nt»). Они могут быть окрашены, используя один ForegroundColorSpan, а не два, улучшая скорость рендеринга. Пролеты легкие, но не самые быстрые, и поэтому чем меньше вы используете, тем лучше ваше приложение будет работать, особенно в анимированных ситуациях (например, прокрутка в ListView).

Кроме того, вам может понадобиться только цвет либо согласные или гласных, если вы не планируете на третий цвете для дефиса и апострофа. Помните: ваш текст может начинаться с цвета (например, android:textColor).

+0

Я уже пробовал объявить новый диапазон для гласного или согласного в .setSpan для каждой итерации цикла for. Это тот же непредсказуемый и неправильный вывод – jerryh91

+0

@ jerryh91: Тогда у нас нет способа помочь вам, так как код, который у вас есть в вопросе, - это не тот код, который вы используете. При этом я предлагаю вам немного подумать о четвертом параметре 'setSpan()'. – CommonsWare

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

  • Нет связанных вопросов^_^