마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Drag&Drop 관련 질문드립니다 [closed]

0 추천

안녕하십니까 선배님들

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()
    }
}

 

질문을 종료한 이유: 터치이벤트로 구현 완료
개린쓰 (680 포인트) 님이 2023년 6월 22일 질문
개린쓰님이 2023년 6월 23일 closed
...