Android加速度传感器的使用:摇一摇功能的实现

本文详细介绍了一种在Android应用中实现摇一摇功能的方法。通过使用加速度传感器监测手机晃动,当加速度达到预设阈值时触发特定操作。文章提供了ShakeUtils类的完整代码示例,并展示了如何在实际活动中集成该功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原理介绍:

Android手机中摇一摇的功能已经很常见了,最近接触到了这个功能,原理很简单:使用加速度传感器,在晃动手机时,监听加速度在各个方向的变化,当加速度值超过设定的灵敏度时,则触发摇一摇功能。


二、使用到的类:

SensorManager

SensorEventListener


三、功能实现:

1、摇一摇功能:我将摇一摇功能封装成了一个类ShakeUtils,在使用时按照注释中的说明使用即可,ShakeUtils.java如下(差的包请CTRL+SHIFT+O导入):

/**
 * 摇一摇工具类
 * 使用说明:
 * private ShakeUtils mShakeUtils = null;
 * 1、在需要使用摇一摇功能的Activity实例化该工具类并设置摇一摇监听:
 * mShakeUtils = new ShakeUtils( this );
 * mShakeUtils.setOnShakeListener(new OnShakeListener{
 *      public void onShake(){
 *          // 此处为摇一摇触发后的操作
 *      }
 * });
 *
 * 2、分别在Activity的onResume和onPause方法中调用该工具类的onResume和onPause方法:
 * mShakeUtils.onResume();
 * mShakeUtils.onPause();
 * */
public class ShakeUtils implements SensorEventListener {
    public ShakeUtils( Context context ){
        mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 
    }
     
    public void setOnShakeListener( OnShakeListener onShakeListener ){
        mOnShakeListener = onShakeListener;
    }
     
    public void onResume(){
        mSensorManager.registerListener(this
                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
                SensorManager.SENSOR_DELAY_NORMAL);
    }
     
    public void onPause(){
        mSensorManager.unregisterListener(this);
    }
     
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
         
    }
 
    @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]) > SENSOR_VALUE || Math.abs(values[1]) > SENSOR_VALUE || Math.abs(values[2]) > SENSOR_VALUE)){
                System.out.println("sensor value == " + " " + values[ 0 ] + " " + values[ 1 ] + " " +  values[ 2 ] );
                if( null != mOnShakeListener ){
                    mOnShakeListener.onShake( );
                }
            
        
    }
     
    public interface OnShakeListener{
        public void onShake();
    }
     
    private SensorManager mSensorManager = null;
    private OnShakeListener mOnShakeListener = null;
    private static final int SENSOR_VALUE = 14;
}

2、BaseActivity:为了方便程序扩展,为所有的Activity写了一个基类:

public abstract class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }
     
    private void init(){
        setContentView( );
        findViews( );
        getData( );
        showContent( );
    }
     
    public abstract void setContentView();
    public abstract void findViews();
    public abstract void getData();
    public abstract void showContent();
}
3、ShakeBeautyActivity:ShakeUtils的具体使用:

public class ShakeBeautyActivity extends BaseActivity {
    @Override
    public void setContentView() {
        setContentView( R.layout.activity_shake_beauty_layout );
    }
 
    @Override
    public void findViews() {
        mShakeImageView = ( ImageView )findViewById( R.id.shakeImgId );
        initShakeUtils( );
    }
 
    @Override
    public void getData() {
         
    }
 
    @Override
    public void showContent() {
         
    }
     
    @Override
    protected void onResume() {
        super.onResume();
        mShakeUtils.onResume( );
    }
     
    @Override
    protected void onPause() {
        super.onPause();
        mShakeUtils.onPause( );
    }
     
    private void initShakeUtils(){
        mShakeUtils = new ShakeUtils( this );
        mShakeUtils.setOnShakeListener( new OnShakeListener( ) {
            @Override
            public void onShake() {
                setShakeImage( );
            }
        });
    }
     
    private void setShakeImage( ){
        Random random = new Random( );
        mShakeImageView.setBackgroundResource( mBeautys[ ( Math.abs(random.nextInt( ) ) )%mBeautys.length ] );
    }
     
    private ImageView mShakeImageView = null;
    private ShakeUtils mShakeUtils = null;
    private static final int[] mBeautys = new int[]{
         R.drawable.beauty_01
        ,R.drawable.beauty_02
        ,R.drawable.beauty_03
        ,R.drawable.beauty_04
        ,R.drawable.beauty_05
        ,R.drawable.beauty_06
        ,R.drawable.beauty_07
        ,R.drawable.beauty_08
        ,R.drawable.beauty_09
    };
}

源地址:http://www.2cto.com/kf/201409/332526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值