안녕하십니까 선배님들
Drag&Drop 구현중에 궁금한게 잇어서 질문드립니다.
제가 원하는 결과물은 btnO, btnX 두개의 버튼중 o버튼을 드롭 영역에 드롭하면 정상작동,
btnX나 드롭 영역에 드롭하지 않앗을 경우 mediaPlayer와 함께 위치가 초기화 되는 코드를 작성중입니다.
드래그될 때 View의 속성을 INVISIBLE로 변경해 이미지 자체가 움직이는 효과를 주고싶은대 이러한 방법을 사용하면 터치 이벤트가 발생될때마다 뷰가 사라져서 돌아오지 않습니다...
해결방법을 알려주실 수 잇나요?
class LastGameActivity : AppCompatActivity(), OnDialogClose {
private lateinit var binding : ActivityLastGameBinding
private var mediaPlayerManager: MediaPlayerManager = MediaPlayerManager.getInstance(this)
private var defaultDrawable : Drawable? = null
private var isSpecialImageViewDropped = false
private var isDragging = false
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityLastGameBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
setContentView(binding.root)
val animation : Animation = AnimationUtils.loadAnimation(this,R.anim.step_anim)
// MediaPlayerManager를 사용하여 음악 재생을 관리합니다
mediaPlayerManager.addAudioToQueue(R.raw.step1_04_quiz5_q)
mediaPlayerManager.addAudioToQueue(R.raw.step1_04_quiz5_b1){
binding.btnLastX.startAnimation(animation)
}
mediaPlayerManager.addAudioToQueue(R.raw.step1_04_quiz5_b2){
binding.btnLastO.startAnimation(animation)
}
mediaPlayerManager.play()
/* // 음악 재생이 완료되면 버튼을 활성화합니다
mediaPlayerManager.setOnCompletionListener {
binding.btnLastO.isEnabled = true
binding.btnLastX.isEnabled = true
}*/
// 특정 이미지뷰에 대한 드래그 터치 리스너를 설정합니다
binding.btnLastX.setOnTouchListener(DragTouchListener())
binding.btnLastO.setOnTouchListener(DragTouchListener())
// 드롭 영역에 대한 드래그 리스너를 설정합니다
binding.imgLastBack.setOnDragListener(DragListener())
// O 버튼 단순 클릭 시 효과음을 재생합니다
binding.btnLastO.setOnClickListener {
if (!isDragging) {
mediaPlayerManager.clearQueueAndPlay(R.raw.comm_fb_wrong3)
Log.d("btnO", "stop()")
}
}
// X 버튼 단순 클릭 시 효과음을 재생합니다
binding.btnLastX.setOnClickListener {
if (!isDragging) {
mediaPlayerManager.clearQueueAndPlay(R.raw.comm_fb_wrong3)
Log.d("btnX", "stop()")
}
}
defaultDrawable = binding.imgLastBack.background
}
inner class DragTouchListener : View.OnTouchListener{
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
when(motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
Log.d("motion", "start()")
val data = ClipData.newPlainText("","")
val shadowBuilder = View.DragShadowBuilder(view)
view.startDragAndDrop(data, shadowBuilder, view, 0)
view.visibility = View.VISIBLE
isDragging = true
return true
}
/*MotionEvent.ACTION_MOVE ->{
val data = ClipData.newPlainText("","")
val shadowBuilder = View.DragShadowBuilder(view)
view.startDragAndDrop(data, shadowBuilder, view, 0)
view.visibility = View.VISIBLE
isDragging = true
return true
}*/
MotionEvent.ACTION_UP -> {
Log.d("motion", "up()")
// 클릭 이벤트를 수행하지 않고 드래그만 처리합니다
view.performClick()
return false
}
else -> return false
}
}
}
inner class DragListener : View.OnDragListener {
private val defaultX: Float = binding.imgLastBack.x
private val defaultY: Float = binding.imgLastBack.y
override fun onDrag(view: View?, dragEvent: DragEvent): Boolean {
when (dragEvent.action) {
DragEvent.ACTION_DRAG_STARTED -> return true
DragEvent.ACTION_DRAG_ENTERED -> {
return true
}
DragEvent.ACTION_DRAG_EXITED -> {
return true
}
DragEvent.ACTION_DROP -> {
val droppedView = dragEvent.localState as View
if (droppedView == binding.btnLastO) {
isSpecialImageViewDropped = true
if(isSpecialImageViewDropped){
binding.imgLastBack.setImageResource(R.drawable.step5_2_4_p5_images_ok)
binding.btnLastO.visibility = View.VISIBLE
binding.btnLastX.visibility = View.VISIBLE
}
mediaPlayerManager.clearQueueAndPlay(R.raw.comm_sfx_correct) {
mediaPlayerManager.addAudioToQueue(R.raw.comm_result_good) {
val dialog = CustomDialog(
this@LastGameActivity,
this@LastGameActivity,
R.drawable.step5_popup_images,
R.string.page5_popup_string,
R.raw.step1_04_quiz5_e
)
dialog.myDig()
}
}
} else {
Log.d("Drag fail","afadsafsfdsaf")
handleInvalidDropLocation()
}
isDragging = false
return true
}
else -> return false
}
}
private fun handleInvalidDropLocation() {
if (!isSpecialImageViewDropped) {
mediaPlayerManager.clearQueueAndPlay(R.raw.comm_sfx_incorrect){
mediaPlayerManager.addAudioToQueue(R.raw.comm_fb_wrong3)
}
}
isSpecialImageViewDropped = false
// 잘못된 위치에 드롭되었을 때 이미지뷰를 보이도록 처리합니다
//binding.imgLastBack.visibility = View.VISIBLE
binding.btnLastO.visibility = View.VISIBLE
binding.btnLastX.visibility = View.VISIBLE
}
}
override fun onDialogClose() {
// 다이얼로그 닫힘 이벤트가 발생했을 때 처리할 작업을 수행합니다
val dialogEnd = CustomDialog(this,this,R.drawable.ending_character_1,
R.string.page5_ending_string,R.raw.comm_result_good,
showpopupback = false,
showEndBack = true,
showReplay = true
)
dialogEnd.myDig()
}
override fun onPause() {
super.onPause()
// 액티비티가 일시 정지될 때 MediaPlayerManager를 정지합니다
mediaPlayerManager.stop()
}
override fun onDestroy() {
super.onDestroy()
// 액티비티가 종료될 때 MediaPlayerManager를 정지합니다
mediaPlayerManager.stop()
}
}