2016-08-07 1 views
1

Могу ли я установить один символ внутри TextView для мигания?android blink character in textview

Использование «spannable» Я могу установить цвета, шрифт и т. Д., Но я ничего не нашел о мигании.

«Анимация» AFAIK работает на весь вид.

Предложения кому-нибудь?

+1

расширение 'BackgroundColorSpan' /' ForegroundColorSpan', переопределение 'updateDrawState (TextPaint ds) 'и заставит ваш TextView перерисовать после установки нового' ds.bgColor' – pskink

+1

и, да, вы можете сделать это с помощью «Анимации», скорее всего, используя «ValueAnimator' /' ObjectAnimator' или 'TimeAnimator' (в зависимости от ваш случай пользователя), вы пытались расширить sp ans i, упомянутых выше? – pskink

+0

Благодарим вас за подсказки. Тем не менее, мне нужно сделать домашнее задание сейчас и прочитать некоторые документы об охватах - по крайней мере, я знаю, с чего начать :) – Vladimir

ответ

3

вы можете начать играть с этим пользовательским классом:

class FCS extends ForegroundColorSpan implements TimeAnimator.TimeListener { 

    private TextView tv; 
    private int[] colors; 
    private int color; 
    TimeAnimator animator; 
    ArgbEvaluator evaluator; 

    public FCS(TextView tv, int[] colors) { 
     super(colors[0]); 
     this.tv = tv; 
     this.colors = colors; 
     animator = new TimeAnimator(); 
     animator.setTimeListener(this); 
     evaluator = new ArgbEvaluator(); 
     animator.start(); 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setColor(color); 
    } 

    @Override 
    public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) { 
     float sin = (float) (Math.sin(Math.PI * totalTime/1000f)); 
     float fraction = sin * sin; 
//  float fraction = (float) (-Math.cos(2*Math.PI * totalTime/1000f) + 1)/2f; 
     color = (int) evaluator.evaluate(fraction, colors[0], colors[1]); 
     tv.invalidate(); 
     if (totalTime > 20000) { 
      animator.end(); 
     } 
    } 
} 

тест код (поместите его в Activity#onCreate методе):

TextView tv = new TextView(this); 
tv.setTextSize(40); 
int[] colors = { 
     tv.getCurrentTextColor(), 
     Color.RED, 
}; 
SpannableStringBuilder ssb = new SpannableStringBuilder(); 
ssb.append("Poeta de "); 
int start = ssb.length(); 
ssb.append("magnum stella, dignus sectam!"); 
ssb.setSpan(new FCS(tv, colors), start, start+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
tv.setText(ssb); 
setContentView(tv);