效果就是如标题。好了,直接上代码
其实手机上看着的振动效果就是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" />
<?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文件夹下放入你的声音文件
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,我们可以调用这些音效。(例子就是上面的代码了,注释很详细)