成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android搖晃刷新實用教程

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

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

android_pull_to_refresh4

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

adroid_shake_to_refresh4

實現方法

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

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

  1. public class ShakeEventManager implements SensorEventListener { 
  2. .. 

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

  1. public void init(Context ctx) { 
  2.     sManager = (SensorManager)  ctx.getSystemService(Context.SENSOR_SERVICE); 
  3.     s = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
  4.     register(); 

接著實現register()方法:

  1. public void register() { 
  2.     sManager.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL); 

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

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

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

  1. private float calcMaxAcceleration(SensorEvent event) { 
  2.     gravity[0] = calcGravityForce(event.values[0], 0); 
  3.     gravity[1] = calcGravityForce(event.values[1], 1); 
  4.     gravity[2] = calcGravityForce(event.values[2], 2); 
  5.    
  6.     float accX = event.values[0] - gravity[0]; 
  7.     float accY = event.values[1] - gravity[1]; 
  8.     float accZ = event.values[2] - gravity[2]; 
  9.    
  10.     float max1 = Math.max(accX, accY); 
  11.     return Math.max(max1, accZ); 

看看calcGravityForce這個方法:

  1. // Low pass filter 
  2. private float calcGravityForce(float currentVal, int index) { 
  3.     return  ALPHA * gravity[index] + (1 - ALPHA) * currentVal; 

在知道***的加速度值后,這里實現了之前的判斷邏輯:

  1. @Override 
  2. public void onSensorChanged(SensorEvent sensorEvent) { 
  3.     float maxAcc = calcMaxAcceleration(sensorEvent); 
  4.     Log.d("SwA""Max Acc ["+maxAcc+"]"); 
  5.     if (maxAcc >= MOV_THRESHOLD) { 
  6.         if (counter == 0) { 
  7.             counter++; 
  8.             firstMovTime = System.currentTimeMillis(); 
  9.             Log.d("SwA""First mov.."); 
  10.         } else { 
  11.             long now = System.currentTimeMillis(); 
  12.             if ((now - firstMovTime) = MOV_COUNTS) 
  13.                 if (listener != null
  14.                     listener.onShake(); 
  15.         } 
  16.     } 
  17.    

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

  1. public static interface ShakeListener { 
  2.     public void onShake(); 

測試App

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

  1. public class MainActivity extends ActionBarActivity implements ShakeEventManager.ShakeListener { 
  2. .... 
  3.    
  4.   @Override 
  5.     public void onShake() { 
  6.        // We update the ListView 
  7.     } 

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

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

  1. Override 
  2. protected void onResume() { 
  3.     super.onResume(); 
  4.     sd.register(); 
  5.    
  6. @Override 
  7. protected void onPause() { 
  8.     super.onPause(); 
  9.     sd.deregister(); 

綜上所訴,就已經實現了一個搖晃刷新功能。

責任編輯:閆佳明 來源: blog.jobbole
相關推薦

2009-07-03 16:45:25

JSP實用教程

2014-05-07 09:32:02

掃描文檔Linux實用教程

2012-11-14 13:53:11

nginxWeb服務器LEMP系統

2009-12-01 14:14:35

路由器配置

2016-08-01 13:03:39

2025-04-27 08:01:25

2014-02-27 10:27:46

PC遠程維護

2009-10-23 15:18:54

VB.NET實用教程

2016-08-08 10:11:00

網絡安全技術周刊

2009-10-23 15:35:42

VB.NET實用教程

2010-05-24 15:41:47

SVN配置教程

2016-08-15 23:03:09

2010-05-25 13:11:21

SVNClient

2009-06-24 10:58:21

jQuery插件教程

2009-06-19 15:45:08

2009-07-03 14:23:35

JSP實用案例教程

2014-02-19 16:28:53

Node.jsWeb工具

2015-06-18 16:23:09

相機卡數據恢復軟件

2013-04-03 14:58:43

Android學習筆記實用代碼合集

2017-09-30 16:06:28

代碼注解分析
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美白人做受xxxx视频 | 久草在线影 | 99精品一区二区 | 欧美一级黄 | 精品久久久久久久久久久 | 91久久综合亚洲鲁鲁五月天 | 夜夜草视频 | 中文字幕亚洲精品在线观看 | 日韩欧美一区二区三区免费观看 | 亚洲精品国产一区 | 国产999精品久久久 精品三级在线观看 | 欧美日韩精品久久久免费观看 | 国产一区视频在线 | 免费黄篇| 一级看片免费视频囗交动图 | 91精品国产高清一区二区三区 | 精品欧美乱码久久久久久1区2区 | 国产特级毛片 | av黄色在线观看 | 91精品国产一区二区三区 | 亚洲午夜精品在线观看 | 97人人澡人人爽91综合色 | 性生生活大片免费看视频 | 91久久| 久久美国 | 亚洲综合色网 | 精产国产伦理一二三区 | 色久伊人 | 成人在线免费观看 | 亚洲欧美国产一区二区三区 | 91看片网| 亚洲精品乱码久久久久久蜜桃91 | 国产一区中文字幕 | 日韩精品一区二区三区中文字幕 | 黄视频免费观看 | 亚洲一区二区在线播放 | 国产高清在线观看 | 欧美成人免费 | 91精品国产91久久久久久吃药 | 91成人 | 国产精品揄拍一区二区久久国内亚洲精 |