1. 程式人生 > >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資料夾下放入你的聲音檔案


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,我們可以呼叫這些音效。(例子就是上面的程式碼了,註釋很詳細)