`
chen592969029
  • 浏览: 109524 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Android TextView实现逐字动画

阅读更多

在安卓程序启动的时候,想逐字显示一段话,每个字都有一个从透明到不透明的渐变动画。Android的TextView只能设置整个TextView的动画,而不能设置每个文字的动画。即使是使用TextSwitcher,也很难实现我想要的效果。

 

所以选择自定义一个。大体思路是:继承ViewGroup,设置Text的时候,每个文字为一个TextView,每隔一个固定时间,启动每个TextView的动画。

 

定义一个CTextView,继承ViewGroup:实现主要代码:

public class CTextView extends ViewGroup {
}

向外提供一个方法setText(String text, final Animation animation, int duration),text为要显示的字符串,animation为每个字符的动画,duration为字符动画的播放间隔。该方法实现如下:

    public void setText(String text, final Animation animation, int duration) {
        int time = 0;
        if(text != null && !text.isEmpty()) {
            char[] characters = text.toCharArray();
            for(char c : characters) {
                final TextView t = new TextView(context);
                //遍历传入的字符串的每个字符,生成一个TextView,并设置它的动画
                t.setText(String.valueOf(c));
                t.setTextSize(28);
                Handler h = new Handler();
                //每隔duration时间,播放下一个TextView的动画
                h.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        addView(t);
                        t.setAnimation(animation);
                    }
                }, time);

                time += duration;

            }
        }
    }

 CTextView完整实现如下:

import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.widget.TextView;

/**
 * Created by cchen on 2014/9/2.
 */
public class CTextView extends ViewGroup {
    private Context context;

    public CTextView(Context context) {
        super(context);
        this.context = context;
    }

    public CTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public CTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.context = context;
    }

    public void setText(String text, final Animation animation, int duration) {
        int time = 0;
        if(text != null && !text.isEmpty()) {
            char[] characters = text.toCharArray();
            for(char c : characters) {
                final TextView t = new TextView(context);
                //遍历传入的字符串的每个字符,生成一个TextView,并设置它的动画
                t.setText(String.valueOf(c));
                t.setTextSize(28);
                Handler h = new Handler();
                //每隔duration时间,播放下一个TextView的动画
                h.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        addView(t);
                        t.setAnimation(animation);
                    }
                }, time);

                time += duration;

            }
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int measureWidth = measureWidth(widthMeasureSpec);
        int measureHeight = measureHeight(heightMeasureSpec);
        // 计算自定义的ViewGroup中所有子控件的大小
        measureChildren(widthMeasureSpec, heightMeasureSpec);
        // 设置自定义的控件MyViewGroup的大小
        setMeasuredDimension(measureWidth, measureHeight);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int childLeft = 0;
        // 遍历所有子视图
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childView = getChildAt(i);

            // 获取在onMeasure中计算的视图尺寸
            int measureHeight = childView.getMeasuredHeight();
            int measuredWidth = childView.getMeasuredWidth();

            //将他们横向排列
            childView.layout(childLeft, 0, childLeft + measuredWidth, measureHeight);

            childLeft += measuredWidth;
        }
    }

    private int measureWidth(int pWidthMeasureSpec) {
        int result = 0;
        int widthMode = MeasureSpec.getMode(pWidthMeasureSpec);// 得到模式
        int widthSize = MeasureSpec.getSize(pWidthMeasureSpec);// 得到尺寸

        switch (widthMode) {
            /**
             * mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY,
             * MeasureSpec.AT_MOST。
             *
             *
             * MeasureSpec.EXACTLY是精确尺寸,
             * 当我们将控件的layout_width或layout_height指定为具体数值时如andorid
             * :layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
             *
             *
             * MeasureSpec.AT_MOST是最大尺寸,
             * 当控件的layout_width或layout_height指定为WRAP_CONTENT时
             * ,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可
             * 。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
             *
             *
             * MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,
             * 通过measure方法传入的模式。
             */
            case MeasureSpec.AT_MOST:
            case MeasureSpec.EXACTLY:
                result = widthSize;
                break;
        }
        return result;
    }

    private int measureHeight(int pHeightMeasureSpec) {
        int result = 0;

        int heightMode = MeasureSpec.getMode(pHeightMeasureSpec);
        int heightSize = MeasureSpec.getSize(pHeightMeasureSpec);

        switch (heightMode) {
            case MeasureSpec.AT_MOST:
            case MeasureSpec.EXACTLY:
                result = heightSize;
                break;
        }
        return result;
    }
}

 然后在布局文件中使用该自定义组件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".NetworkTestActivity">

    <com.network.cchen.network.CTextView
        android:id="@+id/cTextView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.network.cchen.network.CTextView>

</LinearLayout>

 在Activity中,调用CTextView的setText方法,传入相关参数即可:

import android.app.Activity;
import android.os.Bundle;
import android.view.animation.AnimationUtils;

public class TestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_network_test);

        CTextView cTextView = (CTextView) findViewById(R.id.cTextView);
        cTextView.setText("Hello world", AnimationUtils.loadAnimation(this, R.anim.myanim), 300);
    }
}

 其中的第二个参数为动画,我想要的效果是从透明到不透明,myanim.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="1000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set> 

 如果想实现文字逐个从右侧飞入:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1000"
        android:fillAfter="true"
        android:fromXDelta="50%p"
        android:interpolator="@android:anim/anticipate_interpolator"
        android:toXDelta="0" />
</set>

 

分享到:
评论

相关推荐

    利用Android中的TextView实现逐字显示动画

    本篇文章将探讨如何在Android中利用自定义的TextView实现逐字显示且带有透明度渐变动画的功能。 首先,Android原生的TextView类并不支持对单个字符设置动画,所以我们需要创建一个自定义的视图组件来实现这一功能。...

    Android TextView实现垂直滚动效果的方法

    在Android开发中,当需要在一个TextView中展示大量文本,而屏幕空间有限时,可以使用TextView的垂直滚动功能来实现文本的连续显示。本篇文章将详细讲解如何在Android中实现TextView的垂直滚动效果。 首先,要开启...

    Android TextView实现点击展开动画效果(转)

    在许多应用中,我们可能希望实现一个功能,当用户点击TextView时,文本能展开显示全部内容,同时伴随着优雅的动画效果。这篇博客“Android TextView实现点击展开动画效果”提供了一个实用的方法来实现这个功能。 ...

    Android TextView闪闪发光特效

    在Android开发中,为UI元素添加动画效果可以极大地提升用户体验,"Android TextView闪闪发光特效"就是这样一种常见的视觉增强技术。这种特效通常通过Shimmer效果来实现,它可以让TextView的文字或图像看起来像在闪烁...

    Android TextView 去掉自适应默认的fontpadding的实现方法

    Android TextView 去掉自适应默认的fontpadding的实现方法 最近在项目中使用textview时发现在使用Android:layout_height=”wrap_content”这个属性设置后,textview会有默认的padding,也就是fontpadding。这样就会...

    安卓,Android TextView的垂直滚动效果和上下滚动效果,原生动画实现

    本文将深入探讨如何使用原生的Android动画技术来实现TextView的垂直滚动效果以及上下滚动效果。 一、基本概念 1. 垂直滚动:当TextView中的文本内容超出可视区域时,可以通过垂直滚动来展示未显示的部分。通常有两...

    在Android中用textview实现简单的小说分页

    本文将深入探讨如何使用TextView在Android环境中实现这一功能,同时考虑到字体大小的调整以及字符串处理的灵活性。 首先,TextView是Android SDK中一个核心组件,它用于显示单行或多行文本。在我们的场景中,...

    android 实现可以放大缩小的TextView

    我们在浏览网页时,网页的文本可以放大缩小,android两点手势,两点距离靠近时缩小,两点距离...那么若果不用android的WebView控件,单纯的TextView能否做到放大缩小呢,其实也是可以的。只要响应和处理手势事件即可。

    android 自定义延时逐字显示文本内容

    本案例中的"android 自定义延时逐字显示文本内容"是一个专为TextView设计的自定义视图,它允许开发者在指定的延迟时间后逐字显示文本内容,创造出类似于打字机效果的动态显示。这样的功能可以用于提升用户界面的互动...

    Android通过textview设置状态

    在Android中,这通常通过使用Selector来实现。Selector是一种Drawable对象,它可以定义多种状态并决定在特定状态下显示哪种图像或颜色。 首先,我们需要了解TextView的状态列表。在Android中,TextView可以有以下几...

    android TextView android TextView

    ### Android TextView与ListView的Transcript Mode属性详解 在Android开发过程中,经常需要用到各种视图组件来展示信息。其中,`TextView`和`ListView`是非常重要的两个组件。它们不仅用于简单的文本展示,还可以...

    textview文字翻滚动画

    总结,实现`TextView`的文字翻滚动画涉及到Android的动画系统、自定义视图以及消息轮播机制。通过合理的组合使用这些技术,开发者可以创建出富有动态感且用户体验良好的应用。无论是自定义动画还是使用第三方库,...

    Android textview实现led效果的字体

    如果我们的应用需要显示时间,可能首先想到大街上LED显示的绿色的发光字体, 想到 使用时钟控件显示时间,这种效果,我们用 TextView 就可以实现。具体看博客说明:编辑文章 - 博客频道 - CSDN.NET ...

    android TextView 文字部分渐变

    本篇文章将详细讲解如何在Android中实现TextView的文字部分渐变色,主要涉及到`LinearGradient`、`FontSpan`以及`SpannableString`等关键概念。 首先,我们了解`LinearGradient`。在Android的图形库中,`...

    Android TextView查看更多

    总结一下,实现"Android TextView查看更多"功能主要涉及以下几个步骤: 1. 在布局文件中创建`TextView`,并设置显示文本、最大行数和省略策略。 2. 为`TextView`添加点击事件监听器,根据点击状态切换显示全文或截断...

    Android实现TextView文字滚动.zip

    本教程将深入讲解如何在Android中实现TextView的文字滚动功能。 首先,我们要了解TextView的两种滚动方式:自动滚动和手动滚动。自动滚动是指文本会按照一定的速度持续滚动,而手动滚动则允许用户通过触摸屏幕来...

    android TextView 支持CSS样式

    虽然原生的Android SDK并没有直接支持完整的CSS语法,但通过`TextView`的`setText`方法结合`Html.fromHtml()`函数,可以实现基本的HTML标签渲染,并且通过一些开源库或自定义处理方式,可以进一步扩展其功能,使其...

    Android TextView显示html的demo

    这个"Android TextView显示html的demo"就是专门为了实现这一功能而设计的示例项目。下面我们将深入探讨相关知识点。 1. **TextView组件**: - TextView是Android中的一个基础组件,通常用于显示单行或多行文本。在...

    android textview图文混排支持GIF图

    本文将深入探讨如何在Android的TextView中实现图文混排,并支持GIF图的展示,主要借助于原生方法以及第三方库Glide。 首先,让我们了解什么是图文混排。图文混排是指在一段文本中插入图片,使得文字和图片能够和谐...

    Android TextView展开动画效果

    这种方法避免了直接使用Animation类,而是利用了Android的内置动画机制,提供了更高效且易于控制的动画实现。 通过自定义控件和使用ValueAnimator,我们可以实现更复杂和定制化的动画效果,同时保持代码的简洁性...

Global site tag (gtag.js) - Google Analytics