摇一摇听歌
public class
MainActivity
extends
AppCompatActivity {
private
TextView
mTvHb
;
private
ObjectAnimator
mObjectAnimator
;
private boolean
isHasYD
;
SensorManagerHelper
sensorHelper
;
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
mTvHb
= (TextView) findViewById(R.id.
tv_hb
);
sensorHelper
=
new
SensorManagerHelper(
this
);
sensorHelper
.setOnShakeListener(
new
SensorManagerHelper.OnShakeListener() {
@Override
public void
onShake() {
// System.out.println("shake");
// Toast.makeText(MainActivity.this, "
摇一摇震动
", Toast.LENGTH_SHORT).show();
if
(!
isHasYD
){
mTvHb
.setText(
"
摇一摇听歌
"
);
mObjectAnimator
= ObjectAnimator.
ofFloat
(
mTvHb
,
"rotation"
,
0
,-
80
,
80
);
mObjectAnimator
.setDuration(
500
);
mObjectAnimator
.setRepeatMode(ObjectAnimator.
REVERSE
);
mObjectAnimator
.setRepeatCount(
3
);
mObjectAnimator
.start();
isHasYD
=
true
;
}
}
});
}
@Override
protected void
onDestroy() {
super
.onDestroy();
sensorHelper
.stop();
}
}
public class
SensorManagerHelper
implements
SensorEventListener {
/**
速度阈值,当摇晃速度达到这值后产生作用
*/
private static final int
SPEED_SHRESHOLD
=
3000
;
/**
两次检测的时间间隔
*/
private static final int
UPTATE_INTERVAL_TIME
=
50
;
private
SensorManager
mSensorManager
;
private
NotificationManager
mManager
;
private
Sensor
mSensor
;
private
Vibrator
mVibrator
;
private
OnShakeListener
mOnShakeListener
;
private
Context
mContext
;
private long
mLastUpdateTime
;
private float
lastX
;
private float
lastY
;
private float
lastZ
;
public
SensorManagerHelper(Context context) {
this
.
mContext
= context;
start();
}
public void
start() {
mSensorManager
= (SensorManager)
mContext
.getSystemService(Context.
SENSOR_SERVICE
);
mManager
= (NotificationManager)
mContext
.getSystemService(Service.
NOTIFICATION_SERVICE
);
mVibrator
= (Vibrator)
mContext
.getSystemService(Context.
VIBRATOR_SERVICE
);
if
(
mSensorManager
!=
null
) {
mSensor
=
mSensorManager
.getDefaultSensor(Sensor.
TYPE_ACCELEROMETER
);
}
if
(
mSensor
!=
null
) {
mSensorManager
.registerListener(
this
,
mSensor
,
SensorManager.
SENSOR_DELAY_GAME
);
}
}
public void
stop() {
mSensorManager
.unregisterListener(
this
);
}
public interface
OnShakeListener {
public void
onShake();
}
public void
setOnShakeListener(OnShakeListener listener) {
mOnShakeListener
= listener;
}
@Override
public void
onAccuracyChanged(Sensor sensor,
int
accuracy) {
}
/***
*
重力感应器感应获得变化数据
*/
@Override
public void
onSensorChanged(SensorEvent event) {
long
currentUpdateTime = System.
currentTimeMillis
();
long
timeInterval = currentUpdateTime -
mLastUpdateTime
;
if
(timeInterval <
UPTATE_INTERVAL_TIME
)
return
;
mLastUpdateTime
= currentUpdateTime;
float
x = event.
values
[
0
];
float
y = event.
values
[
1
];
float
z = event.
values
[
2
];
float
deltaX = x -
lastX
;
float
deltaY = y -
lastY
;
float
deltaZ = z -
lastZ
;
lastX
= x;
lastY
= y;
lastZ
= z;
double
speed = Math.
sqrt
(deltaX * deltaX + deltaY * deltaY + deltaZ
* deltaZ)
/ timeInterval *
10000
;
if
(speed >=
SPEED_SHRESHOLD
) {
// long[] l={200,500,200,500};
// mVibrator.vibrate(l,-1);
Notification.Builder builder =
new
Notification.Builder(
mContext
);
String uriString = Environment.
getExternalStorageDirectory
().toString() +
"/why.mp3"
;
builder.setSound(Uri.
parse
(uriString.toString()));
Notification noti = builder.getNotification();
//17
以后推出的
//Notification noti = builder.build();
mManager
.notify(
1
, noti);
mOnShakeListener
.onShake();
}
}
}
xml布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/tv_hb" android:layout_width="100dp" android:layout_height="200dp" android:layout_centerInParent="true" android:background="#f00" android:gravity="center" android:text="我是红包呦!" android:textColor="#ff0" android:textStyle="bold"/> </RelativeLayout>
在manifests注册:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>