欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

Android搖晃刷新實用教程

2015-05-11 14:46:35 1731瀏覽


    這篇文章我們就來探討另一種App刷新的方式,就叫搖晃刷新吧。眾所周知,下拉刷新方式已經(jīng)有很多App在用了,只要手指在屏幕上滑動,就可以刷新界面了。




    盡管下拉刷新方式很實用,不過我們還可以使用別的方式來刷新界面,也就是基于智能手機傳感器的搖晃刷新。這樣就不用滑動手指,只要搖晃手機就可以刷新界面:

實現(xiàn)方法

    為了實現(xiàn)搖晃刷新功能,這里需要使用重力加速器(Accelerometer),若需要了解更多關(guān)于怎么使用重力加速器的方式請看這里

    首先,需要保證在搖晃刷新或者移動手機的時候不會發(fā)生誤操作,這里需要實現(xiàn)對傳感器的控制,保證捕抓到的是用戶想要的搖動操作。另外,我們在實現(xiàn)這個邏輯操作的時候需要和UI的代碼分離,建議不要把界面邏輯代碼和其它的代碼混雜在一起,把它獨立出來方便重用。所以首先新建一個ShakeEventManager類,這個類需要對傳感器事件進行監(jiān)聽:

public class ShakeEventManager implements SensorEventListener {

..

}

    為了監(jiān)聽傳感器,這里實現(xiàn)了SensorEventListener接口,然后就要操作重力加速度傳感器,把我們寫的這個類注冊成事件監(jiān)聽器:


public void init(Context ctx) {

sManager = (SensorManager) ctx.getSystemService(Context.SENSOR_SERVICE);

s = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

register();

}

接著實現(xiàn)register()方法:

public void register() {

sManager.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL);

}

在觸發(fā)刷新事件的時候,需要對一些條件進行檢測,以保證用戶是有意在搖動手機:

  • 加速度必須大于某個臨界值;
  • 必須出發(fā)一些固定的加速傳感器事件;
  • 這些事件發(fā)生的時間必須在一定的范圍內(nèi)。

    這里把這個實現(xiàn)邏輯代碼寫在onSensorChanged方法里,這個方法在加速器的值有效的時候都會被調(diào)用。第一步要計算這個加速度的值。這里還需要知道三個坐標的最大加速度值,然后減去重力的值在三個方向上的分量。像Android官方教程文檔中說明的那樣,首先進行一層過濾,把重力的分量減掉,然后在進行另外的坐標分量處理:

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這個方法:

// Low pass filter

private float calcGravityForce(float currentVal, int index) {

return ALPHA * gravity[index] + (1 - ALPHA) * currentVal;

}

在知道最大的加速度值后,這里實現(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();

}

}

}

    從代碼看,第三行計算了加速度的值然后與一個臨界值作對比(第五行)。如果是第一次搖動,就保存當前時間,看看在一定的時間內(nèi)其它的事件有沒有觸發(fā)。如果所有條件都滿足了,就會調(diào)用接口中的回調(diào)方法:

public static interface ShakeListener {

public void onShake();

}

測試App

    以上已經(jīng)實現(xiàn)了搖動事件管理,然后我們需要新建一個簡單的App來使用它。只需新建一個帶有一個ListView的簡單Activity,然后讓它搖動的時候可以刷新ListView


public class MainActivity extends ActionBarActivity implements ShakeEventManager.ShakeListener {

....

@Override

public void onShake() {

// We update the ListView

}

}

    可以看到,在第五行的時候界面刷新了,因為在用戶搖動手機的時候,這個方法已經(jīng)被調(diào)用。

    最后需要考慮一些問題:在App停止的時候,我們需要注銷這個監(jiān)聽器,因為一直監(jiān)聽事件會很費電。另外在App恢復運行的時候,需要再重新注冊這個監(jiān)聽器:

Override

protected void onResume() {

super.onResume();

sd.register();

}

@Override

protected void onPause() {

super.onPause();

sd.deregister();

}

    綜上所訴,就已經(jīng)實現(xiàn)了一個搖晃刷新功能。

標簽:

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部