Android中如何实现摇晃刷新
创始人
2024-12-22 18:41:48
0次

实现方法

为了实现摇晃刷新功能,这里需要使用重力加速器(Accelerometer)。

首先,需要保证在摇晃刷新或者移动手机的时候不会发生误操作,这里需要实现对传感器的控制,保证捕抓到的是用户想要的摇动操作。另外,我们在实现这 个逻辑操作的时候需要和UI的代码分离,建议不要把界面逻辑代码和其它的代码混杂在一起,把它独立出来方便重用。所以首先新建一个ShakeEventManager类,这个类需要对传感器事件进行监听:

public class ShakeEventManager implements SensorEventListener { .. }

为了监听传感器,这里实现了SensorEventListener接口,然后就要操作重力加速度传感器,把我们写的这个类注册成事件监听器:

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

接着实现register()方法:

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

在触发刷新事件的时候,需要对一些条件进行检测,以保证用户是有意在摇动手机:

  • 加速度必须大于某个临界值;

  • 必须出发一些固定的加速传感器事件;

  • 这些事件发生的时间必须在一定的范围内。

这里把这个实现逻辑代码写在onSensorChanged方法里,这个方法在加速器的值有效的时候都会被调用。***步 要计算这个加速度的值。这里还需要知道三个坐标的***加速度值,然后减去重力的值在三个方向上的分量。像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; }

在知道***的加速度值后,这里实现了之前的判断逻辑:

@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();         }     }    }

从代码看,第三行计算了加速度的值然后与一个临界值作对比(第五行)。如果是***次摇动,就保存当前时间,看看在一定的时间内其它的事件有没有触发。如果所有条件都满足了,就会调用接口中的回调方法:

public static interface ShakeListener {     public void onShake(); }

测试App

以上已经实现了摇动事件管理,然后我们需要新建一个简单的App来使用它。只需新建一个带有一个ListView的简单Activity,然后让它摇动的时候可以刷新ListView:

public class MainActivity extends ActionBarActivity implements ShakeEventManager.ShakeListener { ....      @Override     public void onShake() {        // We update the ListView     } }

可以看到,在第五行的时候界面刷新了,因为在用户摇动手机的时候,这个方法已经被调用。

***需要考虑一些问题:在App停止的时候,我们需要注销这个监听器,因为一直监听事件会很费电。另外在App恢复运行的时候,需要再重新注册这个监听器:

Override protected void onResume() {     super.onResume();     sd.register(); }    @Override protected void onPause() {     super.onPause();     sd.deregister(); }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...