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轻量框架六__Title文字淡入和淡出

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

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

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

Android TextView显示文字过长时添加阴影渐变消失效果

TextView 上显示的文字超过其最长限制的时候,要如何实现以下效果:   values/styles.xml  4px 4px #ffffffff ...
  • jdsjlzx
  • jdsjlzx
  • 2012年06月08日 13:53
  • 5803

android动画案例,淡入淡出效果

源代码下载 1、android动画测试程序,界面如图: 颜色随机变化,点击视图,左淡出,右淡入,下淡出,上淡入效果。 主要源代码解析: package com.example.objectani...
  • hailushijie
  • hailushijie
  • 2013年03月18日 22:08
  • 4665

Android:简单动画效果-淡入淡出播放

淡入淡出的切换效果很常见呢! 无论是Html5,JQuery,都经常用到呢, 这首Android的动画效果:一个深入,一个淡入淡出 实现起来也很简单: im...
  • ssh159
  • ssh159
  • 2017年04月04日 15:33
  • 894

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

说到淡入淡出动画,可能大家会想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换。如果我们想要从A图片逐渐变为B图片,也就是要实...
  • aqi00
  • aqi00
  • 2015年12月10日 16:42
  • 5790

Android资源之图像资源(淡入淡出、嵌入)

今天把图像资源剩余的几个知识梳理一下。淡入淡出资源同图像状态和图像级别资源一样可以切换两个图像(目前只支持两个图像的切换),并且使这两个图像以淡入淡出效果进行切换。如上一篇博文介绍的开关电灯一样,如果...
  • gc_gongchao
  • gc_gongchao
  • 2014年06月22日 20:23
  • 3139

#Android笔记#popupwindow淡入淡出动画效果的研究

前几天刚刚完成了一个底部菜单栏的设计与功能的实现,那么问题来了
  • superyu1992
  • superyu1992
  • 2014年10月17日 09:28
  • 2751

Viewpager切换的淡入淡出切换(页面不移动)

本文转载自:http://blog.csdn.net/qq_22770457/article/details/52133288 纯手工自制的Android引导页,实现了Viewpag...
  • sugaryaruan
  • sugaryaruan
  • 2016年09月22日 13:35
  • 930

Android Animation动画的淡入淡出、旋转、缩放和移动

Android Animation Contents: Animations Tween Animations AnimationSet Interpolator Frame-By-...
  • yule12345
  • yule12345
  • 2014年12月15日 10:53
  • 2669
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发笔记——TextView的高级应用之文本的淡入淡出
举报原因:
原因补充:

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