這篇“Android中如何實(shí)現(xiàn)搖晃刷新”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Android中如何實(shí)現(xiàn)搖晃刷新”文章吧。
創(chuàng)新互聯(lián)公司業(yè)務(wù)包括:成品網(wǎng)站、企業(yè)產(chǎn)品展示型網(wǎng)站建設(shè)、品牌網(wǎng)站制作、電子商務(wù)型網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)(多語(yǔ)言)、商城網(wǎng)站建設(shè)、按需求定制開(kāi)發(fā)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)等。效率優(yōu)先,品質(zhì)保證,用心服務(wù)是我們的核心價(jià)值觀,我們將繼續(xù)以良好的信譽(yù)為基礎(chǔ),秉承穩(wěn)固與發(fā)展、求實(shí)與創(chuàng)新的精神,為客戶提供更全面、更優(yōu)質(zhì)的互聯(lián)網(wǎng)服務(wù)!
實(shí)現(xiàn)方法
為了實(shí)現(xiàn)搖晃刷新功能,這里需要使用重力加速器(Accelerometer)。
首先,需要保證在搖晃刷新或者移動(dòng)手機(jī)的時(shí)候不會(huì)發(fā)生誤操作,這里需要實(shí)現(xiàn)對(duì)傳感器的控制,保證捕抓到的是用戶想要的搖動(dòng)操作。另外,我們?cè)趯?shí)現(xiàn)這 個(gè)邏輯操作的時(shí)候需要和UI的代碼分離,建議不要把界面邏輯代碼和其它的代碼混雜在一起,把它獨(dú)立出來(lái)方便重用。所以首先新建一個(gè)ShakeEventManager類(lèi),這個(gè)類(lèi)需要對(duì)傳感器事件進(jìn)行監(jiān)聽(tīng):
public class ShakeEventManager implements SensorEventListener { .. }
為了監(jiān)聽(tīng)傳感器,這里實(shí)現(xiàn)了SensorEventListener接口,然后就要操作重力加速度傳感器,把我們寫(xiě)的這個(gè)類(lèi)注冊(cè)成事件監(jiān)聽(tīng)器:
public void init(Context ctx) { sManager = (SensorManager) ctx.getSystemService(Context.SENSOR_SERVICE); s = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); register(); }
接著實(shí)現(xiàn)register()方法:
public void register() { sManager.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL); }
在觸發(fā)刷新事件的時(shí)候,需要對(duì)一些條件進(jìn)行檢測(cè),以保證用戶是有意在搖動(dòng)手機(jī):
加速度必須大于某個(gè)臨界值;
必須出發(fā)一些固定的加速傳感器事件;
這些事件發(fā)生的時(shí)間必須在一定的范圍內(nèi)。
這里把這個(gè)實(shí)現(xiàn)邏輯代碼寫(xiě)在onSensorChanged方法里,這個(gè)方法在加速器的值有效的時(shí)候都會(huì)被調(diào)用。***步 要計(jì)算這個(gè)加速度的值。這里還需要知道三個(gè)坐標(biāo)的***加速度值,然后減去重力的值在三個(gè)方向上的分量。像Android官方教程文檔中說(shuō)明的那樣,首先進(jìn) 行一層過(guò)濾,把重力的分量減掉,然后在進(jìn)行另外的坐標(biāo)分量處理:
private float calcMaxAcceleration(SensorEvent event) { gravity[0] = calcGravityForce(event.values[0], 0); gravity[1] = calcGravityForce(event.values[1], 1); gravity[2] = calcGravityForce(event.values[2], 2); float accX = event.values[0] - gravity[0]; float accY = event.values[1] - gravity[1]; float accZ = event.values[2] - gravity[2]; float max1 = Math.max(accX, accY); return Math.max(max1, accZ); }
看看calcGravityForce這個(gè)方法:
// Low pass filter private float calcGravityForce(float currentVal, int index) { return ALPHA * gravity[index] + (1 - ALPHA) * currentVal; }
在知道***的加速度值后,這里實(shí)現(xiàn)了之前的判斷邏輯:
@Override public void onSensorChanged(SensorEvent sensorEvent) { float maxAcc = calcMaxAcceleration(sensorEvent); Log.d("SwA", "Max Acc ["+maxAcc+"]"); if (maxAcc >= MOV_THRESHOLD) { if (counter == 0) { counter++; firstMovTime = System.currentTimeMillis(); Log.d("SwA", "First mov.."); } else { long now = System.currentTimeMillis(); if ((now - firstMovTime) = MOV_COUNTS) if (listener != null) listener.onShake(); } } }
從代碼看,第三行計(jì)算了加速度的值然后與一個(gè)臨界值作對(duì)比(第五行)。如果是***次搖動(dòng),就保存當(dāng)前時(shí)間,看看在一定的時(shí)間內(nèi)其它的事件有沒(méi)有觸發(fā)。如果所有條件都滿足了,就會(huì)調(diào)用接口中的回調(diào)方法:
public static interface ShakeListener { public void onShake(); }
以上已經(jīng)實(shí)現(xiàn)了搖動(dòng)事件管理,然后我們需要新建一個(gè)簡(jiǎn)單的App來(lái)使用它。只需新建一個(gè)帶有一個(gè)ListView的簡(jiǎn)單Activity,然后讓它搖動(dòng)的時(shí)候可以刷新ListView:
public class MainActivity extends ActionBarActivity implements ShakeEventManager.ShakeListener { .... @Override public void onShake() { // We update the ListView } }
可以看到,在第五行的時(shí)候界面刷新了,因?yàn)樵谟脩魮u動(dòng)手機(jī)的時(shí)候,這個(gè)方法已經(jīng)被調(diào)用。
***需要考慮一些問(wèn)題:在App停止的時(shí)候,我們需要注銷(xiāo)這個(gè)監(jiān)聽(tīng)器,因?yàn)橐恢北O(jiān)聽(tīng)事件會(huì)很費(fèi)電。另外在App恢復(fù)運(yùn)行的時(shí)候,需要再重新注冊(cè)這個(gè)監(jiān)聽(tīng)器:
Override protected void onResume() { super.onResume(); sd.register(); } @Override protected void onPause() { super.onPause(); sd.deregister(); }
以上就是關(guān)于“Android中如何實(shí)現(xiàn)搖晃刷新”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享標(biāo)題:Android中如何實(shí)現(xiàn)搖晃刷新
鏈接分享:http://jinyejixie.com/article22/psihjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)