Android开发---摇一摇功能

以前做的一个小应用里面有摇一摇功能,有必要写下来做个笔记。

摇一摇功能主要用到加速度传感器Sensor.TYPE_ACCELEROMETER

摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件


一、简单的一个示例

下给出一段简单的实现代码:

功能:原先textview1显示为“初始文本”, 当摇晃之后,textview1变为”摇一摇成功!!!“并伴随震动(点击按钮可回到”初始文本“)。

public class SensorTestActivity extends Activity implements SensorEventListener  
{  
    TextView tv = null;  
    Button button = null;  
    SensorManager sensorManager = null;  
    Vibrator vibrator = null;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
  
        button = (Button) findViewById(R.id.button1);  
        tv = (TextView) findViewById(R.id.textview1);  
        button.setOnClickListener(new View.OnClickListener()  
        {  
  
            @Override  
            public void onClick(View v)  
            {  
                tv.setText("初始文本");  
            }  
        });  
  
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
        vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);  
  
    }  
  
    @Override  
    protected void onPause()  
    {  
        super.onPause();  
        sensorManager.unregisterListener(this);  
    }  
  
    @Override  
    protected void onResume()  
    {  
        super.onResume();  
        sensorManager.registerListener(this,  
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
                SensorManager.SENSOR_DELAY_NORMAL);  
    }  
  
    @Override  
    public void onAccuracyChanged(Sensor sensor, int accuracy)  
    {  
        //当传感器精度改变时回调该方法,Do nothing.  
    }  
  
    @Override  
    public void onSensorChanged(SensorEvent event)  
    {  
  
        int sensorType = event.sensor.getType();  
        //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
        float[] values = event.values;  
        if (sensorType == Sensor.TYPE_ACCELEROMETER)  
        {  
            if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math  
                    .abs(values[2]) > 17))  
            {  
                Log.d("sensor x ", "============ values[0] = " + values[0]);  
                Log.d("sensor y ", "============ values[1] = " + values[1]);  
                Log.d("sensor z ", "============ values[2] = " + values[2]);  
                tv.setText("摇一摇成功!!!");  
                //摇动手机后,再伴随震动提示~~  
                vibrator.vibrate(500);  
            }  
  
        }  
    }  
  
}  


二、更加灵活一点的写法

可以将监听部分注册部分分开,这样的好处就是实现监听的代码复用

以下贴几段以前的几段代码。

1. 监听部分

public class ShakeListenerUtils implements SensorEventListener  
{  
    private Activity context;  
  
    public ShakeListenerUtils(Activity context)  
    {  
        super();  
        this.context = context;  
    }  
  
    @Override  
    public void onSensorChanged(SensorEvent event)  
    {  
        int sensorType = event.sensor.getType();  
        //values[0]:X轴,values[1]:Y轴,values[2]:Z轴    
        float[] values = event.values;  
  
        if (sensorType == Sensor.TYPE_ACCELEROMETER)  
        {  
  
            /*正常情况下,任意轴数值最大就在9.8~10之间,只有在突然摇动手机  
              的时候,瞬时加速度才会突然增大或减少。   监听任一轴的加速度大于17即可 
            */  
            if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math  
                    .abs(values[2]) > 17))  
            {  
                context.overridePendingTransition(R.anim.zoom_out_enter,  
                        R.anim.zoom_out_exit);  
                //检测到晃动后启动OpenDoor效果  
                Intent intent = new Intent(context, OpenDoorActivity.class);  
                context.startActivity(intent);  
                context.finish();  
            }  
        }  
    }  
  
    @Override  
    public void onAccuracyChanged(Sensor sensor, int accuracy)  
    {  
        //当传感器精度改变时回调该方法,Do nothing.   
    }  
  
}





2. 注册部分

public class ShakeILikeActivity extends Activity  
{  
  
    private ShakeListenerUtils shakeUtils;  
    private SensorManager mSensorManager; //定义sensor管理器, 注册监听器用  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_shake_i_like);  
  
        shakeUtils = new ShakeListenerUtils(this);  
    }  
  
    @Override  
    protected void onResume()  
    {  
        super.onResume();  
  
        //获取传感器管理服务   
        mSensorManager = (SensorManager) this  
                .getSystemService(Service.SENSOR_SERVICE);  
        //加速度传感器    
        mSensorManager.registerListener(shakeUtils,  
                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
                //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,    
                //根据不同应用,需要的反应速率不同,具体根据实际情况设定    
                SensorManager.SENSOR_DELAY_NORMAL);  
    }  
  
    @Override  
    protected void onPause()  
    {  
        mSensorManager.unregisterListener(shakeUtils);  
        this.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);//回退时闪一下  
        super.onPause();  
    }  
  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值