Android自定義View實(shí)現(xiàn)打字機(jī)效果
一、先來看看效果演示
二、實(shí)現(xiàn)原理:
這個(gè)其實(shí)不難實(shí)現(xiàn),通過一個(gè)定時(shí)器不斷調(diào)用TextView
的setText
就行了,在setText
的時(shí)候播放打字的音效。
具體代碼如下:
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; /** * 模擬打字機(jī)效果 * * */ 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、在代碼中實(shí)例化:
mTypeTextView = ( TypeTextView )findViewById(R.id.typeTxtId); mTypeTextView.setOnTypeViewListener( new OnTypeViewListener( ) { @Override public void onTypeStart() { print( "onTypeStart" ); } @Override public void onTypeOver() { print( "onTypeOver" ); } });
3、調(diào)用start方法:
mTypeTextView.start( TEST_DATA );
四、總結(jié)
以上就是Android自定義View實(shí)現(xiàn)打字機(jī)效果的全部內(nèi)容,感興趣的快快自己動(dòng)手實(shí)踐起來,希望本文的內(nèi)容對大家開發(fā)Android的時(shí)候能有所幫助,如果有疑問可以留言交流。
相關(guān)文章
在Visual Studio上構(gòu)建C++的GUI框架wxWidgets的開發(fā)環(huán)境
這篇文章主要介紹了Visual Studio上構(gòu)件C++的GUI框架wxWidgets開發(fā)環(huán)境的方法,wxWidgets是一個(gè)跨多個(gè)系統(tǒng)平臺(tái)的圖形化界面開發(fā)框架,并且可用語言不限于C++,需要的朋友可以參考下2016-04-04android之HttpPost&HttpGet使用方法介紹
下文直接講用法,先知道怎么用,再知道怎么回事,具體如下,感興趣的朋友可以參考下哈2013-06-06Android音頻開發(fā)之SurfaceView的使用詳解
這篇文章主要為大家介紹了Android中SurfaceView的使用方法,本文通過簡要的案例,為大家進(jìn)行了詳細(xì)的講解,需要的朋友可以參考一下2022-04-04Android編程中activity啟動(dòng)時(shí)出現(xiàn)白屏、黑屏問題的解決方法
這篇文章主要介紹了Android編程中activity啟動(dòng)時(shí)出現(xiàn)白屏、黑屏問題的解決方法,涉及Android針對activity啟動(dòng)設(shè)置的技巧,需要的朋友可以參考下2015-12-12Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02Android PopupWindow全屏詳細(xì)介紹及實(shí)例代碼
這篇文章主要介紹了 Android PopupWindow全屏詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12如何為RecyclerView添加Header和Footer
這篇文章主要為大家詳細(xì)介紹了如何為RecyclerView添加Header和Footer,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android自定義FloatingActionButton滑動(dòng)行為只隱藏不出現(xiàn)的問題小結(jié)
這篇文章主要介紹了Android自定義FloatingActionButton滑動(dòng)行為只隱藏不出現(xiàn)的問題小結(jié),需要的朋友可以參考下2017-01-01Android關(guān)鍵字persistent詳細(xì)分析
這篇文章主要介紹了Android關(guān)鍵字persistent的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04