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資料夾下放入你的聲音檔案
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,我們可以呼叫這些音效。(例子就是上面的程式碼了,註釋很詳細)