在安卓程序启动的时候,想逐字显示一段话,每个字都有一个从透明到不透明的渐变动画。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中展示大量文本,而屏幕空间有限时,可以使用TextView的垂直滚动功能来实现文本的连续显示。本篇文章将详细讲解如何在Android中实现TextView的垂直滚动效果。 首先,要开启...
在许多应用中,我们可能希望实现一个功能,当用户点击TextView时,文本能展开显示全部内容,同时伴随着优雅的动画效果。这篇博客“Android TextView实现点击展开动画效果”提供了一个实用的方法来实现这个功能。 ...
这种方法避免了直接使用Animation类,而是利用了Android的内置动画机制,提供了更高效且易于控制的动画实现。 通过自定义控件和使用ValueAnimator,我们可以实现更复杂和定制化的动画效果,同时保持代码的简洁性...
在Android开发中,为UI元素添加动画效果可以极大地提升用户体验,"Android TextView闪闪发光特效"就是这样一种常见的视觉增强技术。这种特效通常通过Shimmer效果来实现,它可以让TextView的文字或图像看起来像在闪烁...
本文将深入探讨如何使用原生的Android动画技术来实现TextView的垂直滚动效果以及上下滚动效果。 一、基本概念 1. 垂直滚动:当TextView中的文本内容超出可视区域时,可以通过垂直滚动来展示未显示的部分。通常有两...
Android TextView 去掉自适应默认的fontpadding的实现方法 最近在项目中使用textview时发现在使用Android:layout_height=”wrap_content”这个属性设置后,textview会有默认的padding,也就是fontpadding。这样就会...
本文将深入探讨如何使用TextView在Android环境中实现这一功能,同时考虑到字体大小的调整以及字符串处理的灵活性。 首先,TextView是Android SDK中一个核心组件,它用于显示单行或多行文本。在我们的场景中,...
我们在浏览网页时,网页的文本可以放大缩小,android两点手势,两点距离靠近时缩小,两点距离...那么若果不用android的WebView控件,单纯的TextView能否做到放大缩小呢,其实也是可以的。只要响应和处理手势事件即可。
本案例中的"android 自定义延时逐字显示文本内容"是一个专为TextView设计的自定义视图,它允许开发者在指定的延迟时间后逐字显示文本内容,创造出类似于打字机效果的动态显示。这样的功能可以用于提升用户界面的互动...
在Android中,这通常通过使用Selector来实现。Selector是一种Drawable对象,它可以定义多种状态并决定在特定状态下显示哪种图像或颜色。 首先,我们需要了解TextView的状态列表。在Android中,TextView可以有以下几...
### Android TextView与ListView的Transcript Mode属性详解 在Android开发过程中,经常需要用到各种视图组件来展示信息。其中,`TextView`和`ListView`是非常重要的两个组件。它们不仅用于简单的文本展示,还可以...
总结,实现`TextView`的文字翻滚动画涉及到Android的动画系统、自定义视图以及消息轮播机制。通过合理的组合使用这些技术,开发者可以创建出富有动态感且用户体验良好的应用。无论是自定义动画还是使用第三方库,...
如果我们的应用需要显示时间,可能首先想到大街上LED显示的绿色的发光字体, 想到 使用时钟控件显示时间,这种效果,我们用 TextView 就可以实现。具体看博客说明:编辑文章 - 博客频道 - CSDN.NET ...
本文将深入探讨如何利用Android SDK来实现一个自定义的TextView,使其能够显示动态的文字效果,从而为用户界面增添活力。我们将重点关注以下几个核心知识点: 1. **自定义View类**: 在Android中,自定义控件通常...
本篇文章将详细讲解如何在Android中实现TextView的文字部分渐变色,主要涉及到`LinearGradient`、`FontSpan`以及`SpannableString`等关键概念。 首先,我们了解`LinearGradient`。在Android的图形库中,`...
虽然原生的Android SDK并没有直接支持完整的CSS语法,但通过`TextView`的`setText`方法结合`Html.fromHtml()`函数,可以实现基本的HTML标签渲染,并且通过一些开源库或自定义处理方式,可以进一步扩展其功能,使其...
总结一下,实现"Android TextView查看更多"功能主要涉及以下几个步骤: 1. 在布局文件中创建`TextView`,并设置显示文本、最大行数和省略策略。 2. 为`TextView`添加点击事件监听器,根据点击状态切换显示全文或截断...
本教程将深入讲解如何在Android中实现TextView的文字滚动功能。 首先,我们要了解TextView的两种滚动方式:自动滚动和手动滚动。自动滚动是指文本会按照一定的速度持续滚动,而手动滚动则允许用户通过触摸屏幕来...
这个"Android TextView显示html的demo"就是专门为了实现这一功能而设计的示例项目。下面我们将深入探讨相关知识点。 1. **TextView组件**: - TextView是Android中的一个基础组件,通常用于显示单行或多行文本。在...