안녕하세요. 이번 포스팅에서는 특정 이벤트가 발생한 것을 사용자에게 인지시켜주는 방법 중 하나인 진동을 구현해보도록 하겠습니다.
아래의 TODO TASK의 순서대로 진행하는 예제입니다.
TODO TASK
1. 진동을 사용하기 위한 권한 추가
2. VibratorManager를 이용한 진동발생 클래스 구현
3. 버튼을 클릭하였을 때 SnackBar와 함께 진동 구현
4. 진동 List를 만들어 여러번 울리는 진동 구현
5. <P.S> Coroutine으로 비동기 처리
본문👀
진동을 사용하기 위한 권한 추가
<AndroidManifest.xml>
<uses-permission android:name="android.permission.VIBRATE" />
VibratorManager를 이용한 진동발생 클래스 구현
안드로이드 SDK 버전 31부터 VIBRATOR_SERVICE가 deprecated 되어 버전별 대응을 해줍니다.
import android.content.Context
import android.content.Context.VIBRATOR_SERVICE
import android.os.Build
import android.os.VibrationEffect
import android.os.Vibrator
import android.os.VibratorManager
class MakeVibrator {
private lateinit var vib: Vibrator
fun init(context: Context) {
vib = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val vibratorManager =
context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
vibratorManager.defaultVibrator
} else {
@Suppress("DEPRECATION")
context.getSystemService(VIBRATOR_SERVICE) as Vibrator
}
}
fun make(time: Long) {
vib.vibrate(
VibrationEffect.createOneShot(
time,
VibrationEffect.DEFAULT_AMPLITUDE,
)
)
}
}
버튼을 클릭하였을 때 SnackBar와 함께 진동 구현
// 진동을 한번 울림
private fun vibrateSingle() {
MakeVibrator().run {
init(this@MainActivity)
make(200)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btn: Button = findViewById(R.id.btn)
val layout: ConstraintLayout = findViewById(R.id.layout_main)
btn.setOnClickListener {
vibrateSingle()
Snackbar.make(this, layout, "완료 메시지", Snackbar.LENGTH_SHORT).show()
}
}
진동 List를 만들어 여러번 울리는 진동 구현
// 진동을 설정한 배열의 수와 길이만큼 울림
private fun vibrateArray() {
MakeVibrator().run {
init(this@MainActivity)
longArrayOf(100, 100, 100).forEach {
make(it)
Thread.sleep(100)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btn: Button = findViewById(R.id.btn)
val layout: ConstraintLayout = findViewById(R.id.layout_main)
btn.setOnClickListener {
vibrateArray()
Snackbar.make(this, layout, "완료 메시지", Snackbar.LENGTH_SHORT).show()
}
}
<P.S> Coroutine으로 비동기 처리
실행해보면 진동이 모두 울린 후에 Snackbar가 생성됩니다. Thread.sleep(100) 이부분이 해당 스레드를 일시정지 시켜 메인 스레드를 점유하는 현상이 발생하기 때문입니다. 따라서 비동기 처리를 해주어 Snackbar와 별개의 스레드에서 동시에 작업을 완료 할 수도 있습니다. 저는 Coroutine을 이용하였습니다. 참고만 해주시면 되겠습니다.
// 진동을 설정한 배열의 수와 길이만큼 울림
private fun vibrateArray() {
CoroutineScope(Dispatchers.Default).launch {
MakeVibrator().run {
init(this@MainActivity)
longArrayOf(100, 100, 100).forEach {
make(it)
delay(100)
}
}
}
}
이렇게 안드로이드 스튜디오에서 진동을 구현하는 방법에대해 알아보았습니다. 다른 궁금한 점이나 더 좋은 방법이 있다면 댓글 부탁드립니다. 감사합니다.
소스코드
https://github.com/tekken5953/VibratorExam/tree/master
'Android' 카테고리의 다른 글
[안드로이드] 안드로이드 스튜디오 버전 다운그레이드 하기! (1) | 2023.03.24 |
---|---|
[안드로이드] Transition - 자연스러운 화면 연결 애니메이션 (0) | 2023.02.28 |
[안드로이드] 앱 강제 재시작하는 방법! (0) | 2023.02.15 |
[안드로이드] 에러 'Inconsistency detected. Invalid view holder adapter positionViewHolder' 해결 (0) | 2023.02.02 |
[안드로이드] WifiManager로 연결 가능한 와이파이 검색하기 (0) | 2023.01.30 |