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

被折叠的 条评论
为什么被折叠?



