2016-08-07 5 views
1

TextView内の1文字を点滅させることはできますか?android blink character in textview

「spannable」を使用すると、色、フォントの太さなどを設定できますが、瞬きについては何も見つかりませんでした。

「アニメーション」AFAIKは全体の視点で機能します。

提案者ですか?

+1

'BackgroundColorSpan' /' ForegroundColorSpan'、オーバーライド 'updateDrawState(TextPaint延長ds) 'を設定し、新しい' ds.bgColor'を設定した後に 'TextView'を再描画するように強制します。 – pskink

+1

そして、あなたは' Animation 'で 'ValueAnimator' /' ObjectAnimator'や 'TimeAnimator'あなたのユーザーの場合)、あなたはspを拡張しようとしましたか私は上記のans? – 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);