android textView的渐入效果
2016-01-07 13:53 Weiggle 阅读(544) 评论(0) 编辑 收藏 举报1:自定义属性:
attrs:
<declare-styleable name="RealText"> <attr name="text" format="string"/> <attr name="duration" format="integer"/> </declare-styleable>
2:自定义View:
public class RealText extends TextView implements Runnable,ValueAnimator.AnimatorUpdateListener{ private String text; private int duration = 300; private double[] alphas; private int red; private int green; private int blue; public RealText(Context context) { this(context, null); } public RealText(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RealText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.RealText); int c = array.getIndexCount(); for(int i = 0;i< c;i++){ int attr = array.getIndex(i); switch (attr){ case R.styleable.RealText_duration: duration = array.getInteger(attr,duration); break; case R.styleable.RealText_text2: text = array.getString(attr); break; } } array.recycle(); setAnimationText(text); } @Override public void run() { int color = getCurrentTextColor(); red = Color.red(color); green = Color.green(color); blue = Color.blue(color); ValueAnimator animator = ValueAnimator.ofFloat(0f, 2f); animator.setDuration(duration); animator.addUpdateListener(this); animator.start(); } @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); SpannableStringBuilder builder = new SpannableStringBuilder(text); for(int i = 0;i<text.length();i++){ builder.setSpan(new ForegroundColorSpan(Color.argb(clam(value+alphas[i]) , red, green, blue)),i,i+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } setText(builder); } protected int clam(double value){ return (int)(255*Math.min(Math.max(value, 0f), 1f)); } public void replayAnimation(){ if(null != text){ post(this); } } public void setAnimationText(String text){ this.text = text; alphas = new double[text.length()]; for(int i=0;i<text.length();i++){ alphas[i] = Math.random() - 1.0f; } setText(text); replayAnimation(); } }
3:布局
<com.widget.RealText android:layout_width="match_parent" android:layout_height="wrap_content" app:duration="2000" app:text="Hello world"/>