728x90

✔ 실로폰 기능
- 가로 화면으로 고정된 액티비티에 각 음계에 해당되는 음판을 배치한다.
- 음판을 누르면 해당 음이 재생된다.
✔ SoundPool 사용
✔ 소스코드
◾ activity_main.xml
- 8개의 음판 배치
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/do1"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="#FF0000"
android:gravity="center"
android:text="도"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/re"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/re"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="24dp"
android:background="@android:color/holo_orange_dark"
android:gravity="center"
android:text="레"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/mi"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/do1"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/mi"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="32dp"
android:layout_marginBottom="32dp"
android:background="@android:color/holo_orange_light"
android:gravity="center"
android:text="미"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/fa"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/re"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/fa"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="40dp"
android:layout_marginBottom="40dp"
android:background="@android:color/holo_green_light"
android:gravity="center"
android:text="파"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/sol"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/mi"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/sol"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="48dp"
android:layout_marginBottom="48dp"
android:background="@android:color/holo_blue_light"
android:gravity="center"
android:text="솔"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/la"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/fa"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/la"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="56dp"
android:layout_marginBottom="56dp"
android:background="@android:color/holo_blue_dark"
android:gravity="center"
android:text="라"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/si"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/sol"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/si"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="64dp"
android:layout_marginBottom="64dp"
android:background="@android:color/holo_purple"
android:gravity="center"
android:text="시"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/do2"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/la"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/do2"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="72dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="72dp"
android:background="@android:color/holo_red_dark"
android:gravity="center"
android:text="도"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/si"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
◾ MainActivity.kt
- 가로 모드로 고정하기 위해서 아래 코드 사용
requestedOrientation=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
- AndroidManifest.xml에서도 변경 가능하다.
<activity android:name=".MainActivity android:screenOrientation="landscape">
- 실로폰 소리 다운로드 -> soundPool 사용
- 앱 종료 시, 반드시 release() 메소드 호출하여 soundPool 객체의 자원을 해제시켜주기!!
package com.example.xylophone
import android.content.pm.ActivityInfo
import android.media.SoundPool
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class MainActivity : AppCompatActivity() {
private val soundPool=SoundPool.Builder().setMaxStreams(8).build()
private val sounds= listOf(
Pair(R.id.do1,R.raw.do1),
Pair(R.id.re,R.raw.re),
Pair(R.id.mi,R.raw.mi),
Pair(R.id.fa,R.raw.fa),
Pair(R.id.sol,R.raw.sol),
Pair(R.id.la,R.raw.la),
Pair(R.id.si,R.raw.si),
Pair(R.id.do2,R.raw.do2)
)
override fun onCreate(savedInstanceState: Bundle?) {
//화면이 가로 모드로 고정되게 하기
//requestedOrientation=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sounds.forEach {turn(it)}
}
private fun turn(pair: Pair<Int, Int>){
val soundId=soundPool.load(this, pair.second,1)
findViewById<TextView>(pair.first).setOnClickListener {
soundPool.play(soundId,1.0F,1.0f,0,0,1.0f)
}
}
override fun onDestroy() {
super.onDestroy()
soundPool.release()
}
}
728x90
'Android > Kotlin' 카테고리의 다른 글
Kotlin Realm DB 사용시 발생한 오류 해결하기 (0) | 2021.02.03 |
---|---|
SQLite에서의 데이터 베이스 구축 (0) | 2021.01.28 |
Kotlin 수평측정기 만들기 (0) | 2021.01.22 |
Kotlin 나만의 웹브라우저 만들기 (0) | 2021.01.22 |
Kotlin 타이머 만들기 (0) | 2021.01.18 |