语音播放逐帧动画

</pre><pre name="code" class="html">
定义动画xml
<pre name="code" class="html"><animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >

    <item
        android:drawable="@drawable/bai_one"
        android:duration="500"/>
    <item
        android:drawable="@drawable/bai_two"
        android:duration="500"/>
    <item
        android:drawable="@drawable/bai_three"
        android:duration="500"/>

</animation-list>


 
</pre><pre code_snippet_id="536555" snippet_file_name="blog_20141129_17_8981203" name="code" class="java">
自定义语音播放类
public class RemarkPlayer implements OnCompletionListener {
	/** 播放动画的图片 */
	private ImageView playerView;
	/** 语音播放对象 */
	private MediaPlayer remarkPlayer;
	/** 语音播放的位置 */
	private int playerIndex = 0;
	private AnimationDrawable animationDrawable;


	public MediaPlayer getRemarkPlayer() {
		if (remarkPlayer == null)
			remarkPlayer = new MediaPlayer();
		return remarkPlayer;
	}


	/**
	 * 为mediaplayer设置路径准备播放
	 */
	public void initRemarkPlayer(Context context, String url)
			throws IllegalArgumentException, IllegalStateException, IOException {
		if (remarkPlayer != null) {
			// remarkPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			Uri uri = Uri.parse(url);
			remarkPlayer.reset();
			remarkPlayer.setDataSource(context, uri);
			remarkPlayer.prepare();
		}
	}


	/**
	 * 将要播放动画的图片传进来
	 */
	public void setAnimView(ImageView playerView) {
		// TODO Auto-generated method stub
		if (playerView != null) {
			this.playerView = playerView;
		}
		if (remarkPlayer != null) {
			remarkPlayer.setOnCompletionListener(this);
		}
	}


	/**
	 * 开始播放音频
	 */
	public void start() {
		if (remarkPlayer != null) {
			if (!remarkPlayer.isPlaying()) {
				if (playerIndex > 0) {
					// 当语音播放暂停过以后,继续播放时,动画的播放时间会比语音结束的时间长,seeTO之后,可以保持一致
					remarkPlayer.seekTo(playerIndex);
				}
				remarkPlayer.start();
				if (playerView != null) {
					// 为动画图片设置写好的动画xml,得到AnimationDrawable对象后,调用AnimationDrawable对象的start方法开始播放动画
					playerView.setImageResource(R.anim.voice_player_anim);
					animationDrawable = (AnimationDrawable) playerView
							.getDrawable();
					animationDrawable.start();
				}
			} else {
				// 语音暂停时,先关掉动画,继续播放时再开始
				remarkPlayer.pause();
				playerIndex = remarkPlayer.getCurrentPosition();
				if (playerView != null) {
					animationDrawable.stop();
					// playerView.setImageResource(R.drawable.lu_three);
				}
			}
		}
	}


	public void pause() {
		if (remarkPlayer != null) {
			if (remarkPlayer.isPlaying()) {
				remarkPlayer.stop();
				playerIndex = 0;
				if (playerView != null) {
					animationDrawable.stop();
					// playerView.setImageResource(R.drawable.lu_three);
				}
			}
		}
	}


	public void destroy() {
		if (remarkPlayer != null) {
			if (remarkPlayer.isPlaying()) {
				remarkPlayer.stop();
				if (playerView != null) {
					animationDrawable.stop();
					playerIndex = 0;
					playerView.setImageResource(R.drawable.lu_three);
				}
			}
			remarkPlayer.release();
		}
	}


	@Override
	public void onCompletion(MediaPlayer mp) {
		// TODO Auto-generated method stub
		// 监听语音播放完毕,关闭语音,结束动画。
		// 当语音暂停后,继续播放时,结束时间会重新开始记时,所以实际结束时间会比语音播放时间长,导致当语音结束时,动画还在播放
		if (playerView != null) {
			animationDrawable.stop();
			playerIndex = 0;
			playerView.setImageResource(R.drawable.lu_three);
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutte中可以使用Flutter动画库来创建聊天语音播放动画。在Flutter中,动画可以通过使用AnimationController和Tween来实现。 首先,需要创建一个AnimationController对象来控制动画的进度。可以设置动画的持续时间和一个曲线来定义动画的速度曲线。然后,可以使用Tween来定义动画的初始值和结束值。 在聊天语音播放动画中,可以将AnimationController对象与某个按钮或触发器关联起来,以便在触发器被点击或滑动时开始动画。可以使用addStatusListener来监听动画的状态改变,例如动画开始、结束或循环等。 在动画开始时,可以通过调用AnimationController的forward方法来启动动画。然后,在动画的每一中,可以使用Tween的animate方法来根据动画的进度值获取当前的属性值。可以使用AnimatedBuilder小部件来包裹需要应用动画的相关小部件,并在builder回调中更新这些小部件的属性。 在聊天语音播放动画中,可以使用AnimatedContainer来实现音量动画效果,通过设置container的高度或宽度的变化来表示音量的大小。也可以结合使用AnimatedOpacity来实现透明度的变化效果,以模拟语音播放的动态效果。 最后,在动画播放结束时,可以使用AnimationController的reverse方法来反向播放动画,或者使用reset方法来复位动画的进度。 综上所述,通过使用Flutter动画库中的AnimationController、Tween和相关小部件,可以实现聊天语音播放动画,给用户带来更加生动和交互性的体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值