Android开发笔记——TextView的高级应用之文本的淡入淡出

原创 2016年06月01日 14:53:46
    我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此。在未来的几天里,我将会记录一些TextView的一些高级应用。
    今天就来聊聊淡入淡出的效果。淡入淡出的文字显示效果,其实很多地方都用到过,比如我们常去的新闻网站,里面忽闪忽闪的文字,就是这种,许多朋友刚看到这个的时候会想,不就是淡入淡出嘛,Android的动画里面早就有了。然而你要是这么想,我只能说:搜羊搜森剖。
    因为不知道插入视频,所以就不上视频了。我直接贴代码吧。
public class MutableForegroundColorSpan extends CharacterStyle implements
        UpdateAppearance {

    public static final String TAG = "MutableForegroundColorSpan";

    private int mColor;

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setColor(mColor);
    }

    public int getColor() {
        return mColor;
    }

    public void setColor(int color) {
        this.mColor = color;
    }
}
    这是一个实体类,用于储存文字的颜色以及更新动画状态。紧接着,我把主要的部分也贴上去,具体是怎么实现的,我最后再解释。
public class MarqueeText extends TextView {
    private String mTextString;
    private SpannableString mSpannableString;

    private double[] mAlphas;
    private MutableForegroundColorSpan[] mSpans;
    private boolean mIsVisible;
    private boolean mIsTextResetting = false;
    private int mDuration = 2500;

    ValueAnimator animator;
    ValueAnimator.AnimatorUpdateListener listener = new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            Float percent = (Float)valueAnimator.getAnimatedValue();
            resetSpannableString(mIsVisible ? percent : 2.0f - percent);
        }
    };

    public MarqueeText(Context context) {
        super(context);
        init();
    }

    public MarqueeText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init(){
        this.mIsVisible = false;
        animator = ValueAnimator.ofFloat(0.0f, 2.0f);
        animator.addUpdateListener(listener);
        animator.setDuration(mDuration);
    }

    public void toggle(){
        if (mIsVisible) {
            hide();
        } else {
            show();
        }
    }

    public void show(){
        mIsVisible = true;
        animator.start();
    }

    public void hide(){
        mIsVisible = false;
        animator.start();
    }

    public void setIsVisible(boolean isVisible){
        mIsVisible = isVisible;
        resetSpannableString(isVisible == true ? 2.0f : 0.0f);
    }

    public boolean getIsVisible(){
        return mIsVisible;
    }

    private void resetSpannableString(double percent){
        mIsTextResetting = true;

        int color = getCurrentTextColor();
        for (int i = 0; i < this.mTextString.length(); i++) {
            MutableForegroundColorSpan span = mSpans[i];
            span.setColor(Color.argb(clamp(mAlphas[i] + percent), Color.red(color), Color.green(color), Color.blue(color)));
        }

        setText(mSpannableString);

        mIsTextResetting = false;
    }

    private void resetAlphas(int length){
        mAlphas = new double[length];
        for(int i=0; i < mAlphas.length; i++){
            mAlphas[i] = Math.random()-1;
        }
    }

    private void resetIfNeeded(){
        if (!mIsTextResetting){
            mTextString = getText().toString();
            mSpannableString = new SpannableString(this.mTextString);
            mSpans = new MutableForegroundColorSpan[this.mTextString.length()];
            for (int i = 0; i < this.mTextString.length(); i++) {
                MutableForegroundColorSpan span = new MutableForegroundColorSpan();
                mSpannableString.setSpan(span, i, i+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                mSpans[i] = span;
            }
            resetAlphas(mTextString.length());
            resetSpannableString(mIsVisible ? 2.0f : 0);
        }
    }

    public void setText(String text) {
        super.setText(text);
        resetIfNeeded();
    }

    @Override
    public void setText(CharSequence text, TextView.BufferType type) {
        super.setText(text, type);
        resetIfNeeded();
    }

    private int clamp(double f){
        return (int)(255*Math.min(Math.max(f, 0), 1));
    }

    public void setDuration(int duration){
        this.mDuration = duration;
        animator.setDuration(duration);
    }
}
    我们看到代码,这是一个自定义的TextView,另外,我们这里插入一个知识点:ValueAnimator,属性动画的一部分,关于属性动画,我准备在下几篇文章里面进行详细介绍。

ValueAnimator是属性动画的核心部分,它本身不提供任何动画效果,而更像是数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程。它一般性用法如下:

    ValueAnimator animator;
    ValueAnimator.AnimatorUpdateListener listener = new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            Float percent = (Float) valueAnimator.getAnimatedValue();
            resetSpannableString(mIsVisible ? percent : 2.0f - percent);
        }
    };
    通常情况下,ValueAnimator 的AnimatorUpdateListener中监听数值的变换,从而完成动画的交换。

    截止目前,java代码的部分也就差不多了。就像其他的Textview拓展的使用一样,我们直接把自己的TextView全称放在XML布局文件里面。开始动画方法就是调用它的start()方法,好了,以上就是关于textview淡入淡出效果的全部实现过程了。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android实现从左往右TextView淡入淡出渐变效果

首先跟大家说声抱歉,由于最近鄙人感冒身体欠安,所以博客很久没更新了,我觉得是时候不玩捉迷臧了,废话不多说,还是老套路,上效果图! 其实实现原理很简单首先我们看一张图,画的少不喜随便喷哈哈! ...

TextView 文字淡入效果

一个文本渐渐地从左到右的显示。  几步就可以了实现了。利用的是View的fade边缘。当然也可以自己画,可是没有成功。  Java代码   直接上代码:   class F...

android轻量框架六__Title文字淡入和淡出

用到TextSwitcher http://www.imobilebbs.com/wordpress/?p=2403   但我要一整个Title(linearlayout)淡入,怎么做呢?  ...
  • avi9111
  • avi9111
  • 2012年06月21日 17:03
  • 1880

让你的TextView字体跳动起来

textview可以有跑马灯的效果,如何让textview字体可以像波浪形状跳动起来呢?先上个图 偶尔看了一个跳动的textview的开源项目,了解其原理,得到了一个很好用的类。还是很span有关,...
  • gacmy
  • gacmy
  • 2016年08月08日 17:56
  • 1156

Android中几个Activity实现平移效果

问题描述:现假设有4个activity,每个actvity界面的底部都有两个按钮,一个是回到前一页,一个是到下一页。页面跳转的逻辑相对比较简单,下面来谈一下如何给这4个Activity加上平移效果。...

android 数字选择器中文字颜色透明度渐变的实现

首先看android View源码中渐变的实现 draw方法 boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0...
  • whuthm
  • whuthm
  • 2015年10月11日 17:05
  • 951

如何将TextView设置背景透明(不改变本身颜色)

问题描述: 在一个图片(UIImageView)上层添加一些文字(UITextView) , 但是文字的白色背景会将下层,也就是图片层覆盖。并且设置 textView.alpha = 0.5,效果...

ASP防止跨站脚本和SQL注入代码

使用方法如下:1. 把以下代码保存为_safe.asp,然后放到站点根目录即可。
  • xieyunc
  • xieyunc
  • 2016年07月22日 22:35
  • 4229

RxJava运用Scheduler完成多线程操作

RxJava运用Scheduler完成多线程操作 Scheduler-调度器 (为了方便理解可以简单的认为rx中的调度器即为线程)应用Rxjava中如果想在操作符链上添加多线程,你可以指定这些操作符...

Android开发笔记(十五)淡入淡出动画TransitionDrawable

说到淡入淡出动画,可能大家会想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换。如果我们想要从A图片逐渐变为B图片,也就是要实...
  • aqi00
  • aqi00
  • 2015年12月10日 16:42
  • 4720
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发笔记——TextView的高级应用之文本的淡入淡出
举报原因:
原因补充:

(最多只允许输入30个字)