Android自定义View实现打字机效果

一、先来看看效果演示

二、实现原理:

这个其实不难实现,通过一个定时器不断调用TextView的setText就行了,在setText的时候播放打字的音效。

具体代码如下:

import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.media.MediaPlayer; import android.text.TextUtils; import android.util.AttributeSet; import android.widget.TextView; import com.uperone.typetextview.R; /** * 模拟打字机效果 * * */ public class TypeTextView extends TextView { private Context mContext = null; private MediaPlayer mMediaPlayer = null; private String mShowTextString = null; private Timer mTypeTimer = null; private OnTypeViewListener mOnTypeViewListener = null; private static final int TYPE_TIME_DELAY = 80; private int mTypeTimeDelay = TYPE_TIME_DELAY; // 打字间隔 public TypeTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initTypeTextView( context ); } public TypeTextView(Context context, AttributeSet attrs) { super(context, attrs); initTypeTextView( context ); } public TypeTextView(Context context) { super(context); initTypeTextView( context ); } public void setOnTypeViewListener( OnTypeViewListener onTypeViewListener ){ mOnTypeViewListener = onTypeViewListener; } public void start( final String textString ){ start( textString, TYPE_TIME_DELAY ); } public void start( final String textString, final int typeTimeDelay ){ if( TextUtils.isEmpty( textString ) || typeTimeDelay < 0 ){ return; } post( new Runnable( ) { @Override public void run() { mShowTextString = textString; mTypeTimeDelay = typeTimeDelay; setText( "" ); startTypeTimer( ); if( null != mOnTypeViewListener ){ mOnTypeViewListener.onTypeStart( ); } } }); } public void stop( ){ stopTypeTimer( ); stopAudio(); } private void initTypeTextView( Context context ){ mContext = context; } private void startTypeTimer( ){ stopTypeTimer( ); mTypeTimer = new Timer( ); mTypeTimer.schedule( new TypeTimerTask(), mTypeTimeDelay ); } private void stopTypeTimer( ){ if( null != mTypeTimer ){ mTypeTimer.cancel( ); mTypeTimer = null; } } private void startAudioPlayer() { stopAudio(); playAudio( R.raw.type_in ); } private void playAudio( int audioResId ){ try{ stopAudio( ); mMediaPlayer = MediaPlayer.create( mContext, audioResId ); mMediaPlayer.start( ); }catch( Exception e ){ e.printStackTrace(); } } private void stopAudio( ){ if( mMediaPlayer != null && mMediaPlayer.isPlaying( ) ){ mMediaPlayer.stop( ); mMediaPlayer.release( ); mMediaPlayer = null; } } class TypeTimerTask extends TimerTask{ @Override public void run() { post(new Runnable( ) { @Override public void run() { if( getText( ).toString( ).length( ) < mShowTextString.length( ) ){ setText( mShowTextString.substring(0, getText( ).toString( ).length( ) + 1 ) ); startAudioPlayer(); startTypeTimer( ); }else{ stopTypeTimer( ); if( null != mOnTypeViewListener ){ mOnTypeViewListener.onTypeOver( ); } } } }); } } public interface OnTypeViewListener{ public void onTypeStart( ); public void onTypeOver( ); } }

三、使用说明:

1、在xml文件中定义:

<com.uperone.typetext.view.TypeTextView android:id="@+id/typeTxtId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" />

2、在代码中实例化:

mTypeTextView = ( TypeTextView )findViewById(R.id.typeTxtId); mTypeTextView.setOnTypeViewListener( new OnTypeViewListener( ) { @Override public void onTypeStart() { print( "onTypeStart" ); } @Override public void onTypeOver() { print( "onTypeOver" ); } });

3、调用start方法:

mTypeTextView.start( TEST_DATA );

四、总结

以上就是Android自定义View实现打字机效果的全部内容,感兴趣的快快自己动手实践起来,希望本文的内容对大家开发Android的时候能有所帮助,如果有疑问可以留言交流。

时间: 2024-10-27 05:27:49

Android自定义View实现打字机效果的相关文章

Android自定义View实现打字机效果_Android

一.先来看看效果演示 二.实现原理: 这个其实不难实现,通过一个定时器不断调用TextView的setText就行了,在setText的时候播放打字的音效. 具体代码如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.media.MediaPlayer; import android.text.TextUtils; import android

Android 自定义View实现抽屉效果

Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子View产生滚动效果menuView.layout(menuLeft, 0, menuLeft + menuWidth, menuHeight); 相应的,由于没有使用scrollBy方法,就没有产生getScrollX值,所以不能通过Scroller的startScroll方法来完成手指离开后的平

android自定义view实现公章效果

上次去一个公司面试,面试官问了一个题,怎么用android的自定义view实现一个公章的效果,据说这是华为之前的面试题,我想了下,要是公章的效果,最外层是一个圆,里面是一个五角星,但是这文字怎么画呢,比较难搞,后来回来看了下java的api,发现人家的Path里面本来就提供了这么一个方法: public void addArc(RectF oval, float startAngle, float sweepAngle) { addArc(oval.left, oval.top, oval.ri

Android自定义View实现钟摆效果进度条PendulumView_Android

在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果.由于原生的进度条确实是不好看,所以想可以自定义View实现这样的效果,以后也可以用于加载页面的进度条.  废话不多说,先上效果图   底部黑边是录制时不小心录上的,可以忽略.  既然是自定义View我们就按标准的流程来,第一步,自定义属性  自定义属性  建立属性文件  在Android项目的res->values目录下新建一个attrs.xml文件,文件内容如下: <?xml version="1.0&quo

android自定义View滑动删除效果

View滑动删除效果图 实现功能 1.可以向左滑动,右侧出现删除 2.向左滑动如果删除出现一大半,松手打开删除,反之关闭删除 3.应用场景           微信消息的删除功能 实现原理 1.外面是一个ListView 2.条目是一个自定义控件继承ViewGroup     1).左边一个TextView,右侧屏幕外也有一个TextView     2).所以继承ViewGroup 实现步骤 1.创建一个SlideDeleteView类 1).构造方法要关联 public class Slid

Android自定义View实现钟摆效果进度条PendulumView

在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果.由于原生的进度条确实是不好看,所以想可以自定义View实现这样的效果,以后也可以用于加载页面的进度条. 废话不多说,先上效果图 底部黑边是录制时不小心录上的,可以忽略. 既然是自定义View我们就按标准的流程来,第一步,自定义属性 自定义属性 建立属性文件 在Android项目的res->values目录下新建一个attrs.xml文件,文件内容如下: <?xml version="1.0" enco

Android自定义View之仿vivo i管家病毒扫描动画效果

技术是永无止境的,如果真的爱技术,那就勇敢的坚持下去.我很喜欢这句话,当我在遇到问题的时候.当我觉得代码枯燥的时候,我就会问自己,到底是不是真的热爱技术,这个时候,我心里总是起着波澜,我的答案是肯定的,我深深的爱着这门技术. 今天我们继续聊聊Android的自定义View系列.先看看效果吧: 这个是我手机杀毒软件的一个动画效果,类似于雷达搜索,所以用途还是很广泛的,特别是先了解一下这里的具体逻辑和写法,对技术的进步一定很有用. 先简单的分析一下这里的元素,主要有四个圆.一个扇形.还有八条虚线.当

Android自定义View之实现理财类APP七日年化收益折线图效果

这段时间的自定义View学习,学会了绘制柱状图.绘制折线图.绘制进度控件,那我们今天就来聊聊另外一种自定义的View,这就是我们常见的七日年化收益折线图效果.先看看长什么样. 这就是效果图了,元素相对而言还是比较多的,这里有线.柱状图.文字.折线.点等等.看起来好像很复杂,但是呢,只要一步一步的实现,那还是可以达到这种效果的,之前我们说过的, 自定义View,就像是在photo shop里面画图,想要什么就画什么,我们可以有很多的画笔工具,也可以有很多的图层. 先看看我们这一次用到哪些变量. P

Android中自定义view实现侧滑效果_Android

效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.ViewDragHelper 的用法: 2.滑动冲突的解决: 3.自定义viewgroup. ViewDragHelper 出来已经比较久了 相信大家都比较熟悉,不熟悉的话google一大把这里主要简单用一下它的几个方法 1.tryCaptureView(View child, int pointerI