Android應(yīng)用開發(fā)簡(jiǎn)單幾步實(shí)現(xiàn)搖一搖功能
作者:Reathin
在某些緊急情況下,搖一搖功能可以作為一種快速提醒方式。例如,在遇到危險(xiǎn)或緊急狀況時(shí),用戶可以快速搖動(dòng)手機(jī)來觸發(fā)警報(bào)或發(fā)送求救信號(hào)。
微信搖一搖,抖音搖一搖面對(duì)面搖骰子等,手機(jī)APP搖一搖功能隨處可見,下面我們來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的搖一搖功能。
基本原理
- 利用加速度傳感器檢測(cè)設(shè)備的物理運(yùn)動(dòng)
- 監(jiān)聽傳感器的數(shù)據(jù)用作搖一搖動(dòng)作判定
- 根據(jù)設(shè)定的條件觸發(fā)搖一搖事件
常見應(yīng)用場(chǎng)景:
- 「音樂和視頻控制」:許多音樂和視頻應(yīng)用利用搖一搖功能來控制播放、暫停、下一曲等操作。用戶只需搖動(dòng)手機(jī),即可實(shí)現(xiàn)快速切換歌曲或視頻的功能。
- 「拍照」:一些相機(jī)應(yīng)用使用搖一搖功能來快速拍照或切換前后攝像頭。通過搖動(dòng)手機(jī),用戶可以快速完成拍照過程,無需多余的操作步驟。
- 「啟動(dòng)應(yīng)用或功能」:搖一搖功能也可以用于啟動(dòng)特定的應(yīng)用或功能。例如,健康追蹤應(yīng)用可能允許用戶通過搖動(dòng)手機(jī)來快速查看計(jì)步器或運(yùn)動(dòng)數(shù)據(jù)。
- 「游戲控制」:在某些游戲中,搖一搖功能可以作為游戲控制方式之一。玩家可以通過搖動(dòng)手機(jī)來控制角色的移動(dòng)或執(zhí)行特定動(dòng)作,提供更直觀的控制方式。
- 「社交分享」:一些社交應(yīng)用利用搖一搖功能來快速分享內(nèi)容到其他平臺(tái)。用戶只需搖動(dòng)手機(jī),即可將內(nèi)容自動(dòng)分享到指定的社交媒體平臺(tái)。
- 「觸發(fā)緊急通知」:在某些緊急情況下,搖一搖功能可以作為一種快速提醒方式。例如,在遇到危險(xiǎn)或緊急狀況時(shí),用戶可以快速搖動(dòng)手機(jī)來觸發(fā)警報(bào)或發(fā)送求救信號(hào)。
代碼示例
「實(shí)現(xiàn)效果」:在1.5s內(nèi)出現(xiàn)兩次加速度達(dá)到15則觸發(fā)搖一搖
class ShakeManager : SensorEventListener {
private var mContext: Context
/**
* 時(shí)間范圍
*/
private var mIntervalTimeMillis: Long = 15000
/**
* 要換次數(shù)閾值
*/
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
/**
* 上一次搖晃時(shí)間
*/
private var mLastShakeTimeMillis: Long = 0
/**
* 搖晃次數(shù)
*/
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()
//搖晃時(shí)間大于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()
}
}
圖片
接下來搖晃手機(jī),觸發(fā)搖一搖機(jī)制,字體變紅
圖片
完整代碼:
<?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="請(qǐng)搖晃手機(jī)"
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 = "觸發(fā)了搖一搖"
mBinding.tvShake.setTextColor(0xFFFF0000.toInt())
}
})
}
}
隨著技術(shù)發(fā)展,結(jié)合設(shè)備傳感器,可以開發(fā)出更多有趣和實(shí)用的應(yīng)用。
責(zé)任編輯:武曉燕
來源:
沐雨花飛蝶