Android自定义View实现打字机效果
作者:张明云 发布时间:2022-01-13 11:03:41
标签: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 );
四、总结
来源:http://www.jianshu.com/p/13691971e3e7


猜你喜欢
- spring boot2集成activiti6踩过的坑1.activiti中的mybaitis版本冲突 错误信息Caused by: jav
- 简介本次五子棋使用的是光标控制移动,通过按空格键(键值32)来落子,实现游戏的。我们额外用到的头文件有:#include<getch.
- 本文实例为大家分享了C#实现订单管理程序的具体代码,供大家参考,具体内容如下订单管理的控制台程序,能够实现添加订单、删除订单、修改订单、查询
- 本文实例讲述了java计算给定字符串中出现次数最多的字母和该字母出现次数的方法。分享给大家供大家参考,具体如下:import Java.ut
- 以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白
- 根据上下文环境,Java 的关键字 final 的含义有些微的不同,但通常它指的是“这是不能被改变的”。防止改变有两个原因:设计或效率。因为
- 本文实例为大家分享了Android实现选项菜单的具体代码,供大家参考,具体内容如下创建选项菜单步骤:(1)覆盖Activity的onCrea
- 背景最近再做一个需求,就是对站点的一些事件进行埋点,说白了就是记录用户的访问行为。那么这些数据怎么保存呢,人家点一下保存一下?显然不合适,肯
- java弱口令检测机制1. 设计要求应具备检测口令的长度和是否在指定字符集合内的能力。应具备检测口令字符逻辑相邻的能力,如aBc,abC等。
- 我遇到一个重复性操作,为了能偷懒发现idea的功能还比较实用纵列选择:Alt+鼠标左键大小写转换:Ctrl+Shirt+u使用小技巧:像这样
- 上一节,简单讲述了 Mybatis-Plus 搭建与使用入门,这一节,简单讲一下如何使用 MP 实现多表分页。分析使用的工程,依旧是 spr
- 一、问题由来项目开发中,由于实际需要将某一个功能模块抽取成了一个单独的服务,其他地方需要调用的时候,通过Spring提供的RestTempl
- ProgressBar有2个子控件:SeekBar 拖动条控件RatingBar 星级评分控
- 原始数据:string input = "3,7,2,8,1,9,1,34,67,78,22";要处理为:string[
- 使用DataGridView控件绑定数据后有时需要清空绑定的数据,在清除DataGridView绑定的数据时:1、设置DataSource为
- 本文实例为大家分享了Android调用系统图库获取图片的具体代码,供大家参考,具体内容如下1、开发工具与关键技术:Eclipse、Andro
- 重载:方法名相同,但参数不同的多个同名函数注意:1.参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同2.返回值和异常以及访问修饰符
- 基础配置新建module:cloudalibaba-config-nacos-client3377pom文件版本号已经由父工程控制<?
- 一、使用策略枚举来优化if-else看到网上蛮多人推荐使用策略模式来优化if-else,但我总觉得,搞一堆策略类来优化大批量if-else,
- 本文实例讲述了Android使用AudioManager修改系统音量的方法。分享给大家供大家参考,具体如下:下面介绍几个AudioManag