android中相仿 QQ震动窗口的实现,带声音和振动效果

android中类似 QQ震动窗口的实现,带声音和振动效果

效果就是如标题。好了,直接上代码

其实手机上看着的振动效果就是1个  animation

首先写1个 Interpolator  -  定义一个动画的变化率(the rate of change)这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。(不理解的可以看下面的解释)

cycleinter.xml

<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
android:cycles="10" />


下来就是左右 和 上下一起动:shake.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
	android:fromXDelta="0" android:toXDelta="5" 
	android:fromYDelta="5" android:toYDelta="0" 
	android:duration="1000" 
	android:interpolator="@anim/cycleinter" />

如果只想1种动:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromYDelta="0"
    android:interpolator="@anim/cycleinter"
    android:toYDelta="3" />

这样基本上就完成了动的效果

代码中直接:

Animation shakeAnimation = AnimationUtils.loadAnimation(this, R.anim.shake_xy);
	view.startAnimation(shakeAnimation);


现在再在震动效果的同时 加上 手机震动和 QQ声音提示:

1.在 raw文件夹下放入你的声音文件

android中相仿 QQ震动窗口的实现,带声音和振动效果

2. 代码

	SoundPool  soundPool
		soundPool = new SoundPool(10 , AudioManager.STREAM_SYSTEM , 5);//1 最多同时放出的声音数,2声音类型,3声音质量越高越耗费资源
		soundPool.load(this, R.raw.aa ,1);//context id 级别
		

   
	public void soundPlay(){
		//第1个参数 ID(放入 soundpool的顺序 第一个放入)
		//2,3 左声道 右声道的控制量
		//4 优先级
		//5 是否循环     0 - 不循环    -1 -  循环
		//6 播放比例     0.5-2 一般为1 表示正常播放
 		soundPool.play(1, 1, 1, 1, 0, 1);
	}

	public void zhendong(){
		//别忘记震动权限
		Vibrator  vibrator = (Vibrator)this.getSystemService(VIBRATOR_SERVICE);
		long[] pattern = {50 ,400 ,50 , 400};    //停止 开始  停止 开启
	    vibrator.vibrate(pattern, -1);            //不重复设置为1 -1
		
	}


Interpolator :

Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下:

AccelerateDecelerateInterpolator                    在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
AccelerateInterpolator                              在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator                                   动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator                              在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator                                  在动画的以均匀的速率改变
对于 LinearInterpolator ,                          变化率是个常数,即 f (x) = x.
public float getInterpolation(float input) {
return input;
}
Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator 子类,实现抛物线、*落体等物理效果。

SoundPool:

android的音频播放对播放行为的控制非常熟悉的方法:start()、stop()和pause()。

可以获得一个新创建的MediaPlayer对象。

在播放过程中,有几个可以监听播放过程的监听器,如:

setOnCompletionListener(MediaPlayer.OnCompletionListener listener),监听音频播放结束;

setOnErrorListener(MediaPlayer.OnErrorListener listener),监听播放过程中的错误事件;

setOnPreparedListener(MediaPlayer.OnPreparedListener listener),当prepare()被调用时触发。

然而,使用MediaPlayer播放时,也有一些问题。我们知道MediaPlayer在创建和销毁时都会耗费大量的系统资源,且创建和销毁的时间相对较长。此外,如果我们需要在同一时刻播放很多声音,MediaPlayer是不支持的。

因此,Android提供了另外一种,叫做SoundPool,它适合播放那些需要反复播放,但时间较短的音效。它支持同时播放多种声音,这些声音在系统开始时会加载到列表中,按照这些声音的id,我们可以调用这些音效。(例子就是上面的代码了,注释很详细)