前言

在做splash界面的时候,需要做类似于打字机打字的效果,字一个一个地蹦出来,显示每一个字都带有打字的声音。

效果演示

本例自定义View的演示效果如下(PS:一直不知道在Android上怎么录制gif格式的动画,索性在PC上跑Genymotion Android模拟器,然后用LICEcap录屏就可以了。)。

实现原理:

这个其实不难实现,通过一个定时器不断调用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( );

}

}

使用说明:

在xml文件中定义:

android:id="@+id/typeTxtId"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_centerVertical="true" />

在代码中实例化:

mTypeTextView = ( TypeTextView )findViewById(R.id.typeTxtId);

mTypeTextView.setOnTypeViewListener( new OnTypeViewListener( ) {

@Override

public void onTypeStart() {

print( "onTypeStart" );

}

@Override

public void onTypeOver() {

print( "onTypeOver" );

}

});

调用start方法:

mTypeTextView.start( TEST_DATA );

下载地址

我将这个demo上传到github了,可以在这里下载,随便改。TypeTextView

java图形打字机_Android模仿打字机效果的自定义View实现相关推荐

  1. Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)

    概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...

  2. android 自定义view 动画效果,Android自定义view实现阻尼效果的加载动画

    效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又 ...

  3. android 气泡.9,Android 三种方式实现三角形气泡效果、自定义View、shape、点9图

    背景 这期需求中,项目需要这样一个情况,就是二级菜单上面有个三角形 乍一看,用个图片就可以解决,一个线性布局.垂直摆下去,所以一开始我是这样尝试的,后来发现美工给我切的图很不合适,不同手机显示效果也不 ...

  4. android下雨动画效果,Android 自定义View(二) 下雨效果

    Rain.gif Android 自定义View(二) 下雨效果 一 实现思路, 雨点用线段表示,通过控制线段的大小和宽度来表示不同的线段. 一个雨点下雨的过程可以表示为一条直线,一次雨点在下雨的过程 ...

  5. 仿海报工厂效果的自定义View

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 近期做了一个自定义View,效果有些类似海报工厂,先看下效果图: 就是一个背景图,中间挖了若干个形状不同的"洞" ...

  6. 仿海报工厂效果的自定义View(在图片上输入文字)

    下面这个view来自"易水南风",我在其代码上加入了文字的输入 下载地址 https://github.com/yxkrrhx/PotserView 近期做了一个自定义View,效 ...

  7. 一个仿沙漏效果的自定义view(贝瑟尔曲线实现)

    HourglassView 这是一个仿沙漏的自定义view效果 效果图 (ps:gif有点卡) 使用方式: 项目build.gradle添加依赖 dependencies {compile 'com. ...

  8. android 自定义加载动画效果,Android 自定义View修炼-自定义加载进度动画LoadingImageView...

    一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. ...

  9. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

最新文章

  1. 智源大会“人工智能伦理、治理与可持续发展论坛”超5000人线上参会,专家敦促全球多边协作...
  2. java简单线程池实例代码
  3. comsol固体传热_【 COMSOL 知识库】如何解决 COMSOL 软件“内存不足” 的问题
  4. python 字符串不区分大小写_还在吐槽文本字符串难以处理,Python的这个绝活你还不知道
  5. jupyter kernel_如何在Jupyter笔记本中运行Scala和Spark
  6. EHS法律法规的收集渠道
  7. 计算机出现故障的种种现象,【维修狮】主板常见的几种故障现象和引起故障的原因...
  8. Svn内外网切换技巧
  9. android 电容屏(一):电容屏基本原理篇
  10. [趣谈网络协议学习] 07 ICMP与ping:投石问路的侦察兵
  11. 机器学习实战之朴素贝叶斯与垃圾邮件分类
  12. 2021-10-11
  13. DHT11温湿度传感器——基于arduino
  14. JDK9-G1 -XX:ParallelGCThreads 默认选择源码解析
  15. 【前端22_混合开发】介绍、初步认识MUI、UI组件、窗口管理
  16. 香港电影金像奖23年全面回顾
  17. 网传国内互联网梯队划分,网友坐不住了!
  18. 最近Oracle Cloud甲骨文上线了免费云套餐.
  19. 2021 电子科技大学 组合数学试卷 (卢光辉、戴波 )
  20. 2022年-年度规划-个人家庭篇

热门文章

  1. 052试题 86 - crosscheck 命令及expried
  2. zabbix部署+grafana7.2采集数据(时下新版)
  3. 常见的字符编码(ASCII码,unicode,utf-8,gbk)
  4. 【程序设计赛】华为 · 厦门开发者创新应用赛 #鸿蒙应用开发 #¥32,000
  5. Kibana 7.13.2 启动时报错 TaskManager is unable to start as there the Kibana UUID is invalid
  6. 研究生放假因疫情未按时返回,扣助研补贴!实验室奇葩规定引热议
  7. 电流反馈和电压反馈的判断
  8. 1、Java好的书籍
  9. markdown编辑器的基本使用
  10. imx6ul双网口(LAN8720A)