微信摇一摇,抖音摇一摇面对面摇骰子等,手机APP摇一摇功能随处可见,下面我们来实现一个简单的摇一摇功能。
基本原理
- 利用加速度传感器检测设备的物理运动
- 监听传感器的数据用作摇一摇动作判定
- 根据设定的条件触发摇一摇事件
常见应用场景:
- 「音乐和视频控制」:许多音乐和视频应用利用摇一摇功能来控制播放、暂停、下一曲等操作。用户只需摇动手机,即可实现快速切换歌曲或视频的功能。
- 「拍照」:一些相机应用使用摇一摇功能来快速拍照或切换前后摄像头。通过摇动手机,用户可以快速完成拍照过程,无需多余的操作步骤。
- 「启动应用或功能」:摇一摇功能也可以用于启动特定的应用或功能。例如,健康追踪应用可能允许用户通过摇动手机来快速查看计步器或运动数据。
- 「游戏控制」:在某些游戏中,摇一摇功能可以作为游戏控制方式之一。玩家可以通过摇动手机来控制角色的移动或执行特定动作,提供更直观的控制方式。
- 「社交分享」:一些社交应用利用摇一摇功能来快速分享内容到其他平台。用户只需摇动手机,即可将内容自动分享到指定的社交媒体平台。
- 「触发紧急通知」:在某些紧急情况下,摇一摇功能可以作为一种快速提醒方式。例如,在遇到危险或紧急状况时,用户可以快速摇动手机来触发警报或发送求救信号。
代码示例
「实现效果」:在1.5s内出现两次加速度达到15则触发摇一摇
class ShakeManager : SensorEventListener {
private var mContext: Context
/**
* 时间范围
*/
private var mIntervalTimeMillis: Long = 15000
/**
* 要换次数阈值
*/
private var mThresholdCount: Int = 2
/**
* 加速度阈值
*/
private var mShakeThreshold: Int = 15
private var mSensorManager: SensorManager? = null
private var mVibrator: Vibrator? = null
private var mOnShakeListener: OnShakeListener? = null
/**
* 上一次摇晃时间
*/
private var mLastShakeTimeMillis: Long = 0
/**
* 摇晃次数
*/
private var mShakeCount = 0
constructor(
context: Context,
intervalTimeMillis: Long,
thresholdCount: Int,
shakeThreshold: Int,
onShakeListener: OnShakeListener
) {
this.mContext = context
this.mIntervalTimeMillis = intervalTimeMillis
this.mThresholdCount = thresholdCount
this.mShakeThreshold = shakeThreshold
this.mOnShakeListener = onShakeListener
mSensorManager = mContext.getSystemService(Context.SENSOR_SERVICE) as SensorManager
mVibrator = mContext.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
mSensorManager?.registerListener(
this,
mSensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL
)
}
override fun onSensorChanged(event: SensorEvent) {
//加速度变化
if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
val currentTimeMillis = System.currentTimeMillis()
//摇晃时间大于1500
if (currentTimeMillis - mLastShakeTimeMillis > mIntervalTimeMillis) {
mShakeCount = 0
}
val values = event.values
if (abs(values[0]) > mShakeThreshold || abs(values[1]) > mShakeThreshold || abs(values[2]) > mShakeThreshold) {
mLastShakeTimeMillis = currentTimeMillis
mShakeCount += 1
if (mShakeCount > mThresholdCount) {
mVibrator?.vibrate(100)
mShakeCount = 0
mLastShakeTimeMillis = 0
mOnShakeListener?.onShaked()
}
}
}
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
interface OnShakeListener {
fun onShaked()
}
}
图片
接下来摇晃手机,触发摇一摇机制,字体变红
图片
完整代码:
<?xml versinotallow="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.TestActivity">
<TextView
android:id="@+id/tv_shake"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="请摇晃手机"
android:textColor="@color/black"
android:textSize="20sp" />
</LinearLayout>
class TestActivity : AppCompatActivity() {
private val TAG = TestActivity::class.java.simpleName
private lateinit var mBinding: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityTestBinding.inflate(layoutInflater)
setContentView(mBinding.root)
ShakeManager(this, 1500, 2, 15, object : ShakeManager.OnShakeListener {
override fun onShaked() {
mBinding.tvShake.text = "触发了摇一摇"
mBinding.tvShake.setTextColor(0xFFFF0000.toInt())
}
})
}
}
随着技术发展,结合设备传感器,可以开发出更多有趣和实用的应用。