xxxx18一60岁hd中国/日韩女同互慰一区二区/西西人体扒开双腿无遮挡/日韩欧美黄色一级片 - 色护士精品影院www

資源簡介

修復(fù)了Settings中音量設(shè)置的音量條存在回彈、顯示的位置和實(shí)際數(shù)值不一致等問題。

資源截圖

代碼片段和文件信息

/*
?*?Copyright?(C)?2014?The?Android?Open?Source?Project
?*
?*?Licensed?under?the?Apache?License?Version?2.0?(the?“License“);
?*?you?may?not?use?this?file?except?in?compliance?with?the?License.
?*?You?may?obtain?a?copy?of?the?License?at
?*
?*??????http://www.apache.org/licenses/LICENSE-2.0
?*
?*?Unless?required?by?applicable?law?or?agreed?to?in?writing?software
?*?distributed?under?the?License?is?distributed?on?an?“AS?IS“?BASIS
?*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND?either?express?or?implied.
?*?See?the?License?for?the?specific?language?governing?permissions?and
?*?limitations?under?the?License.
?*/

package?android.preference;

import?android.annotation.UnsupportedAppUsage;
import?android.app.NotificationManager;
import?android.content.BroadcastReceiver;
import?android.content.Context;
import?android.content.Intent;
import?android.content.IntentFilter;
import?android.database.ContentObserver;
import?android.media.AudioAttributes;
import?android.media.AudioManager;
import?android.media.Ringtone;
import?android.media.RingtoneManager;
import?android.net.Uri;
import?android.os.Handler;
import?android.os.HandlerThread;
import?android.os.Message;
import?android.preference.VolumePreference.VolumeStore;
import?android.provider.Settings;
import?android.provider.Settings.Global;
import?android.provider.Settings.System;
import?android.service.notification.ZenModeConfig;
import?android.util.Log;
import?android.widget.SeekBar;
import?android.widget.SeekBar.OnSeekBarChangeListener;

import?com.android.internal.annotations.GuardedBy;

/**
?*?這個(gè)類用于供SeekBar設(shè)置音量使用,與SeekBar綁定,可以收一個(gè)使用者傳入的回調(diào)接口SeekBarVolumizer.CallBack。
?*?當(dāng)音量更改時(shí)該類會(huì)開始播放音樂,但是需要注意該類不會(huì)自動(dòng)停止音樂的播放,因此需要該類的使用者在CallBack的onSampleStarting中,自己定義何時(shí)停止音樂播放,停止音樂播放需要調(diào)用該類的stopSample方法
?*?1、當(dāng)進(jìn)度條發(fā)生改變時(shí),SeekBar的回調(diào)會(huì)觸發(fā)CallBack的onProgressChange方法并將SeekBar的最新值更新到mLastProgress中,并構(gòu)建一個(gè)VOLUME_SET通知后臺(tái)線程去將該值存儲(chǔ)到AudioManger中。
?*?2、后臺(tái)線程更新完這個(gè)值后,AudioManager會(huì)發(fā)送一個(gè)廣播通知音量已更改
?*?3、該類注冊(cè)了一個(gè)廣播接收器來監(jiān)聽音量更改事件,當(dāng)音量發(fā)生更改時(shí),該接收器在廣播中取出音量值和音量類型,然后判斷音量類型是否與當(dāng)前類符合,如果符合則使用將當(dāng)前音量更新mLastProgress,并通知Ui線程更新SeekBar
?*
?*?所以問題出現(xiàn)在第3點(diǎn)處,主要問題有兩點(diǎn):
?*???1、mLastProgress這個(gè)變量起了兩個(gè)作用,第一個(gè)記錄最新的SeekBar的值,第二個(gè)是記錄廣播發(fā)過來的值。
?*??????因?yàn)閺V播是滯后于滑動(dòng)的,比如從右向左滑動(dòng),則mLastProgress依次被記錄為7654321,正常情況下最后存入的值為最后一個(gè)1;
?*??????假設(shè)最后當(dāng)該存入1時(shí),因?yàn)閳?zhí)行順序的原因,導(dǎo)致廣播接收器的行為將這個(gè)1修改為了2,那么此時(shí)就會(huì)導(dǎo)致1因?yàn)閬G失無法存入。
?*
?*??????這個(gè)導(dǎo)致了問題進(jìn)度條和實(shí)際音量不相符的現(xiàn)象:即當(dāng)進(jìn)度條滑到0時(shí),沒有靜音;或者當(dāng)進(jìn)度條滑到1時(shí),依然靜音。
?*
?*??????為了實(shí)現(xiàn)最小改動(dòng),該問題擬通過增加一個(gè)mCurrentProgress變量來進(jìn)行處理,即將mLastProgress的作用集中,mLastProgress只負(fù)責(zé)記錄最近的音量大小,即AudioManger發(fā)送過過來的音量大小,
?*??????mCurrentProgress記錄SeekBar的當(dāng)前位置,并將該值存入AudioManger中完成鈴聲設(shè)置。
?*??2、setProgress(int?true)方法,該方法true表示使用動(dòng)畫來實(shí)現(xiàn)SeekBar的值過渡,該動(dòng)畫會(huì)造成onProgressChanged上報(bào)的值與自身實(shí)際位置不符
?*
?*??3、多個(gè)SeekBar同時(shí)滑動(dòng)是因?yàn)锳udioManager發(fā)生錯(cuò)誤導(dǎo)致發(fā)出了多個(gè)不同StreamType類型的廣播,引起了其它進(jìn)度條的更新
?*
?*??????通過直接判斷廣播發(fā)送的StreamType與當(dāng)前實(shí)例的mStreamType是否一致來修復(fù)該問題。
?*?Turns?a?{@link?SeekBar}?into?a?volume?control.
?*?@hide
?*/
public?class?SeekBarVolumizer?implements?OnSeekBarChangeListener?Handler.Callback?{
????pri

評(píng)論

共有 條評(píng)論