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

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实用教程

2016-08-15 23:03:09

2010-05-24 15:41:47

SVN配置教程

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实用案例教程

2013-04-03 14:58:43

Android学习笔记实用代码合集

2015-04-22 10:57:22

androidSwipeRefres

2015-10-22 10:59:13

ListViewItem刷新

2015-06-18 16:23:09

相机卡数据恢复软件

2014-02-19 16:28:53

Node.jsWeb工具
点赞
收藏

51CTO技术栈公众号