一、原理介绍:
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