翻翻git之---闪烁动画的TextView RevealTextView

转载请注明出处:王亟亟的大牛之路

今天没有P1啦!! 对换工作有想法的,可以找昨天的P1,哈哈 地址:http://blog.csdn.net/ddwhan0123/article/details/50728434


今天上一个自身闪烁,用于吸引用户注意力的TextView * RevealTextView*

先上下效果图:(这图片够大的)

这里写图片描述

How to use?

Gradle

dependencies {
  compile 'com.antonionicolaspina:revealtextview:2.0'
}

Eclipse
Copy下 attires.xml 和RevealTextView.java就行了,内容不多。

这里写图片描述


接下来我们来拆拆实现,先看一下自定义Styleable的东西

 <declare-styleable name="RevealTextView">
        <attr name="rtv_duration" format="integer" />
        <attr name="android:text" />
    </declare-styleable>

就只有持续时间和文字

接下来看具体实现

public final class RevealTextView extends TextView implements Runnable, ValueAnimator.AnimatorUpdateListener

继承于TextView 实现多线程以及动画的时间,一看就知道 他没有用诸如Handler的实现,纯粹的主线程子线程的相互操作配合动画来实现闪烁效果

  protected void init(TypedArray attrs) {
    try {
      animationDuration = attrs.getInteger(R.styleable.RevealTextView_rtv_duration, animationDuration);
      text = attrs.getString(R.styleable.RevealTextView_android_text);
    } finally {
      attrs.recycle();
    }

    setAnimatedText(text);
  }

接着就是初始化,然后就是调用开始动画的操作,这里是把标签传来的字送了过去。

public void setAnimatedText(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();
  }

这边用一个数组作为整个字符串的容器,然后把每个字符生成一个随机数放入容器中,然后开始多线程的操作。

public void replayAnimation() {
    if (null != text) {
      post(this);
    }
  }

当字符串不为空开始执行多线程操作。

并且这2个方法是public的,给予我们外部调用的。

 @Override
  public void run() {
    final int color = getCurrentTextColor();

    red   = Color.red(color);
    green = Color.green(color);
    blue  = Color.blue(color);

    ValueAnimator animator = ValueAnimator.ofFloat(0f, 2f);
    animator.setDuration(animationDuration);
    animator.addUpdateListener(this);
    animator.start();
  }

在run方法中执行了 我们的动画的初始化操作

  @Override
  public void onAnimationUpdate(ValueAnimator valueAnimator) {
    final float value = (float) valueAnimator.getAnimatedValue();
    SpannableStringBuilder builder = new SpannableStringBuilder(text);
    for(int i=0; i<text.length(); i++) {
      builder.setSpan(new ForegroundColorSpan(Color.argb(clamp(value + alphas[i]), red, green, blue)), i, i+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    setText(builder);
  }

在onAnimationUpdate中对字体进行二次处理最终实现了 图中的效果

作者git:https://github.com/ANPez/RevealTextView

下载地址:https://github.com/ANPez/RevealTextView/archive/master.zip

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值