当前位置: 首页 > 科技观察

Android摇一摇刷新实战教程

时间:2023-03-13 02:17:54 科技观察

在本文中,我们将讨论另一种刷新应用程序的方式,称为“摇一摇刷新”。众所周知,下拉刷新的方式已经被很多APP所采用。只要在屏幕上滑动手指,就可以刷新界面。虽然下拉刷新方式很好用,但我们也可以使用另一种方式来刷新界面,即基于智能手机传感器的摇动刷新。这样就不需要滑动手指,只需要摇动手机就可以刷新界面:实现方法为了实现摇动刷新功能,这里需要用到加速度计(Accelerometer),如果想知道更多关于Accelerometer的使用方法,请看这里首先,您需要确保摇动刷新或移动手机时不会出现误操作。这里需要实现对传感器的控制,保证捕捉到的是用户想要的摇晃操作。另外,在实现这个逻辑操作的时候,我们需要把它和UI代码分开。接口逻辑代码建议不要和其他代码混在一起,分离出来方便复用。所以首先新建一个ShakeEventManager类,需要监听传感器事件:publicclassShakeEventManagerimplementsSensorEventListener{..}为了监听传感器,这里实现了SensorEventListener接口,然后必须要操作重力加速度传感器,注册我们写的类作为事件监听器:publicvoidinit(Contextctx){sManager=(SensorManager)ctx.getSystemService(Context.SENSOR_SERVICE);s=sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);register();}然后实现register()方法:publicvoidregister(){sManager.registerListener(this,s,SensorManager.SENSOR_DELAY_NORMAL);}当触发刷新事件时,需要检查一些条件以确保用户有意摇动手机:加速度必须大于某个特定值临界值;必须触发一些固定的加速度传感器事件;这些事件发生的时间必须在一定范围内。这里,实现逻辑代码写在onSensorChanged方法中,当加速器的值有效时会调用该方法。第一步是计算这个加速度的值。这里还需要知道三个坐标的最大加速度值,然后减去三个方向重力值的分量。Android官方教程文档中有说明,首先进行一层过滤减去重力分量,然后再进行一次坐标分量处理:privatefloatcalcMaxAcceleration(SensorEventevent){gravity[0]=calcGravityForce(event.values[0],0);gravity[1]=calcGravityForce(event.values[1],1);gravity[2]=calcGravityForce(event.values[2],2);floataccX=event.values[0]-gravity[0];floataccY=event.values[1]-gravity[1];floataccZ=event.values[2]-gravity[2];floatmax1=Math.max(accX,accY);returnMath.max(max1,accZ);}看calcGravityForce的方法://LowpassfilterprivatefloatcalcGravityForce(floatcurrentVal,intindex){returnALPHA*gravity[index]+(1-ALPHA)*currentVal;}知道最新的加速度值后,前面的判断逻辑在这里实现:@OverridepublicvoidonSensorChanged(SensorEventsensorEvent){floatmaxAcc=calcMaxAcceleration(sensorEvent);Log.d("SwA","MaxAcc["+maxAcc+"]");if(maxAcc>=MOV_THRESHOLD){if(counter==0){counter++;firstMovTime=System.currentTimeMillis();Log.d("SwA","Firstmov..");}else{longnow=System.currentTimeMillis();if((now-firstMovTime)=MOV_COUNTS)if(listener!=null)listener.onShake();}}}从代码来看,第三行计算加速度值并将其与临界值(第五行)进行比较。如果是第一次摇动,则保存当前时间,看一定时间内是否触发了其他事件。如果满足所有条件,将调用接口中的回调方法:publicstaticinterfaceShakeListener{publicvoidonShake();}测试应用中已经实现了摇动事件管理,接下来我们需要创建一个简单的应用来使用它。新建一个简单的带有ListView的Activity,然后让它在摇动的时候刷新ListView:publicclassMainActivityextendsActionBarActivityimplementsShakeEventManager.ShakeListener{....@OverridepublicvoidonShake(){//WeupdatetheListView}}可以看到界面在第五行刷新了,因为这个方法在用户摇动手机的时候已经被调用了。***需要考虑一些问题:当App停止时,我们需要注销监听器,因为继续监听事件会消耗大量电量。另外,当App恢复运行时,需要重新注册监听器:);}综上,实现了一个抖动刷新功能。